From 3d8398fd21549991a40be919bf77606d2afb8b43 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 4 Nov 2019 18:02:00 -0500 Subject: [PATCH 001/553] Trialing some things for the feed comparison. --- .../version/FeedVersionNavigator.js | 20 +++++++++++ .../components/version/FeedVersionTabs.js | 35 ++++++++++++++----- .../components/version/FeedVersionViewer.js | 2 ++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 8bac17fc9..643d3b42b 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -149,7 +149,10 @@ export default class FeedVersionNavigator extends Component { versionSection } = this.props const {feedVersions: versions} = feedSource + const comparedVersionIndex = feedVersionIndex - 1; + if (!versions) return null + const nothingToCompare = (versions.length < 2); if (typeof feedVersionIndex === 'undefined') return null const version = hasVersions && versions[feedVersionIndex - 1] @@ -211,7 +214,22 @@ export default class FeedVersionNavigator extends Component { onClick={this._incrementVersion}> + + {/* Previous Version Selector Dropdown */} + + 0 ? `Comparing to: ${this.messages('version')} ${comparedVersionIndex}` : ``} + disabled={comparedVersionIndex == 0} + > + {versions.map((version, k) => { + k = k + 1 + return = feedVersionIndex}>{k}. {version.name} + })} + + } @@ -295,6 +313,7 @@ export default class FeedVersionNavigator extends Component { exportVersionShapes={exportVersionShapes} feedSource={feedSource} feedVersionIndex={feedVersionIndex} + comparedVersionIndex={comparedVersionIndex} fetchGTFSEntities={fetchGTFSEntities} fetchValidationErrors={fetchValidationErrors} gtfs={gtfs} @@ -311,6 +330,7 @@ export default class FeedVersionNavigator extends Component { renameFeedVersion={renameFeedVersion} user={user} version={this.props.version} + comparedVersion={versions[comparedVersionIndex - 1]} versionSection={versionSection || null} versions={versions} /> diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 29c1d8df8..54f2b9a75 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -2,7 +2,7 @@ import moment from 'moment' import React, {Component} from 'react' -import {Row, Col, Tabs, Tab, ListGroupItem} from 'react-bootstrap' +import {Row, Col, Tabs, Tab, ListGroupItem, Label, Badge} from 'react-bootstrap' import numeral from 'numeral' import {getComponentMessages, isModuleEnabled} from '../../../common/util/config' @@ -20,11 +20,13 @@ import type {FeedVersion} from '../../../types' type Props = { feedVersionIndex: number, + comparedVersionIndex: number, isochroneBand: any, onChangeIsochroneBand: number => void, selectTab: string => void, tab: string, - version: FeedVersion + version: FeedVersion, + comparedVersion: FeedVersion } export default class FeedVersionTabs extends Component { @@ -69,10 +71,12 @@ export default class FeedVersionTabs extends Component { render () { const { feedVersionIndex, + comparedVersionIndex, isochroneBand, onChangeIsochroneBand, tab, - version + version, + comparedVersion } = this.props const tableOptions = { striped: true, @@ -87,7 +91,7 @@ export default class FeedVersionTabs extends Component { const timeTableOptions = {...tableOptions} // Add default page zie for timetable options timeTableOptions.options = {...timeTableOptions.options, sizePerPage: 50} - const countFields = ['agencyCount', 'routeCount', 'stopCount', 'tripCount', 'stopTimesCount'] + const countFields = ['agencyCount', 'routeCount', 'stopCount', 'tripCount', 'stopTimesCount', 'errorCount'] const daysActive = moment(version.validationSummary.endDate) .diff(moment(version.validationSummary.startDate), 'days') return ( @@ -101,16 +105,31 @@ export default class FeedVersionTabs extends Component { unmountOnExit> - {countFields.map(c => ( + {countFields.map(c => { + const summary = version.validationSummary; + const diff = comparedVersion ? (summary[c] - comparedVersion.validationSummary[c]) : 0; + + return (

- {numeral(version.validationSummary[c]).format('0 a')} + {numeral(summary[c]).format('0a ')} + + {comparedVersion ? + + : null}

{this.messages(c)}

- ))} + ); + })}

} From d566f98a852838c7544d809254e52b9543d13a8e Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 26 Nov 2019 10:28:49 -0500 Subject: [PATCH 002/553] feat(Select compared version): User can pick another (older) feed version to compare stats to the se --- lib/gtfs/reducers/filter.js | 6 +++ lib/manager/actions/versions.js | 22 ++++++++ .../version/FeedVersionNavigator.js | 23 ++++++-- .../components/version/FeedVersionTabs.js | 52 ++++++++++--------- .../components/version/FeedVersionViewer.js | 4 +- .../containers/ActiveFeedVersionNavigator.js | 13 ++++- lib/types/reducers.js | 1 + 7 files changed, 87 insertions(+), 34 deletions(-) diff --git a/lib/gtfs/reducers/filter.js b/lib/gtfs/reducers/filter.js index 8ffb6547e..ea56269ee 100644 --- a/lib/gtfs/reducers/filter.js +++ b/lib/gtfs/reducers/filter.js @@ -8,6 +8,7 @@ import type {FilterState} from '../../types/reducers' export const defaultState = { activeFeeds: {}, + comparedVersion: null, dateTimeFilter: { date: moment().format('YYYYMMDD'), from: 0, // 12 AM @@ -50,11 +51,16 @@ const gtfsFilter = (state: FilterState = defaultState, action: Action): FilterSt }) case 'SET_ACTIVE_FEEDVERSION': return update(state, { + comparedVersion: {$set: action.payload ? action.payload.previousVersionId : null}, showAllRoutesOnMap: {$set: false}, patternFilter: {$set: null}, routeFilter: {$set: null}, version: {$set: action.payload ? action.payload.id : null} }) + case 'SET_COMPARED_FEEDVERSION': + return update(state, { + comparedVersion: {$set: action.payload ? action.payload.id : null} + }) case 'UPDATE_GTFS_MAP_STATE': return update(state, {map: {$set: action.payload}}) case 'UPDATE_GTFS_PERMISSION_FILTER': diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index c1969ba2c..0e1542cf6 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -115,6 +115,17 @@ export function setActiveVersion (version: FeedVersion) { } } } +// setComparedVersion used in components +export const settingComparedVersion = createAction( + 'SET_COMPARED_FEEDVERSION', + (payload: FeedVersion) => payload +) +export function setComparedVersion (version: FeedVersion) { + return function (dispatch: dispatchFn, getState: getStateFn) { + // Dispatch action to set value in reducer. + dispatch(settingComparedVersion(version)) + } +} const uploadingFeed = createVoidPayloadAction('UPLOADING_FEED') export type VersionActions = ActionType | @@ -613,6 +624,17 @@ export function setVersionIndex ( } } +export function setComparedVersionIndex ( + feed: Feed, + index: number +) { + return function (dispatch: dispatchFn, getState: getStateFn) { + if (feed.feedVersions) { + dispatch(setComparedVersion(feed.feedVersions[index - 1])) + } + } +} + /** * Starts the export shapes server job for a particular feed version. * diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 643d3b42b..c7faf8650 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -24,6 +24,7 @@ import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types' import type {GtfsState, ManagerUserState} from '../../../types/reducers' type Props = ContainerProps & { + comparedVersionIndex: number, createDeploymentFromFeedSource: typeof deploymentActions.createDeploymentFromFeedSource, deleteFeedVersion: typeof versionsActions.deleteFeedVersion, downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken, @@ -42,6 +43,7 @@ type Props = ContainerProps & { publishFeedVersion: typeof versionsActions.publishFeedVersion, renameFeedVersion: typeof versionsActions.renameFeedVersion, runFetchFeed: typeof feedsActions.runFetchFeed, + setComparedVersionIndex: typeof versionsActions.setComparedVersionIndex, setVersionIndex: typeof versionsActions.setVersionIndex, sortedVersions: Array, uploadFeed: typeof versionsActions.uploadFeed, @@ -121,12 +123,19 @@ export default class FeedVersionNavigator extends Component { } } + _onSelectComparedVersion = (index: number) => { + if (index !== this.props.comparedVersionIndex) { + this.props.setComparedVersionIndex(this.props.feedSource, index) + } + } + render () { const versionTitleStyle = { fontSize: '24px', fontWeight: 'bold' } const { + comparedVersionIndex, deleteDisabled, deleteFeedVersion, disabled, @@ -149,10 +158,8 @@ export default class FeedVersionNavigator extends Component { versionSection } = this.props const {feedVersions: versions} = feedSource - const comparedVersionIndex = feedVersionIndex - 1; if (!versions) return null - const nothingToCompare = (versions.length < 2); if (typeof feedVersionIndex === 'undefined') return null const version = hasVersions && versions[feedVersionIndex - 1] @@ -221,11 +228,17 @@ export default class FeedVersionNavigator extends Component { href='#' id='prevVersionSelector' title={comparedVersionIndex > 0 ? `Comparing to: ${this.messages('version')} ${comparedVersionIndex}` : ``} - disabled={comparedVersionIndex == 0} - > + disabled={comparedVersionIndex === 0} + onSelect={this._onSelectComparedVersion}> {versions.map((version, k) => { k = k + 1 - return = feedVersionIndex}>{k}. {version.name} + if (k >= feedVersionIndex) { + return ( + + {k}. (Cannot compare with self or more recent) + + ) + } else return {k}. {version.name} })} diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 54f2b9a75..86a094a2d 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -2,7 +2,7 @@ import moment from 'moment' import React, {Component} from 'react' -import {Row, Col, Tabs, Tab, ListGroupItem, Label, Badge} from 'react-bootstrap' +import {Row, Col, Tabs, Tab, ListGroupItem, Label} from 'react-bootstrap' import numeral from 'numeral' import {getComponentMessages, isModuleEnabled} from '../../../common/util/config' @@ -19,14 +19,14 @@ import type {Element} from 'react' import type {FeedVersion} from '../../../types' type Props = { - feedVersionIndex: number, + comparedVersion: FeedVersion, comparedVersionIndex: number, + feedVersionIndex: number, isochroneBand: any, onChangeIsochroneBand: number => void, selectTab: string => void, tab: string, - version: FeedVersion, - comparedVersion: FeedVersion + version: FeedVersion } export default class FeedVersionTabs extends Component { @@ -106,30 +106,32 @@ export default class FeedVersionTabs extends Component { {countFields.map(c => { - const summary = version.validationSummary; - const diff = comparedVersion ? (summary[c] - comparedVersion.validationSummary[c]) : 0; + const summary = version.validationSummary + const diff = comparedVersion ? (summary[c] - comparedVersion.validationSummary[c]) : 0 return ( - -

- {numeral(summary[c]).format('0a ')} + +

+ {numeral(summary[c]).format('0a')} + {comparedVersion + ? + + + : null} - {comparedVersion ? - - : null} -

-

{this.messages(c)}

- - ); - })} +
+ +

{this.messages(c)}

+ + ) + })}

} diff --git a/lib/manager/containers/ActiveFeedVersionNavigator.js b/lib/manager/containers/ActiveFeedVersionNavigator.js index 1f5ff2ac1..cd07b4819 100644 --- a/lib/manager/containers/ActiveFeedVersionNavigator.js +++ b/lib/manager/containers/ActiveFeedVersionNavigator.js @@ -15,6 +15,7 @@ import { mergeVersions, publishFeedVersion, renameFeedVersion, + setComparedVersionIndex, setVersionIndex, uploadFeed } from '../actions/versions' @@ -39,7 +40,7 @@ export type Props = { } const mapStateToProps = (state: AppState, ownProps: Props) => { - let feedVersionIndex + let feedVersionIndex, comparedVersionIndex const {routeParams, feedSource} = ownProps const {feedVersions} = feedSource const {feedVersionIndex: fvi, subpage} = routeParams @@ -63,7 +64,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { ? feedVersions.sort(versionsLastUpdatedComparator) : [] - let version + let version, comparedVersion if ( hasVersions && @@ -72,15 +73,22 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { feedVersions.length >= feedVersionIndex ) { version = sortedVersions[feedVersionIndex - 1] + + if (gtfs.filter.comparedVersion) { + comparedVersionIndex = sortedVersions.findIndex(feedVer => feedVer.id === gtfs.filter.comparedVersion) + 1 + comparedVersion = sortedVersions[comparedVersionIndex - 1] + } } return { gtfs, hasVersions, feedVersionIndex, + comparedVersionIndex, gtfsPlusValidation: state.gtfsplus.validation, sortedVersions, user: state.user, version, + comparedVersion, versionIndexDoesNotExist, versionSection: subpage } @@ -101,6 +109,7 @@ const mapDispatchToProps = { publishFeedVersion, renameFeedVersion, runFetchFeed, + setComparedVersionIndex, setVersionIndex, uploadFeed } diff --git a/lib/types/reducers.js b/lib/types/reducers.js index ee4828290..aad63eb90 100644 --- a/lib/types/reducers.js +++ b/lib/types/reducers.js @@ -281,6 +281,7 @@ export type DateTimeFilter = { export type FilterState = { activeFeeds: any, + comparedVersion: any, dateTimeFilter: DateTimeFilter, loadedFeeds: Array, map: MapFilter, From fde413bdba9aefd12c9a260345e7210e47da4600 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 10 Dec 2019 14:34:17 -0500 Subject: [PATCH 003/553] improvement(Validation stats): Move validation stats comparison from summary to validation link on t --- .../components/version/FeedVersionTabs.js | 6 +- .../components/version/FeedVersionViewer.js | 33 +++++++-- yarn.lock | 71 +++++++++++++++++-- 3 files changed, 96 insertions(+), 14 deletions(-) diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 86a094a2d..4f51ff18c 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -91,7 +91,7 @@ export default class FeedVersionTabs extends Component { const timeTableOptions = {...tableOptions} // Add default page zie for timetable options timeTableOptions.options = {...timeTableOptions.options, sizePerPage: 50} - const countFields = ['agencyCount', 'routeCount', 'stopCount', 'tripCount', 'stopTimesCount', 'errorCount'] + const countFields = ['agencyCount', 'routeCount', 'stopCount', 'tripCount', 'stopTimesCount' /*, 'errorCount'*/] const daysActive = moment(version.validationSummary.endDate) .diff(moment(version.validationSummary.startDate), 'days') return ( @@ -119,9 +119,9 @@ export default class FeedVersionTabs extends Component { ? : null} diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 0be858220..fb2a6f123 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -4,6 +4,7 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import { Row, Col, Panel, Label, Glyphicon, ListGroup, ListGroupItem } from 'react-bootstrap' import { LinkContainer } from 'react-router-bootstrap' +import numeral from 'numeral' import * as plusActions from '../../../gtfsplus/actions/gtfsplus' import * as versionsActions from '../../actions/versions' @@ -63,6 +64,7 @@ export default class FeedVersionViewer extends Component { newNotePosted, notesRequested, version, + comparedVersion, versions, versionSection, user @@ -91,6 +93,7 @@ export default class FeedVersionViewer extends Component { @@ -128,11 +131,12 @@ type SelectorProps = { feedVersionIndex: number, gtfsPlusValidation: GtfsPlusValidation, version: FeedVersion, + comparedVersion: FeedVersion, versionSection: ?string } class VersionSectionSelector extends Component { - _renderIssuesLabel (version) { + _renderIssuesLabel (version, comparedVersion) { const tableFatalExceptions = getTableFatalExceptions(version) const {validationSummary, feedLoadResult} = version const hasCriticalError = validationSummary.loadStatus !== 'SUCCESS' || @@ -146,11 +150,26 @@ class VersionSectionSelector extends Component { const text = hasCriticalError ? 'critical error' : validationSummary.errorCount + const diff = comparedVersion + ? validationSummary.errorCount - comparedVersion.validationSummary.errorCount + : 0 + const diffColor = diff > 0 ? 'danger' : (diff < 0 ? 'success' : 'default') + const diffText = comparedVersion + ? diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) + : '' return ( - - ) + + + {comparedVersion + ? + : '' + } + + ) } _getGtfsPlusIssueCount = (gtfsPlusValidation: GtfsPlusValidation) => { @@ -177,7 +196,7 @@ class VersionSectionSelector extends Component { } render () { - const { version } = this.props + const { version, comparedVersion } = this.props return ( @@ -190,7 +209,7 @@ class VersionSectionSelector extends Component { to={`/feed/${version.feedSource.id}/version/${this.props.feedVersionIndex}/issues`} active={this.props.versionSection === 'issues'}> - Validation issues {this._renderIssuesLabel(version)} + Validation issues {this._renderIssuesLabel(version, comparedVersion)} {isModuleEnabled('gtfsplus') diff --git a/yarn.lock b/yarn.lock index 05a99cee5..773d58143 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6045,6 +6045,13 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.3.2" +hoist-non-react-statics@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -6195,7 +6202,19 @@ iconv-lite@0.4.8: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.8.tgz#c6019a7595f2cefca702eab694a010bcd9298d20" integrity sha1-xgGadZXyzvynAuq2lKAQvNkpjSA= -idtoken-verifier@^1.0.1, idtoken-verifier@^1.1.0, idtoken-verifier@^1.2.0: +idtoken-verifier@^1.0.1, idtoken-verifier@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-1.4.1.tgz#032d7720fdd091830d22f694eb94b5f6644b0d3b" + integrity sha512-BoJc00Gj37hrNlx7NYmd8uJFvvC9/FiWDKugDluP4JmgOGT/AfNlPfnRmi9fHEEqSatnIIr3WTyf0dlhHfSHnA== + dependencies: + base64-js "^1.2.0" + crypto-js "^3.1.9-1" + jsbn "^0.1.0" + promise-polyfill "^8.1.3" + unfetch "^4.1.0" + url-join "^1.1.0" + +idtoken-verifier@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-1.2.0.tgz#4654f1f07ab7a803fc9b1b8b36057e2a87ad8b09" integrity sha512-8jmmFHwdPz8L73zGNAXHHOV9yXNC+Z0TUBN5rafpoaFaLFltlIFr1JkQa3FYAETP23eSsulVw0sBiwrE8jqbUg== @@ -10742,6 +10761,11 @@ promise-inflight@^1.0.1, promise-inflight@~1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-polyfill@^8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" + integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== + promise-retry@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" @@ -11273,6 +11297,11 @@ react-is@^16.3.2, react-is@^16.6.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA== +react-is@^16.7.0: + version "16.11.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" + integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== + react-is@^16.8.1, react-is@^16.8.4: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" @@ -11325,7 +11354,20 @@ react-pure-render@^1.0.2: resolved "https://registry.yarnpkg.com/react-pure-render/-/react-pure-render-1.0.2.tgz#9d8a928c7f2c37513c2d064e57b3e3c356e9fabb" integrity sha1-nYqSjH8sN1E8LQZOV7Pjw1bp+rs= -react-redux@^5.0.2, react-redux@^5.0.3: +react-redux@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57" + integrity sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q== + dependencies: + "@babel/runtime" "^7.1.2" + hoist-non-react-statics "^3.3.0" + invariant "^2.2.4" + loose-envify "^1.1.0" + prop-types "^15.6.1" + react-is "^16.6.0" + react-lifecycles-compat "^3.0.0" + +react-redux@^5.0.3: version "5.1.1" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg== @@ -11719,7 +11761,18 @@ reduce-reducers@^0.4.3: resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" integrity sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw== -redux-actions@^2.0.2, redux-actions@^2.2.1: +redux-actions@^2.0.2: + version "2.6.5" + resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.5.tgz#bdca548768ee99832a63910c276def85e821a27e" + integrity sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw== + dependencies: + invariant "^2.2.4" + just-curry-it "^3.1.0" + loose-envify "^1.4.0" + reduce-reducers "^0.4.3" + to-camel-case "^1.0.0" + +redux-actions@^2.2.1: version "2.6.4" resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.4.tgz#e1d9d7d987d274071b0134b707365d3e25ba3b26" integrity sha512-Gho+gnsvyR5h0pApoMdHLYssVEu4I0DNqyC91u43Xy/BvLrEddEMtukLF8oL3WXUy7DjxqKOKZHKmpKyN6hxlQ== @@ -13734,6 +13787,11 @@ underscore@~1.7.0: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= +unfetch@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" + integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -14159,7 +14217,12 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -winchan@^0.2.0, winchan@^0.2.1: +winchan@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/winchan/-/winchan-0.2.2.tgz#6766917b88e5e1cb75f455ffc7cc13f51e5c834e" + integrity sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ== + +winchan@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/winchan/-/winchan-0.2.1.tgz#19b334e49f7c07c0849f921f405fad87dfc8a1da" integrity sha512-QrG9q+ObfmZBxScv0HSCqFm/owcgyR5Sgpiy1NlCZPpFXhbsmNHhTiLWoogItdBUi0fnU7Io/5ABEqRta5/6Dw== From 0fdd8e648cc8fcc3e5b80cc8bf60d957b4329709 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 28 Jan 2020 14:56:12 -0500 Subject: [PATCH 004/553] fix: Remove instances of BsLabel in FeedVersionViewer; bump react-bootstrap to 0.33. --- .../components/version/FeedVersionViewer.js | 6 +- package.json | 2 +- yarn.lock | 121 +++++++++++++----- 3 files changed, 92 insertions(+), 37 deletions(-) diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 3ab1061bb..fb2a6f123 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -2,7 +2,7 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' -import { Row, Col, Panel, Label as BsLabel, Glyphicon, ListGroup, ListGroupItem } from 'react-bootstrap' +import { Row, Col, Panel, Label, Glyphicon, ListGroup, ListGroupItem } from 'react-bootstrap' import { LinkContainer } from 'react-router-bootstrap' import numeral from 'numeral' @@ -192,7 +192,7 @@ class VersionSectionSelector extends Component { : return issueCount === null ? - : {text} + : } render () { @@ -227,7 +227,7 @@ class VersionSectionSelector extends Component { active={this.props.versionSection === 'comments'}> Version comments{' '} - {version.noteCount} + diff --git a/package.json b/package.json index 83fe450ba..a262684f0 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "react": "^15.4.1", "react-addons-shallow-compare": "^15.4.1", "react-addons-update": "^15.4.1", - "react-bootstrap": "^0.30.0-rc.2", + "react-bootstrap": "^0.33", "react-bootstrap-datetimepicker": "^0.0.22", "react-bootstrap-table": "https://github.com/conveyal/react-bootstrap-table.git", "react-color": "^2.3.4", diff --git a/yarn.lock b/yarn.lock index f65d7f3a5..7b6115e57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -721,6 +721,14 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" +"@babel/runtime-corejs2@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.8.3.tgz#b62a61e0c41a90d2d91181fda6de21cecd3a9734" + integrity sha512-yxJXBKdIogkfF+wgeJrvU7Afp5ugBi92NzSgNPWWKVoQAlixH3gwMP6yYYr7SV1Dbc0HmNw7WUJkV5ksvtQuHg== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + "@babel/runtime-corejs2@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz#c3214c08ef20341af4187f1c9fbdc357fbec96b2" @@ -750,6 +758,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.6.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" @@ -1336,11 +1351,24 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/react@^16.9.11": + version "16.9.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.19.tgz#c842aa83ea490007d29938146ff2e4d9e4360c40" + integrity sha512-LJV97//H+zqKWMms0kvxaKYJDG05U2TtQB3chRLF8MPNs+MQh/H1aGlyDUxjaHvu08EAGerdX2z4LTBc7ns77A== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -3805,6 +3833,11 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.6.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" + integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -4183,7 +4216,7 @@ dom-helpers@3.2.1: resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" integrity sha1-MgPgf+0he9H0JLAZc1WC/Deyglo= -"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.2.0, dom-helpers@^3.3.1, dom-helpers@^3.4.0: +"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.3.1, dom-helpers@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== @@ -7563,7 +7596,7 @@ jwt-decode@^2.1.0: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= -keycode@^2.1.2: +keycode@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= @@ -10789,6 +10822,14 @@ promzard@^0.3.0: dependencies: read "1" +prop-types-extra@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" @@ -11175,20 +11216,22 @@ react-bootstrap-datetimepicker@^0.0.22: classnames "^2.1.2" react-modal "^1.4.0" -react-bootstrap@^0.30.0-rc.2: - version "0.30.10" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.30.10.tgz#dbba6909595f2af4d91937db0f96ec8c2df2d1a8" - integrity sha1-27ppCVlfKvTZGTfbD5bsjC3y0ag= +react-bootstrap@^0.33: + version "0.33.1" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.33.1.tgz#e072592aa143b9792526281272eca754bc9a4940" + integrity sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ== dependencies: - babel-runtime "^6.11.6" + "@babel/runtime-corejs2" "^7.0.0" classnames "^2.2.5" dom-helpers "^3.2.0" - invariant "^2.2.1" - keycode "^2.1.2" - prop-types "^15.5.6" - react-overlays "^0.6.12" + invariant "^2.2.4" + keycode "^2.2.0" + prop-types "^15.6.1" + prop-types-extra "^1.0.1" + react-overlays "^0.9.0" react-prop-types "^0.4.0" - uncontrollable "^4.0.1" + react-transition-group "^2.0.0" + uncontrollable "^7.0.2" warning "^3.0.0" react-color@^2.3.4: @@ -11301,14 +11344,16 @@ react-modal@^1.4.0: prop-types "^15.5.7" react-dom-factories "^1.0.0" -react-overlays@^0.6.12: - version "0.6.12" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.6.12.tgz#a079c750cc429d7db4c7474a95b4b54033e255c3" - integrity sha1-oHnHUMxCnX20x0dKlbS1QDPiVcM= +react-overlays@^0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.9.1.tgz#d4702bfe5b5e9335b676ff5a940253771fdeed12" + integrity sha512-b0asy/zHtRd0i2+2/uNxe3YVprF3bRT1guyr791DORjCzE/HSBMog+ul83CdtKQ1kZ+pLnxWCu5W3BMysFhHdQ== dependencies: classnames "^2.2.5" - dom-helpers "^3.2.0" - react-prop-types "^0.4.0" + dom-helpers "^3.2.1" + prop-types "^15.5.10" + prop-types-extra "^1.0.1" + react-transition-group "^2.2.1" warning "^3.0.0" react-prop-types@^0.4.0: @@ -11398,22 +11443,22 @@ react-toggle@^3.0.0: dependencies: classnames "^2.2.5" -react-transition-group@^2.2.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.1.tgz#67fbd8d30ebb1c57a149d554dbb82eabefa61f0d" - integrity sha512-8x/CxUL9SjYFmUdzsBPTgtKeCxt7QArjNSte0wwiLtF/Ix/o1nWNJooNy5o9XbHIKS31pz7J5VF2l41TwlvbHQ== +react-transition-group@^2.0.0, react-transition-group@^2.6.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: - dom-helpers "^3.3.1" + dom-helpers "^3.4.0" loose-envify "^1.4.0" prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-transition-group@^2.6.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== +react-transition-group@^2.2.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.1.tgz#67fbd8d30ebb1c57a149d554dbb82eabefa61f0d" + integrity sha512-8x/CxUL9SjYFmUdzsBPTgtKeCxt7QArjNSte0wwiLtF/Ix/o1nWNJooNy5o9XbHIKS31pz7J5VF2l41TwlvbHQ== dependencies: - dom-helpers "^3.4.0" + dom-helpers "^3.3.1" loose-envify "^1.4.0" prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" @@ -13736,12 +13781,15 @@ umd@^3.0.0: resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== -uncontrollable@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9" - integrity sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak= +uncontrollable@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" + integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q== dependencies: - invariant "^2.1.0" + "@babel/runtime" "^7.6.3" + "@types/react" "^16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" undeclared-identifiers@^1.1.2: version "1.1.3" @@ -14071,6 +14119,13 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" +warning@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchify-middleware@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/watchify-middleware/-/watchify-middleware-1.8.2.tgz#be84fd318049cc281f0a1da274410f9ba45a7c1e" From b7c0c50e142885f447506b3712edd58d4c3751e9 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 28 Jan 2020 15:42:43 -0500 Subject: [PATCH 005/553] fix: Fix issues from PR lint. --- .../components/version/FeedVersionViewer.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index fb2a6f123..533c65abd 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -128,10 +128,10 @@ export default class FeedVersionViewer extends Component { } type SelectorProps = { + comparedVersion: FeedVersion, feedVersionIndex: number, gtfsPlusValidation: GtfsPlusValidation, version: FeedVersion, - comparedVersion: FeedVersion, versionSection: ?string } @@ -150,26 +150,26 @@ class VersionSectionSelector extends Component { const text = hasCriticalError ? 'critical error' : validationSummary.errorCount - const diff = comparedVersion + const diff = comparedVersion ? validationSummary.errorCount - comparedVersion.validationSummary.errorCount : 0 const diffColor = diff > 0 ? 'danger' : (diff < 0 ? 'success' : 'default') - const diffText = comparedVersion + const diffText = comparedVersion ? diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) : '' return ( - - ) + ) } _getGtfsPlusIssueCount = (gtfsPlusValidation: GtfsPlusValidation) => { @@ -192,7 +192,7 @@ class VersionSectionSelector extends Component { : return issueCount === null ? - : + : } render () { @@ -227,7 +227,7 @@ class VersionSectionSelector extends Component { active={this.props.versionSection === 'comments'}> Version comments{' '} - + From 03b77bb360abe0c0441b54e1d2e6eeca337ad8f7 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 28 Jan 2020 17:50:51 -0500 Subject: [PATCH 006/553] fix(FeedVersionTabs): Fix github lint checks --- lib/manager/components/version/FeedVersionTabs.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 4f51ff18c..8af4650ca 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -91,7 +91,7 @@ export default class FeedVersionTabs extends Component { const timeTableOptions = {...tableOptions} // Add default page zie for timetable options timeTableOptions.options = {...timeTableOptions.options, sizePerPage: 50} - const countFields = ['agencyCount', 'routeCount', 'stopCount', 'tripCount', 'stopTimesCount' /*, 'errorCount'*/] + const countFields = ['agencyCount', 'routeCount', 'stopCount', 'tripCount', 'stopTimesCount'] const daysActive = moment(version.validationSummary.endDate) .diff(moment(version.validationSummary.startDate), 'days') return ( @@ -118,6 +118,7 @@ export default class FeedVersionTabs extends Component { {comparedVersion ?

-
+ -
+ + + + + + + } + onToggle={[Function]} + > +
-
- - - -
+ -
- - -
+ + + New Deployment + -
- -
- + } > -
- - - - - - - - - - - - + + + + + + + + + + + + manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + "version": 1, + }, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmFileId": null, + "otpCommit": null, + "otpVersion": null, + "project": Object { + "autoFetchFeeds": true, + "autoFetchHour": 0, + "autoFetchMinute": 0, + "bounds": null, + "buildConfig": Object { + "fares": null, + "fetchElevationUS": null, + "stationTransfers": null, + "subwayAccessTime": null, }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, + "dateCreated": 1526305321824, + "defaultTimeZone": null, + "deployments": Array [ + [Circular], + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [], + "id": "mock-deployment-id-1", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmFileId": null, + "otpCommit": null, + "otpVersion": null, + "project": [Circular], + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "r5": false, + "r5Version": null, + "routerId": null, + "user": null, }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, + }, + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": "mock-deployment-id-0", + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, }, - "version": 1, + "useCustomOsmBounds": false, + "user": null, + }, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": Object { + "r5": false, + "r5Version": null, + "routerId": null, + "user": null, + } + } + fetchProjectDeployments={[Function]} + fetchProjectFeeds={[Function]} + key="mock-deployment-id-0" + project={ + Object { "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -1004,7 +1146,108 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "dateCreated": 1526305321824, "defaultTimeZone": null, "deployments": Array [ - [Circular], + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [ + Object { + "feedSource": Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, + }, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "version": 1, + }, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmFileId": null, + "otpCommit": null, + "otpVersion": null, + "project": [Circular], + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "r5": false, + "r5Version": null, + "routerId": null, + "user": null, + }, Object { "customBuildConfig": null, "customRouterConfig": null, @@ -1097,94 +1340,326 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym }, "useCustomOsmBounds": false, "user": null, - }, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, + } } - } - fetchProjectDeployments={[Function]} - fetchProjectFeeds={[Function]} - key="mock-deployment-id-0" - project={ - Object { - "autoFetchFeeds": true, - "autoFetchHour": 0, - "autoFetchMinute": 0, - "bounds": null, - "buildConfig": Object { - "fares": null, - "fetchElevationUS": null, - "stationTransfers": null, - "subwayAccessTime": null, - }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [ + saveDeployment={[Function]} + updateDeployment={[Function]} + updateProject={[Function]} + > + + + + + + + + + + + manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "version": 1, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": [Circular], - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "otpServers": Array [], + "pinnedDeploymentId": "mock-deployment-id-0", + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, }, - "r5": false, - "r5Version": null, - "routerId": null, + "useCustomOsmBounds": false, "user": null, }, - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": [Circular], - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, + "r5": false, + "r5Version": null, + "routerId": null, + "user": null, + } } - } - saveDeployment={[Function]} - updateDeployment={[Function]} - updateProject={[Function]} - > - - - - - - - - - - - manager > DeploymentsPanel should render with the list of deploym "routerId": null, "user": null, }, - [Circular], + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [], + "id": "mock-deployment-id-1", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmFileId": null, + "otpCommit": null, + "otpVersion": null, + "project": [Circular], + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "r5": false, + "r5Version": null, + "routerId": null, + "user": null, + }, ], "feedSources": Array [ Object { @@ -1691,404 +1934,180 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym }, "useCustomOsmBounds": false, "user": null, - }, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, + } } - } - fetchProjectDeployments={[Function]} - fetchProjectFeeds={[Function]} - key="mock-deployment-id-1" - project={ - Object { - "autoFetchFeeds": true, - "autoFetchHour": 0, - "autoFetchMinute": 0, - "bounds": null, - "buildConfig": Object { - "fares": null, - "fetchElevationUS": null, - "stationTransfers": null, - "subwayAccessTime": null, - }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [ - Object { - "feedSource": Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "version": 1, - }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": [Circular], - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, - }, - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": [Circular], - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, - } - } - saveDeployment={[Function]} - updateDeployment={[Function]} - updateProject={[Function]} - > - - + + + + + + - - - - - - - - - -
- Name - - Created - - Last deployed - - Deployed to - - # of feeds - - Test? - -
+ Name + + Created + + Last deployed + + Deployed to + + # of feeds + + Test? + +
+ +
+ + + + + mock-deployment + + + + + + +
+
+
+ + + 2 months ago + + + + N/A + + + + N/A + + + + 1 + + + + N/A + + + +
+ + + + +
+
+
- -
- - - - - mock-deployment - - - - - - -
-
-
- - - 2 months ago - - - - N/A - - - - N/A - - - - 1 - - - - N/A - - - -
- - - - -
-
-
- -
+
+ - - - + + - - mock-deployment - - + + mock-deployment + + + + + + + + + + + 2 months ago + + + + N/A + + + + N/A + + + + 0 + + + + N/A + + + +
- -
- -
- - - 2 months ago - - - - N/A - - - - N/A - - - - 0 - - - - N/A - - - -
- - - - -
-
-
- -
- + + + + + +
+
+ + + + + + + + + @@ -2100,40 +2119,36 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym
- Deploying feeds to OTP } > -
-
-

+ Deploying feeds to OTP

-
+ } + onToggle={[Function]} + >
+ Deploying feeds to OTP + + } > -

+

A collection of feeds can be deployed to OpenTripPlanner (OTP) instances that have been defined in the organization settings.

@@ -2166,7 +2181,6 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym @@ -2198,8 +2212,8 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym
-
-
+ +
diff --git a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap index 7c199416c..87dd84c51 100644 --- a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap @@ -547,10 +547,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds } } > - manager > FeedSourceTable should render with a project with feeds /> } > -
-
+ manager > FeedSourceTable should render with a project with feeds "user": null, } } - > - + } + onToggle={[Function]} + > +
manager > FeedSourceTable should render with a project with feeds "user": null, } } - projectEditDisabled={false} - setFeedSort={[Function]} - setFeedSourceTableFilterCountStrategy={[Function]} - setVisibilityFilter={[Function]} - setVisibilitySearchText={[Function]} - sort="alphabetically-asc" - thirdPartySync={[Function]} - user={ - Object { - "isCheckingLogin": false, - "permissions": UserPermissions { - "appPermissionLookup": Object { - "administer-application": Object { - "type": "administer-application", - }, - }, - "orgPermissionLookup": Object {}, - "organizationLookup": Object {}, - "projectLookup": Object {}, - }, - "profile": Object { - "app_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "organizations": Array [], - "permissions": Array [ - Object { - "type": "administer-application", - }, - ], - "projects": Array [], - "subscriptions": Array [], - }, - ], - }, - "clientID": "mock-client-id", - "created_at": "2016-03-04T18:59:22.569Z", - "email": "mock-user@conveyal.com", - "email_verified": true, - "identities": Array [ - Object { - "connection": "Username-Password-Authentication", - "isSocial": false, - "provider": "auth0", - "user_id": "12345", - }, - ], - "jti": "gibberish", - "last_password_reset": "2017-07-13T13:58:01.021Z", - "name": "mock-user@conveyal.com", - "nickname": "mock-user", - "persistent": Object {}, - "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", - "sub": "auth0|12345", - "updated_at": "2019-03-21T19:05:30.180Z", - "user_id": "auth0|12345", - "user_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "editor": Object { - "map_id": "mapbox.streets", - }, - "hideTutorial": true, - "sidebarExpanded": false, - }, - ], - "lang": "en", - }, - }, - "recentActivity": null, - "redirectOnSuccess": null, - "subscriptions": UserSubscriptions { - "subscriptionLookup": Object {}, - }, - "token": "mock-token", - } - } + /> + } + > + +
- -
- -
+ + + -
- + Deployed Version + + + +

+ Latest Version +

+ + + + + +

+ - -
- - - -
-
- - - - +
+ Feed Info +

+ + +

+ - - -
- - - - - - - - - -
-
-
- - -

- - -
+ + Status + + + - -
+ - - - - - - -
-
-
- - -
- - - - -
- - - - - - - - - -
-
-
-
-
-
- -
-
- - -
- -
- - - - - - - - - - - - - - - - - + + Status + + + + + + + + manager > FeedSourceTable should render with a project with feeds "user": null, } } + key="mock-feed-with-version-id" project={ Object { "autoFetchFeeds": true, @@ -3177,91 +1442,198 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "user": null, } } - runFetchFeed={[Function]} - updateFeedSource={[Function]} - uploadFeed={[Function]} - user={ - Object { - "isCheckingLogin": false, - "permissions": UserPermissions { - "appPermissionLookup": Object { - "administer-application": Object { - "type": "administer-application", + > + - - + - - - -
- - - - Private -
- - - - - - -
- - - - +
+ + + + Private +
+ + + + + + +
+ + + + - - - - -
- -

- Deployed Version -

-
-

- Latest Version -

-
-
-

- - - - Feed Info -

-
-

- - - - Status -

-
-

- - - - Status -

-
-

- - - - Dates Valid -

-
-

- - - - Issues -

-
-
+

+ + + + Dates Valid +

+
+

+ + + + Issues +

+
+
- manager > FeedSourceTable should render with a project with feeds "snapshotVersion": null, "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, - } - } + }, + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": null, + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, + }, + "useCustomOsmBounds": false, + "user": null, + } + } + runFetchFeed={[Function]} + updateFeedSource={[Function]} + uploadFeed={[Function]} + user={ + Object { + "isCheckingLogin": false, + "permissions": UserPermissions { + "appPermissionLookup": Object { + "administer-application": Object { + "type": "administer-application", + }, + }, + "orgPermissionLookup": Object {}, + "organizationLookup": Object {}, + "projectLookup": Object {}, + }, + "profile": Object { + "app_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "organizations": Array [], + "permissions": Array [ + Object { + "type": "administer-application", + }, + ], + "projects": Array [], + "subscriptions": Array [], + }, + ], + }, + "clientID": "mock-client-id", + "created_at": "2016-03-04T18:59:22.569Z", + "email": "mock-user@conveyal.com", + "email_verified": true, + "identities": Array [ + Object { + "connection": "Username-Password-Authentication", + "isSocial": false, + "provider": "auth0", + "user_id": "12345", + }, + ], + "jti": "gibberish", + "last_password_reset": "2017-07-13T13:58:01.021Z", + "name": "mock-user@conveyal.com", + "nickname": "mock-user", + "persistent": Object {}, + "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", + "sub": "auth0|12345", + "updated_at": "2019-03-21T19:05:30.180Z", + "user_id": "auth0|12345", + "user_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "editor": Object { + "map_id": "mapbox.streets", + }, + "hideTutorial": true, + "sidebarExpanded": false, + }, + ], + "lang": "en", + }, + }, + "recentActivity": null, + "redirectOnSuccess": null, + "subscriptions": UserSubscriptions { + "subscriptionLookup": Object {}, + }, + "token": "mock-token", + } + } + > +
-
-

- - +
+

+ - test feed with a version - - -

-
- Last updated Nov 27, 2018 -
- -
+ test feed with a version + + +

+
+ Last updated Nov 27, 2018 +
+ -
- -
- - - - - Active - -
- Valid for another 2 months -
- (Aug 1, 2019) -
-
-
-
- -
- - - - - Same as Deployed - -
- Last updated 5 months ago -
-
-
-
- Aug 1, 2018 - - -
- Aug 1, 2019 -
- 78 - - + http://mdtrip.org/googletransit/Ann... + + + + + + +
+ +
+ + + + + Active + +
+ Valid for another 2 months +
+ (Aug 1, 2019) +
+
+
+
+ +
+ + + + + Same as Deployed + +
+ Last updated 5 months ago +
+
+
+
+ Aug 1, 2018 + - +
+ Aug 1, 2019 +
+ 78 + + manager > FeedSourceTable should render with a project with feeds "stopCount": 237, "stopTimesCount": 11170, "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + } } - } - project={ - Object { - "autoFetchFeeds": true, - "autoFetchHour": 0, - "autoFetchMinute": 0, - "bounds": null, - "buildConfig": Object { - "fares": null, - "fetchElevationUS": null, - "stationTransfers": null, - "subwayAccessTime": null, - }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [ - Object { - "feedSource": Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { + createDeploymentFromFeedSource={[Function]} + createFeedSource={[Function]} + deleteFeedSource={[Function]} + feedSource={ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, + } + } + project={ + Object { + "autoFetchFeeds": true, + "autoFetchHour": 0, + "autoFetchMinute": 0, + "bounds": null, + "buildConfig": Object { + "fares": null, + "fetchElevationUS": null, + "stationTransfers": null, + "subwayAccessTime": null, + }, + "dateCreated": 1526305321824, + "defaultTimeZone": null, + "deployments": Array [ + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [ + Object { + "feedSource": Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, + }, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { "agencies": null, "agencyCount": 1, "avgDailyRevenueTime": 0, @@ -3588,709 +2143,685 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "stopTimesCount": 11170, "tripCount": 415, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + "version": 1, }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "version": 1, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmFileId": null, + "otpCommit": null, + "otpVersion": null, + "project": [Circular], + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": [Circular], - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "r5": false, + "r5Version": null, + "routerId": null, + "user": null, }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": null, + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": null, - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, + "useCustomOsmBounds": false, + "user": null, + } } - } - runFetchFeed={[Function]} - updateFeedSource={[Function]} - uploadFeed={[Function]} - user={ - Object { - "isCheckingLogin": false, - "permissions": UserPermissions { - "appPermissionLookup": Object { - "administer-application": Object { - "type": "administer-application", - }, - }, - "orgPermissionLookup": Object {}, - "organizationLookup": Object {}, - "projectLookup": Object {}, - }, - "profile": Object { - "app_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "organizations": Array [], - "permissions": Array [ - Object { - "type": "administer-application", - }, - ], - "projects": Array [], - "subscriptions": Array [], + runFetchFeed={[Function]} + updateFeedSource={[Function]} + uploadFeed={[Function]} + user={ + Object { + "isCheckingLogin": false, + "permissions": UserPermissions { + "appPermissionLookup": Object { + "administer-application": Object { + "type": "administer-application", }, - ], + }, + "orgPermissionLookup": Object {}, + "organizationLookup": Object {}, + "projectLookup": Object {}, }, - "clientID": "mock-client-id", - "created_at": "2016-03-04T18:59:22.569Z", - "email": "mock-user@conveyal.com", - "email_verified": true, - "identities": Array [ - Object { - "connection": "Username-Password-Authentication", - "isSocial": false, - "provider": "auth0", - "user_id": "12345", + "profile": Object { + "app_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "organizations": Array [], + "permissions": Array [ + Object { + "type": "administer-application", + }, + ], + "projects": Array [], + "subscriptions": Array [], + }, + ], }, - ], - "jti": "gibberish", - "last_password_reset": "2017-07-13T13:58:01.021Z", - "name": "mock-user@conveyal.com", - "nickname": "mock-user", - "persistent": Object {}, - "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", - "sub": "auth0|12345", - "updated_at": "2019-03-21T19:05:30.180Z", - "user_id": "auth0|12345", - "user_metadata": Object { - "datatools": Array [ + "clientID": "mock-client-id", + "created_at": "2016-03-04T18:59:22.569Z", + "email": "mock-user@conveyal.com", + "email_verified": true, + "identities": Array [ Object { - "client_id": "mock-client-id", - "editor": Object { - "map_id": "mapbox.streets", - }, - "hideTutorial": true, - "sidebarExpanded": false, + "connection": "Username-Password-Authentication", + "isSocial": false, + "provider": "auth0", + "user_id": "12345", }, ], - "lang": "en", + "jti": "gibberish", + "last_password_reset": "2017-07-13T13:58:01.021Z", + "name": "mock-user@conveyal.com", + "nickname": "mock-user", + "persistent": Object {}, + "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", + "sub": "auth0|12345", + "updated_at": "2019-03-21T19:05:30.180Z", + "user_id": "auth0|12345", + "user_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "editor": Object { + "map_id": "mapbox.streets", + }, + "hideTutorial": true, + "sidebarExpanded": false, + }, + ], + "lang": "en", + }, }, - }, - "recentActivity": null, - "redirectOnSuccess": null, - "subscriptions": UserSubscriptions { - "subscriptionLookup": Object {}, - }, - "token": "mock-token", + "recentActivity": null, + "redirectOnSuccess": null, + "subscriptions": UserSubscriptions { + "subscriptionLookup": Object {}, + }, + "token": "mock-token", + } } - } - > - - - - -
- - - - - - + Menu + + + + + + - - - -
-
-
-
-
-
-
-
-
-
-
+ + + + Delete + + + + + + + +
+ + + + + + + + + + + +
+ + +
+ From 32b2d591a498e75db142dd9b699f2decae2906c4 Mon Sep 17 00:00:00 2001 From: Martijn van Laar Date: Thu, 13 Aug 2020 15:14:47 +0200 Subject: [PATCH 008/553] Update default mapbox map_id mapbox.streets is not working anymore. So replace is with mapbox/outdoors-v11 --- configurations/default/env.yml.tmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurations/default/env.yml.tmp b/configurations/default/env.yml.tmp index 86b17dbc1..a78cfeca0 100644 --- a/configurations/default/env.yml.tmp +++ b/configurations/default/env.yml.tmp @@ -2,7 +2,7 @@ AUTH0_CLIENT_ID: your-auth0-client-id AUTH0_DOMAIN: your-auth0-domain BUGSNAG_KEY: optional-bugsnag-key MAPBOX_ACCESS_TOKEN: your-mapbox-access-token -MAPBOX_MAP_ID: mapbox.streets +MAPBOX_MAP_ID: mapbox/outdoors-v11 MAPBOX_ATTRIBUTION: © Mapbox © OpenStreetMap Improve this map SLACK_CHANNEL: optional-slack-channel SLACK_WEBHOOK: optional-slack-webhook From 67771852f369d9bc2f02bd4ef9312b9346f61815 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2020 21:16:27 +0000 Subject: [PATCH 009/553] build(deps): bump auth0-lock from 11.21.0 to 11.26.0 Bumps [auth0-lock](https://github.com/auth0/lock) from 11.21.0 to 11.26.0. - [Release notes](https://github.com/auth0/lock/releases) - [Changelog](https://github.com/auth0/lock/blob/master/CHANGELOG.md) - [Commits](https://github.com/auth0/lock/compare/v11.21.0...v11.26.0) Signed-off-by: dependabot[bot] --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6938c584..c03e9bea5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1939,13 +1939,13 @@ attr-accept@^1.0.3: dependencies: core-js "^2.5.0" -auth0-js@^9.12.2, auth0-js@^9.3.2: - version "9.13.2" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.13.2.tgz#78ea02d28a0a8c5ee4eb27c229563227071451d0" - integrity sha512-gWlf+X3XhCT9JboYpGviflv0pHcaHFPGtkLXiebyJohHDKddiu2rZkezp9kZHEoXqxhtNqgWuuaXkcla5JtnXg== +auth0-js@^9.13.3, auth0-js@^9.3.2: + version "9.13.4" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.13.4.tgz#e5238ca8ea45b6f172eb917accf570a8bb9f4d0a" + integrity sha512-G7wXTtEUe8OG5UMdcFPoS47odorEZ3WerNyWLLhoGlLqYcPgv0t+B0ECHv/rVLULbpctbSBrRFFYa43/bJV4+Q== dependencies: base64-js "^1.3.0" - idtoken-verifier "^2.0.2" + idtoken-verifier "^2.0.3" js-cookie "^2.2.0" qs "^6.7.0" superagent "^3.8.3" @@ -1953,11 +1953,11 @@ auth0-js@^9.12.2, auth0-js@^9.3.2: winchan "^0.2.2" auth0-lock@^11.3.1: - version "11.21.0" - resolved "https://registry.yarnpkg.com/auth0-lock/-/auth0-lock-11.21.0.tgz#4fb3e0d59c133cab9af9750935cbb1a144e13eba" - integrity sha512-TOie5vUN2V7x7iXwm5xP+sMeK9ZQcTp7PlIJcQbHDveB76sCASv9HM2hDmeeWQpAx1BHfJkvWAg16i2kw5gD8A== + version "11.26.0" + resolved "https://registry.yarnpkg.com/auth0-lock/-/auth0-lock-11.26.0.tgz#5a4a7c3df47004b710743b178300bfda9235f7ef" + integrity sha512-9b40aZkNiSMmASuyyz+lGB66aSfceVORTT+Ae9/Mr0+gFoKG7E6h+dDn52sDVQ2FEedI5zRlfpN4w4G54dK2qA== dependencies: - auth0-js "^9.12.2" + auth0-js "^9.13.3" auth0-password-policies "^1.0.2" blueimp-md5 "2.3.1" immutable "^3.7.3" @@ -6202,10 +6202,10 @@ iconv-lite@0.4.8: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.8.tgz#c6019a7595f2cefca702eab694a010bcd9298d20" integrity sha1-xgGadZXyzvynAuq2lKAQvNkpjSA= -idtoken-verifier@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.0.2.tgz#7fd1c64c435abf07e92f137e7ac538a758fdc399" - integrity sha512-9UN83SKT9dtN3d7vNz3EMTqoaJi3D02Zg5XMqF6+bLrGL+Akbx4oj4SEWsgXtLF6cy46XrUcVzokFY+SWO+/MA== +idtoken-verifier@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.0.3.tgz#b60a933848900c9f684e6296332f62e5f2e79360" + integrity sha512-X1izD2ZTMoo+2tw2RKVUvvCSw2B6UOCNMJ0bgHRH758LFTMwBf4JZfCZm61MPBaBW2CIuhkcSnKCZP6jXpSDmw== dependencies: base64-js "^1.3.0" crypto-js "^3.2.1" From 95a4cb004cd41a811c30ad6281a0bb746dada5b8 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 2 Oct 2020 09:58:03 -0400 Subject: [PATCH 010/553] docs(AWS servers): Clarify S3 permissions settings. --- docs/user/setting-up-aws-servers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/user/setting-up-aws-servers.md b/docs/user/setting-up-aws-servers.md index 2f135ed4c..c36f83b2f 100644 --- a/docs/user/setting-up-aws-servers.md +++ b/docs/user/setting-up-aws-servers.md @@ -21,6 +21,7 @@ The OTP user interface is delivered using a plain HTTP file server that does not 1. From [AWS S3](https://console.aws.amazon.com/s3/home), click `Create Bucket`. Each deployment uses its own bucket. 2. Specify a name (write down the name for use in Data Tools later). 3. When specifying options, uncheck `Block All Public Access`. +Do not grant additional access from the bucket's `Permissions` tab. ### Create a CloudFront instance From 9e0277532055af10cc1d4f53a369fe0cc8a18c6a Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Fri, 2 Oct 2020 16:31:57 -0700 Subject: [PATCH 011/553] refactor: lazy-load server data with ec2 instance info --- lib/admin/actions/admin.js | 15 +++++++++++++++ lib/admin/components/ServerSettings.js | 8 ++++++++ lib/admin/reducers/servers.js | 12 ++++++++++++ lib/manager/components/CollapsiblePanel.js | 4 ++++ 4 files changed, 39 insertions(+) diff --git a/lib/admin/actions/admin.js b/lib/admin/actions/admin.js index 739d1efe5..f256e5000 100644 --- a/lib/admin/actions/admin.js +++ b/lib/admin/actions/admin.js @@ -32,6 +32,10 @@ const receiveAllRequests = createAction( ) const fetchingApplicationStatus = createVoidPayloadAction('FETCHING_ALL_JOBS') const updatingServer = createAction('UPDATING_SERVER', (payload: OtpServer) => payload) +const receiveServer = createAction( + 'RECEIVE_SERVER', + (payload: OtpServer) => payload +) const receiveServers = createAction( 'RECEIVE_SERVERS', (payload: Array) => payload @@ -147,6 +151,17 @@ export function fetchServers () { } } +/** + * Fetch an OTP/R5 server target. + */ +export function fetchServer (serverId: string) { + return function (dispatch: dispatchFn, getState: getStateFn) { + return dispatch(secureFetch(`${SERVER_URL}/${serverId}`)) + .then(res => res.json()) + .then(server => dispatch(receiveServer(server))) + } +} + /** * Update or create OTP/R5 server target. */ diff --git a/lib/admin/components/ServerSettings.js b/lib/admin/components/ServerSettings.js index e3e344c6b..523e0e72e 100644 --- a/lib/admin/components/ServerSettings.js +++ b/lib/admin/components/ServerSettings.js @@ -36,6 +36,7 @@ import type { AppState, AdminServersState } from '../../types/reducers' type ContainerProps = {editDisabled: boolean} type Props = ContainerProps & { deleteServer: typeof adminActions.deleteServer, + fetchServer: typeof adminActions.fetchServer, fetchServers: typeof adminActions.fetchServers, otpServers: AdminServersState, projects: Array, @@ -149,6 +150,10 @@ class ServerSettings extends Component { } } + _onExpandServer = (index: number) => { + this.props.fetchServer(this.state.otpServers[index].id) + } + _onSaveServer = (index: number) => this.props.updateServer(this.state.otpServers[index]) _onChange = (evt, stateUpdate = {}, index) => { @@ -224,6 +229,7 @@ class ServerSettings extends Component { index={index} key={`server-${index}`} onChange={this._getOnChange} + onEnter={this._onExpandServer} onRemove={this._onDeleteServer} onSave={this._onSaveServer} saveDisabled={!this.state.hasEdits} @@ -377,6 +383,7 @@ const mapStateToProps = (state: AppState, ownProps: ContainerProps) => { const { deleteServer, + fetchServer, fetchServers, terminateEC2Instances, updateServer @@ -386,6 +393,7 @@ const { terminateEC2InstanceForDeployment } = deploymentActions const mapDispatchToProps = { deleteServer, + fetchServer, fetchServers, terminateEC2InstanceForDeployment, terminateEC2Instances, diff --git a/lib/admin/reducers/servers.js b/lib/admin/reducers/servers.js index cb5f43ed2..225a52e6e 100644 --- a/lib/admin/reducers/servers.js +++ b/lib/admin/reducers/servers.js @@ -19,6 +19,18 @@ const servers = (state: AdminServersState = defaultState, action: Action): Admin isFetching: { $set: false }, data: { $set: action.payload } }) + case 'RECEIVE_SERVER': + const serverData = action.payload + if (state.data) { + const serverIdx = state.data.findIndex( + server => server.id === serverData.id + ) + return update(state, { + isFetching: { $set: false }, + data: { [serverIdx]: { $set: action.payload } } + }) + } + return state case 'CREATED_SERVER': if (state.data) { return update(state, { data: { $push: [action.payload] } }) diff --git a/lib/manager/components/CollapsiblePanel.js b/lib/manager/components/CollapsiblePanel.js index 58960b782..0d33f15ec 100644 --- a/lib/manager/components/CollapsiblePanel.js +++ b/lib/manager/components/CollapsiblePanel.js @@ -20,6 +20,7 @@ type Props = { fields: Array, index: number, onChange: (SyntheticInputEvent, number) => void, + onEnter?: number => void, onRemove?: number => void, onSave?: number => any, saveDisabled: boolean, @@ -36,6 +37,8 @@ export default class CollapsiblePanel extends Component { _onChange = (evt: SyntheticInputEvent) => this.props.onChange(evt, this.props.index) + _onEnter = () => this.props.onEnter && this.props.onEnter(this.props.index) + _onRemove = () => this.props.onRemove && this.props.onRemove(this.props.index) _onSave = () => this.props.onSave && this.props.onSave(this.props.index) @@ -80,6 +83,7 @@ export default class CollapsiblePanel extends Component { data-test-id={testId} defaultExpanded={defaultExpanded} header={
{title}
} + onEnter={this._onEnter} >
{this.renderButtonToolbar()} From 10455a1b6726bd2658dcd38fded10f3b09c18bc9 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Tue, 6 Oct 2020 15:47:07 -0700 Subject: [PATCH 012/553] refactor: update UI with full server info after server update --- lib/admin/actions/admin.js | 2 +- lib/manager/reducers/status.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/admin/actions/admin.js b/lib/admin/actions/admin.js index f256e5000..3ece5ac32 100644 --- a/lib/admin/actions/admin.js +++ b/lib/admin/actions/admin.js @@ -173,7 +173,7 @@ export function updateServer (server: OtpServer) { dispatch(updatingServer(server)) dispatch(secureFetch(url, method, server)) .then(res => res.json()) - .then(server => dispatch(fetchServers())) + .then(server => dispatch(receiveServer(server))) } } diff --git a/lib/manager/reducers/status.js b/lib/manager/reducers/status.js index 0aed62439..185988277 100644 --- a/lib/manager/reducers/status.js +++ b/lib/manager/reducers/status.js @@ -202,6 +202,7 @@ const config = (state: StatusState = defaultState, action: Action): StatusState case 'RECEIVED_RTD_SIGNS': case 'RECEIVED_RTD_ALERTS': case 'RECEIVE_ORGANIZATIONS': + case 'RECEIVE_SERVER': case 'RECEIVE_SERVERS': return update(state, {message: {$set: null}}) case 'SET_APP_INFO': From 06ea784765e75c40a7a7c912ffc00988988a0d27 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 16 Oct 2020 17:23:13 -0400 Subject: [PATCH 013/553] fix(pattern-editor): handle uncaught error and improve add stop by name fix #617 --- lib/common/components/Loading.js | 4 +- lib/editor/components/MinuteSecondInput.js | 4 +- .../components/VirtualizedEntitySelect.js | 4 +- lib/editor/components/map/AddableStop.js | 41 ++---- .../components/map/pattern-debug-lines.js | 24 ++-- .../pattern/AddPatternStopDropdown.js | 123 ++++++++++++++++++ .../components/pattern/EditShapePanel.js | 92 ++++++++++++- .../components/pattern/PatternStopButtons.js | 100 ++++++-------- .../components/pattern/PatternStopsPanel.js | 42 +++++- lib/editor/constants/index.js | 2 + lib/editor/selectors/index.js | 16 ++- lib/editor/util/map.js | 13 ++ lib/types/index.js | 2 + 13 files changed, 344 insertions(+), 123 deletions(-) create mode 100644 lib/editor/components/pattern/AddPatternStopDropdown.js diff --git a/lib/common/components/Loading.js b/lib/common/components/Loading.js index 0eae019f5..f7ffd80c4 100644 --- a/lib/common/components/Loading.js +++ b/lib/common/components/Loading.js @@ -4,10 +4,12 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import { Row, Col } from 'react-bootstrap' +import type {Style} from '../../types' + type Props = { inline?: boolean, small?: boolean, - style?: {[string]: string | number} + style?: Style } export default class Loading extends Component { diff --git a/lib/editor/components/MinuteSecondInput.js b/lib/editor/components/MinuteSecondInput.js index 29a0d92c3..cd2133a35 100644 --- a/lib/editor/components/MinuteSecondInput.js +++ b/lib/editor/components/MinuteSecondInput.js @@ -8,11 +8,13 @@ import { convertMMSSStringToSeconds } from '../../common/util/date-time' +import type {Style} from '../../types' + type Props = { disabled?: boolean, onChange: number => void, seconds: number, - style?: {[string]: string | number} + style?: Style } type State = { diff --git a/lib/editor/components/VirtualizedEntitySelect.js b/lib/editor/components/VirtualizedEntitySelect.js index ffc388a0b..f72a9558b 100644 --- a/lib/editor/components/VirtualizedEntitySelect.js +++ b/lib/editor/components/VirtualizedEntitySelect.js @@ -5,7 +5,7 @@ import VirtualizedSelect from 'react-virtualized-select' import {getEntityName} from '../util/gtfs' -import type {Entity} from '../../types' +import type {Entity, Style} from '../../types' export type EntityOption = { entity: Entity, @@ -20,7 +20,7 @@ type Props = { entityKey: string, onChange: any => void, optionRenderer?: Function, - style?: {[string]: number | string}, + style?: Style, value?: any } diff --git a/lib/editor/components/map/AddableStop.js b/lib/editor/components/map/AddableStop.js index f12c927e2..3b7311689 100644 --- a/lib/editor/components/map/AddableStop.js +++ b/lib/editor/components/map/AddableStop.js @@ -1,12 +1,11 @@ // @flow -import Icon from '@conveyal/woonerf/components/icon' import { divIcon } from 'leaflet' import React, {Component} from 'react' -import {Button, Dropdown, MenuItem} from 'react-bootstrap' import {Marker, Popup} from 'react-leaflet' import * as stopStrategiesActions from '../../actions/map/stopStrategies' +import AddPatternStopDropdown from '../pattern/AddPatternStopDropdown' import type {GtfsStop, Pattern} from '../../../types' @@ -28,6 +27,7 @@ export default class AddableStop extends Component { render () { const { activePattern, + addStopToPattern, stop } = this.props const color = 'blue' @@ -40,7 +40,6 @@ export default class AddableStop extends Component { className: '', iconSize: [24, 24] }) - // TODO: Refactor to share code with PatternStopButtons return ( {
{stopName}
- - - - - - Add to end (default) - - {activePattern.patternStops && activePattern.patternStops.map((stop, i) => { - const index = activePattern.patternStops.length - i - return ( - - {index === 1 ? 'Add to beginning' : `Insert as stop #${index}`} - - ) - })} - - +
diff --git a/lib/editor/components/map/pattern-debug-lines.js b/lib/editor/components/map/pattern-debug-lines.js index 99da76d6c..db0ee930d 100644 --- a/lib/editor/components/map/pattern-debug-lines.js +++ b/lib/editor/components/map/pattern-debug-lines.js @@ -5,8 +5,8 @@ import {Polyline} from 'react-leaflet' import lineDistance from 'turf-line-distance' import lineString from 'turf-linestring' -import {POINT_TYPE} from '../../constants' -import {isValidPoint} from '../../util/map' +import {PATTERN_TO_STOP_DISTANCE_THRESHOLD_METERS} from '../../constants' +import {getStopControlPoints} from '../../util/map' import type {ControlPoint, GtfsStop, Pattern} from '../../../types' import type {EditSettingsState} from '../../../types/reducers' @@ -20,8 +20,6 @@ type Props = { stops: Array } -const DISTANCE_THRESHOLD = 50 - /** * This react-leaflet component draws connecting lines between a pattern * geometry's anchor points (that are associated with stops) and their @@ -44,33 +42,33 @@ export default class PatternDebugLines extends PureComponent { // i.e., whether the line should be rendered. .map((cp, index) => ({...cp, cpIndex: index})) // Filter out the user-added anchors - .filter(cp => cp.pointType === POINT_TYPE.STOP) + .filter(getStopControlPoints) // The remaining number should match the number of stops .map((cp, index) => { const {cpIndex, point, stopId} = cp - if (!isValidPoint(point)) { - return null - } + // If hiding inactive segments (and this control point is not along + // a visible segment), do not show debug line. if (editSettings.hideInactiveSegments && (cpIndex > patternSegment + 1 || cpIndex < patternSegment - 1)) { return null } const patternStopIsActive = patternStop.index === index // Do not render if some other pattern stop is active - // $FlowFixMe - if ((patternStop.index || patternStop.index === 0) && !patternStopIsActive) { + if (typeof patternStop.index === 'number' && !patternStopIsActive) { return null } const {coordinates: cpCoord} = point.geometry + // Find stop entity for control point. const stop = stops.find(s => s.stop_id === stopId) if (!stop) { - // console.warn(`Could not find stop for pattern stop index=${index} patternStop#stopId=${stopId}`) + // If no stop entity found, do not attempt to draw a line to the + // missing stop. return null } const coordinates = [[cpCoord[1], cpCoord[0]], [stop.stop_lat, stop.stop_lon]] const distance: number = lineDistance(lineString(coordinates), 'meters') - const distanceGreaterThanThreshold = distance > DISTANCE_THRESHOLD + const distanceGreaterThanThreshold = distance > PATTERN_TO_STOP_DISTANCE_THRESHOLD_METERS if (distanceGreaterThanThreshold) { - console.warn(`Distance from pattern stop index=${index} to projected point is greater than ${DISTANCE_THRESHOLD} (${distance}).`) + console.warn(`Distance from pattern stop index=${index} to projected point is greater than ${PATTERN_TO_STOP_DISTANCE_THRESHOLD_METERS} (${distance}).`) } return ( { + _addStop = (index?: number) => { + const {activePattern, addStopToPattern, stop} = this.props + addStopToPattern(activePattern, stop, index) + } + + _matchesStopAtIndex = (index: number) => { + const {activePattern, stop} = this.props + const patternStopAtIndex = activePattern.patternStops[index] + return patternStopAtIndex && patternStopAtIndex.stopId === stop.stop_id + } + + _onAddToEnd = () => this._addStop() + + _onSelectStop = (key: number) => this._addStop(key) + + render () { + const {activePattern, index, label, size, style} = this.props + const {patternStops} = activePattern + const lastIndex = patternStops.length - 1 + // Check that first/last stop is not already set to this stop. + let addToEndDisabled = this._matchesStopAtIndex(lastIndex) + let addToBeginningDisabled = this._matchesStopAtIndex(0) + // Also, disable end/beginning if the current pattern stop being viewed + // occupies one of these positions. + if (typeof index === 'number') { + addToEndDisabled = addToEndDisabled || index >= lastIndex + addToBeginningDisabled = addToBeginningDisabled || index === 0 + } + return ( + + + + + + Add to end (default) + + {activePattern.patternStops && activePattern.patternStops.map((s, i) => { + // addIndex is in "reverse" order + const addIndex = activePattern.patternStops.length - i + let disableAdjacent = false + // If showing for current pattern stop, do not allow adding as an + // adjacent stop. + if (typeof index === 'number') { + disableAdjacent = (index >= addIndex - 2 && index < addIndex) + } + // Disable adding stop to current position or directly before/after + // current position + const addAtIndexDisabled = disableAdjacent || + this._matchesStopAtIndex(addIndex - 2) || + this._matchesStopAtIndex(addIndex - 1) + // Skip MenuItem index is the same as the pattern stop index + if (index === addIndex - 1 || addIndex === 1) { + return null + } + return ( + + {`Insert as stop #${addIndex}`} + + ) + })} + + Add to beginning + + + + ) + } +} diff --git a/lib/editor/components/pattern/EditShapePanel.js b/lib/editor/components/pattern/EditShapePanel.js index 2b67a033d..354edb338 100644 --- a/lib/editor/components/pattern/EditShapePanel.js +++ b/lib/editor/components/pattern/EditShapePanel.js @@ -2,13 +2,15 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' -import {Button, ButtonGroup, ButtonToolbar, OverlayTrigger, Tooltip} from 'react-bootstrap' +import {Alert, Button, ButtonGroup, ButtonToolbar, OverlayTrigger, Tooltip} from 'react-bootstrap' import ll from '@conveyal/lonlat' import numeral from 'numeral' +import lineDistance from 'turf-line-distance' +import lineString from 'turf-linestring' import * as activeActions from '../../actions/active' import * as mapActions from '../../actions/map' -import {ARROW_MAGENTA} from '../../constants' +import {ARROW_MAGENTA, PATTERN_TO_STOP_DISTANCE_THRESHOLD_METERS} from '../../constants' import * as tripPatternActions from '../../actions/tripPattern' import OptionButton from '../../../common/components/OptionButton' import EditSettings from './EditSettings' @@ -17,6 +19,7 @@ import {polyline as getPolyline} from '../../../scenario-editor/utils/valhalla' import { controlPointsFromSegments, generateControlPointsFromPatternStops, + getStopControlPoints, getPatternDistance } from '../../util/map' @@ -139,6 +142,42 @@ export default class EditShapePanel extends Component { }) } + /** + * Checks the control points for stop control points that are located too far + * from the actual stop location. This is used to give instructions to the + * user on resolving the issue. + */ + _getPatternStopsWithShapeIssues = () => { + const {controlPoints, stops} = this.props + return controlPoints + .filter(getStopControlPoints) + .map((controlPoint, index) => { + const {point, stopId} = controlPoint + let exceedsThreshold = false + const {coordinates: cpCoord} = point.geometry + // Find stop entity for control point. + const stop = stops.find(s => s.stop_id === stopId) + if (!stop) { + // If no stop entity found, do not attempt to draw a line to the + // missing stop. + return {controlPoint, index, stop: null, distance: 0, exceedsThreshold} + } + const coordinates = [[cpCoord[1], cpCoord[0]], [stop.stop_lat, stop.stop_lon]] + const distance: number = lineDistance(lineString(coordinates), 'meters') + exceedsThreshold = distance > PATTERN_TO_STOP_DISTANCE_THRESHOLD_METERS + return { + controlPoint, + distance, + exceedsThreshold, + index, + stop + } + }) + // TODO: This can be removed if at some point we need to show stops where + // the distance threshold is not exceeded. + .filter(item => item.exceedsThreshold) + } + _beginEditing = () => { const {togglePatternEditing} = this.props togglePatternEditing() @@ -188,6 +227,7 @@ export default class EditShapePanel extends Component { const nextSegment = (!patternSegment && patternSegment !== 0) ? 0 : patternSegment + 1 + const patternStopsWithShapeIssues = this._getPatternStopsWithShapeIssues() return (

@@ -217,6 +257,54 @@ export default class EditShapePanel extends Component { }

+ {patternStopsWithShapeIssues.length > 0 + ? +

Pattern stop snapping issue

+
    + {patternStopsWithShapeIssues + .map(item => { + const {distance, index, stop} = item + if (!stop) return null + const roundedDist = Math.round(distance * 100) / 100 + return ( +
  • + #{index + 1} {stop.stop_name}{' '} + + {roundedDist} m + +
  • + ) + }) + } +
+

+ The stop(s) listed above are located + too far (max = {PATTERN_TO_STOP_DISTANCE_THRESHOLD_METERS}{' '} + meters) from the pattern shape. +

+

+ This can be resolved by: +

    +
  1. + moving the stop itself closer to the street's edge; +
  2. +
  3. + changing where the stop is "snapped" to the shape: click{' '} + Edit pattern geometry, uncheck{' '} + Hide stop handles, and move the stop handle + closer to the stop. Checking Hide inactive segments{' '} + can help isolate the problematic stop handle; or +
  4. +
  5. + regenerating the shape from existing stops: click{' '} + From stops. +
  6. +
+

+
+ : null + } + {editSettings.editGeometry ?
diff --git a/lib/editor/components/pattern/PatternStopButtons.js b/lib/editor/components/pattern/PatternStopButtons.js index 293fcf14f..3aa939aa2 100644 --- a/lib/editor/components/pattern/PatternStopButtons.js +++ b/lib/editor/components/pattern/PatternStopButtons.js @@ -2,13 +2,14 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' -import { Button, Dropdown, OverlayTrigger, Tooltip, ButtonGroup, MenuItem } from 'react-bootstrap' +import { Button, OverlayTrigger, Tooltip, ButtonGroup } from 'react-bootstrap' import * as activeActions from '../../actions/active' import * as stopStrategiesActions from '../../actions/map/stopStrategies' import * as tripPatternActions from '../../actions/tripPattern' +import AddPatternStopDropdown from './AddPatternStopDropdown' -import type {Feed, GtfsStop, Pattern, PatternStop} from '../../../types' +import type {Feed, GtfsStop, Pattern, PatternStop, Style} from '../../../types' type Props = { activePattern: Pattern, @@ -23,7 +24,7 @@ type Props = { setActiveStop: typeof tripPatternActions.setActiveStop, size: string, stop: GtfsStop, - style?: {[string]: number | string}, + style?: Style, updatePatternStops: typeof tripPatternActions.updatePatternStops } @@ -44,7 +45,13 @@ export default class PatternStopButtons extends Component { _onClickRemove = () => { const {activePattern, index, removeStopFromPattern, stop} = this.props - removeStopFromPattern(activePattern, stop, index) + if ( + window.confirm( + `Are you sure you would like to remove ${stop.stop_name} (${stop.stop_id}) as pattern stop #${index + 1}?` + ) + ) { + removeStopFromPattern(activePattern, stop, index) + } } _onClickSave = () => this.props.saveActiveGtfsEntity('trippattern') @@ -55,11 +62,16 @@ export default class PatternStopButtons extends Component { } render () { - const {stop, index, activePattern, patternEdited, style, size} = this.props - const {patternStops} = activePattern - const lastIndex = patternStops.length - 1 - const addToEndDisabled = index >= lastIndex || patternStops[lastIndex].stopId === stop.id - const addToBeginningDisabled = index === 0 || patternStops[0].stopId === stop.id + const { + activePattern, + addStopToPattern, + index, + patternEdited, + patternStop, + size, + stop, + style + } = this.props return ( { onClick={this._onClickSave}> - Edit stop}> + Edit stop} + > - Remove from pattern}> + Remove stop from pattern + } + > - - - - - - Add to end (default) - - {activePattern.patternStops && activePattern.patternStops.map((s, i) => { - // addIndex is in "reverse" order - const addIndex = activePattern.patternStops.length - i - const addAtIndexDisabled = (index >= addIndex - 2 && index < addIndex) || - (patternStops[addIndex - 2] && patternStops[addIndex - 2].stopId === stop.id) || - (patternStops[addIndex - 1] && patternStops[addIndex - 1].stopId === stop.id) - // (patternStops[addIndex + 1] && patternStops[addIndex + 1].stopId === stop.id) - // skip MenuItem index is the same as the pattern stop index - if (index === addIndex - 1 || addIndex === 1) { - return null - } - // disable adding stop to current position or directly before/after current position - return ( - - {`Insert as stop #${addIndex}`} - - ) - })} - - Add to beginning - - - + ) } diff --git a/lib/editor/components/pattern/PatternStopsPanel.js b/lib/editor/components/pattern/PatternStopsPanel.js index 320fd8f4d..1192ecda8 100644 --- a/lib/editor/components/pattern/PatternStopsPanel.js +++ b/lib/editor/components/pattern/PatternStopsPanel.js @@ -8,9 +8,11 @@ import * as activeActions from '../../actions/active' import * as mapActions from '../../actions/map' import * as stopStrategiesActions from '../../actions/map/stopStrategies' import * as tripPatternActions from '../../actions/tripPattern' +import AddPatternStopDropdown from './AddPatternStopDropdown' import NormalizeStopTimesModal from './NormalizeStopTimesModal' import PatternStopContainer from './PatternStopContainer' import VirtualizedEntitySelect from '../VirtualizedEntitySelect' +import {getEntityBounds, getEntityName} from '../../util/gtfs' import type {Pattern, GtfsStop, Feed, ControlPoint, Coordinates} from '../../../types' import type {EditorStatus, EditSettingsUndoState, MapState} from '../../../types/reducers' @@ -34,19 +36,26 @@ type Props = { stops: Array, updateActiveGtfsEntity: typeof activeActions.updateActiveGtfsEntity, updateEditSetting: typeof activeActions.updateEditSetting, + updateMapSetting: typeof mapActions.updateMapSetting, updatePatternGeometry: typeof mapActions.updatePatternGeometry, updatePatternStops: typeof tripPatternActions.updatePatternStops } -type State = { showNormalizeStopTimesModal: boolean } +type State = { + patternStopCandidate: ?GtfsStop, + showNormalizeStopTimesModal: boolean + } export default class PatternStopsPanel extends Component { state = { - showNormalizeStopTimesModal: false + showNormalizeStopTimesModal: false, + patternStopCandidate: null } _toggleAddStopsMode = () => { const {editSettings, updateEditSetting} = this.props + // Clear stop candidate (if defined). + this.setState({patternStopCandidate: null}) updateEditSetting({ setting: 'addStops', value: !editSettings.present.addStops @@ -58,12 +67,16 @@ export default class PatternStopsPanel extends Component { _onCloseModal = () => this.setState({showNormalizeStopTimesModal: false}) - _addStopFromSelect = (input: any) => { + _selectStop = (input: any) => { if (!input) { + // Clear stop candidate if input is cleared. + this.setState({patternStopCandidate: null}) return } const stop: GtfsStop = input.entity - return this.props.addStopToPattern(this.props.activePattern, stop) + // Zoom to stop candidate + this.props.updateMapSetting({bounds: getEntityBounds(stop), target: +stop.id}) + this.setState({patternStopCandidate: stop}) } render () { @@ -88,6 +101,7 @@ export default class PatternStopsPanel extends Component { updatePatternStops } = this.props const {addStops} = editSettings.present + const {patternStopCandidate} = this.state const patternHasStops = activePattern.patternStops && activePattern.patternStops.length > 0 return ( @@ -174,8 +188,24 @@ export default class PatternStopsPanel extends Component { + onChange={this._selectStop} /> + {patternStopCandidate + ?
+

{getEntityName(patternStopCandidate)}

+ +
+ : null + }
- {/* Previous Version Selector Dropdown */} - - 0 ? `Comparing to: ${this.messages('version')} ${comparedVersionIndex}` : ``} - disabled={comparedVersionIndex === 0} - onSelect={this._onSelectComparedVersion}> - {versions.map((version, k) => { - k = k + 1 - if (k >= feedVersionIndex) { - return ( - - {k}. (Cannot compare with self or more recent) - - ) - } else return {k}. {version.name} - })} - + {/* Show comparison version selector if 2+ versions present and comparing is active. */} + {hasManyVersions && comparedVersionIndex !== null && + + } } @@ -360,7 +354,7 @@ export default class FeedVersionNavigator extends Component { renameFeedVersion={renameFeedVersion} user={user} version={this.props.version} - comparedVersion={versions[comparedVersionIndex - 1]} + comparedVersion={comparedFeedVersion} versionSection={versionSection || null} versions={sortedVersions} /> From f58cbc8b7a50e1844617c93566381c6cbd90fabb Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 6 Nov 2020 11:57:12 -0500 Subject: [PATCH 019/553] refactor(FeedVersionViewer): Tweak issues count diff label. --- .../version/FeedVersionNavigator.js | 1 - .../components/version/FeedVersionViewer.js | 39 +++++++++---------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 5d5cf5144..8c34d523d 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -252,7 +252,6 @@ export default class FeedVersionNavigator extends Component { /> } - } diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index f0d626af7..ef7a1b3e6 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -141,7 +141,10 @@ type SelectorProps = { } class VersionSectionSelector extends Component { - _renderIssuesLabel (version, comparedVersion) { + _renderIssuesLabel ( + version: FeedVersion, + comparedVersion: FeedVersion + ) { const tableFatalExceptions = getTableFatalExceptions(version) const {validationResult, validationSummary, feedLoadResult} = version const hasCriticalError = validationSummary.loadStatus !== 'SUCCESS' || @@ -161,28 +164,24 @@ class VersionSectionSelector extends Component { const text = hasCriticalError ? 'critical error' : validationSummary.errorCount - const diff = comparedVersion - ? validationSummary.errorCount - comparedVersion.validationSummary.errorCount - : 0 - const diffColor = diff > 0 ? 'danger' : (diff < 0 ? 'success' : 'default') - const diffText = comparedVersion - ? diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) - : '' + + let diffLabel + if (comparedVersion) { + const diff = validationSummary.errorCount - comparedVersion.validationSummary.errorCount + const diffColor = diff > 0 ? 'label-danger' : (diff < 0 ? 'label-success' : 'label-default') + const diffText = diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) + + diffLabel = ( + + {diffText} + + ) + } + return ( - - {text} - - {comparedVersion - ? - {diffText} - - : '' - } - {text} + {text} {diffLabel} ) From ffed209f2a92e53ab680b698c72162a99acea721 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 6 Nov 2020 13:45:58 -0500 Subject: [PATCH 020/553] refactor(FeedVersionViewer): Remove unused prop --- lib/manager/components/version/FeedVersionNavigator.js | 1 - lib/manager/components/version/FeedVersionViewer.js | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 8c34d523d..bba425ceb 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -336,7 +336,6 @@ export default class FeedVersionNavigator extends Component { exportVersionShapes={exportVersionShapes} feedSource={feedSource} feedVersionIndex={feedVersionIndex} - comparedVersionIndex={comparedVersionIndex} fetchGTFSEntities={fetchGTFSEntities} fetchValidationErrors={fetchValidationErrors} gtfs={gtfs} diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index ef7a1b3e6..aec5f4f00 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -24,7 +24,6 @@ import type {GtfsState, ManagerUserState} from '../../../types/reducers' export type Props = { comparedVersion: FeedVersion, - comparedVersionIndex: number, deleteDisabled: ?boolean, deleteFeedVersion: typeof versionsActions.deleteFeedVersion, downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken, From 201672477cb67b9f03dafa2200c8c9ddabee3f04 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 6 Nov 2020 15:26:03 -0500 Subject: [PATCH 021/553] refactor(FeedVersionNavigator): Improve logic for comparison dropdown. --- .../version/FeedVersionNavigator.js | 60 ++++++++++++------- .../version/VersionSelectorDropdown.js | 2 +- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index bba425ceb..14f498688 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -18,8 +18,7 @@ import * as gtfsPlusActions from '../../../gtfsplus/actions/gtfsplus' import * as deploymentActions from '../../../manager/actions/deployments' import DeploymentPreviewButton from '../DeploymentPreviewButton' import FeedVersionViewer from './FeedVersionViewer' -import VersionSelectorDropdown from './VersionSelectorDropdown' - +import VersionSelectorDropdown, {DefaultItemFormatter} from './VersionSelectorDropdown' import type {Props as ContainerProps} from '../../containers/ActiveFeedVersionNavigator' import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types' import type {GtfsState, ManagerUserState} from '../../../types/reducers' @@ -141,6 +140,43 @@ export default class FeedVersionNavigator extends Component { } } + /** Show comparison dropdown if there are 2+ versions to compare. */ + _renderComparisonDropdown = () => { + const { + comparedVersionIndex, + sortedVersions, + version + } = this.props + + if (sortedVersions.length >= 2) { + const comparedFeedVersion = sortedVersions[comparedVersionIndex - 1] + const compareTitle = comparedFeedVersion ? `Comparing to Version ${comparedVersionIndex}` : 'Compare' + + // This custom formatter adds and hides the active version in the list to preserve version indexes. + const itemFormatter = (itemVersion: FeedVersion, activeVersion: ?FeedVersion) => ( + itemVersion === version + ? + : DefaultItemFormatter(itemVersion, activeVersion) + ) + + return ( + + ) + } + + return null + } + render () { const versionTitleStyle = { fontSize: '24px', @@ -177,10 +213,6 @@ export default class FeedVersionNavigator extends Component { feedSource.deployments.find(d => d.feedVersions.findIndex(v => v.id === version.id) !== -1) const dropdownTitle = `${this.messages('version')} ${feedVersionIndex} ${this.messages('of')} ${sortedVersions.length}` - const hasManyVersions = sortedVersions.length >= 2 - const comparedFeedVersion = sortedVersions[comparedVersionIndex - 1] - const comparableVersions = sortedVersions.filter(v => v !== version) - return (
{ - {/* Show comparison version selector if 2+ versions present and comparing is active. */} - {hasManyVersions && comparedVersionIndex !== null && - - } + {this._renderComparisonDropdown()} } @@ -352,7 +372,7 @@ export default class FeedVersionNavigator extends Component { renameFeedVersion={renameFeedVersion} user={user} version={this.props.version} - comparedVersion={comparedFeedVersion} + comparedVersion={sortedVersions[comparedVersionIndex - 1]} versionSection={versionSection || null} versions={sortedVersions} /> diff --git a/lib/manager/components/version/VersionSelectorDropdown.js b/lib/manager/components/version/VersionSelectorDropdown.js index 048f18eec..5de272237 100644 --- a/lib/manager/components/version/VersionSelectorDropdown.js +++ b/lib/manager/components/version/VersionSelectorDropdown.js @@ -18,7 +18,7 @@ type Props = { versions: ?Array } -const DefaultItemFormatter = (version: FeedVersion, activeVersion: ?FeedVersion) => ( +export const DefaultItemFormatter = (version: FeedVersion, activeVersion: ?FeedVersion) => ( Date: Fri, 6 Nov 2020 15:59:50 -0500 Subject: [PATCH 022/553] refactor(FeedVersionViewer): Reinstate version number prop, make various refactors. --- lib/manager/actions/versions.js | 3 +- .../version/FeedVersionNavigator.js | 3 +- .../components/version/FeedVersionTabs.js | 2 +- .../components/version/FeedVersionViewer.js | 47 +++++++++++-------- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index 3ed32a11a..d58c01f29 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -605,7 +605,8 @@ export function setComparedVersionIndex ( if (feed.feedVersions) { dispatch(setComparedVersion(feed.feedVersions[index - 1])) if (push) { - // browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${index}/compareto/${index}`) + // TODO: + // browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${activeIndex}/compareto/${index}`) } } else { console.warn('No feed versions for feed were found.', feed) diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 14f498688..907b42125 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -348,6 +348,8 @@ export default class FeedVersionNavigator extends Component { { renameFeedVersion={renameFeedVersion} user={user} version={this.props.version} - comparedVersion={sortedVersions[comparedVersionIndex - 1]} versionSection={versionSection || null} versions={sortedVersions} /> diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 8af4650ca..2475f619a 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -121,7 +121,7 @@ export default class FeedVersionTabs extends Component { htmlFor style={{fontSize: '50%', padding: '0 0.2em 0.1em'}} bsStyle={diff > 0 ? 'success' : (diff < 0 ? 'danger' : 'default')} - title={`Compared to Version ${comparedVersionIndex}`}> + title={`Difference compared to Version ${comparedVersionIndex}`}> {diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) /* refactor */} diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index aec5f4f00..cd2e5a458 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -23,7 +23,8 @@ import type {Feed, FeedVersion, GtfsPlusValidation, Note, Project} from '../../. import type {GtfsState, ManagerUserState} from '../../../types/reducers' export type Props = { - comparedVersion: FeedVersion, + comparedVersion: ?FeedVersion, + comparedVersionIndex: ?number, deleteDisabled: ?boolean, deleteFeedVersion: typeof versionsActions.deleteFeedVersion, downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken, @@ -58,13 +59,14 @@ export default class FeedVersionViewer extends Component { render () { const { + comparedVersion, + comparedVersionIndex, feedSource, feedVersionIndex, listView, newNotePosted, notesRequested, version, - comparedVersion, versions, versionSection, user @@ -98,6 +100,7 @@ export default class FeedVersionViewer extends Component { @@ -140,18 +143,18 @@ type SelectorProps = { } class VersionSectionSelector extends Component { - _renderIssuesLabel ( - version: FeedVersion, - comparedVersion: FeedVersion - ) { + _renderIssuesLabel = () => { + const { version, comparedVersion, comparedVersionIndex } = this.props + const { validationResult, validationSummary, feedLoadResult } = version + const tableFatalExceptions = getTableFatalExceptions(version) - const {validationResult, validationSummary, feedLoadResult} = version const hasCriticalError = validationSummary.loadStatus !== 'SUCCESS' || !feedLoadResult || feedLoadResult.fatalException || tableFatalExceptions.length > 0 - let highestPriority = 'UNKNOWN' + // Determine the highest priority issue (which will determine the label // color). + let highestPriority = 'UNKNOWN' if (validationResult.error_counts) { validationResult.error_counts.forEach(category => { const level = errorPriorityLevels[category.priority] @@ -160,6 +163,7 @@ class VersionSectionSelector extends Component { } }) } + const text = hasCriticalError ? 'critical error' : validationSummary.errorCount @@ -171,7 +175,11 @@ class VersionSectionSelector extends Component { const diffText = diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) diffLabel = ( - + {diffText} ) @@ -210,26 +218,27 @@ class VersionSectionSelector extends Component { } render () { - const { version, comparedVersion } = this.props + const { feedVersionIndex, version, versionSection } = this.props + const versionPath = `/feed/${version.feedSource.id}/version/${feedVersionIndex}` return ( + to={versionPath} + active={!versionSection}> Version summary + to={`${versionPath}/issues`} + active={versionSection === 'issues'}> - Validation issues {this._renderIssuesLabel(version, comparedVersion)} + Validation issues {this._renderIssuesLabel()} {isModuleEnabled('gtfsplus') ? + to={`${versionPath}/gtfsplus`} + active={versionSection === 'gtfsplus'}> GTFS+ for this version {this._renderGtfsPlusIssuesLabel(version)} @@ -237,8 +246,8 @@ class VersionSectionSelector extends Component { : null } + to={`${versionPath}/comments`} + active={versionSection === 'comments'}> Version comments{' '} {version.noteCount} From 8c3fcac8b95f182caec89ddc49fb8045546f08d9 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 6 Nov 2020 19:08:28 -0500 Subject: [PATCH 023/553] feat(FeedVersionSpanChart): Add chart to compare feed calendar spans. --- .../components/version/FeedVersionDetails.js | 24 +++++- .../version/FeedVersionSpanChart.js | 83 +++++++++++++++++++ .../components/version/FeedVersionTabs.js | 20 ++--- 3 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 lib/manager/components/version/FeedVersionSpanChart.js diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index 4f8f24980..b437d4c0f 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -19,12 +19,16 @@ import {BLOCKING_ERROR_TYPES} from '../../util/version' import VersionDateLabel from './VersionDateLabel' import VersionRetrievalBadge from './VersionRetrievalBadge' import VersionSelectorDropdown from './VersionSelectorDropdown' +import FeedVersionSpanChart from './FeedVersionSpanChart' import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' import type {ManagerUserState} from '../../../types/reducers' type Props = { + comparedVersion: ?FeedVersion, + comparedVersionIndex: ?number, feedSource: Feed, + feedVersionIndex: number, gtfsPlusValidation: GtfsPlusValidation, mergeVersions: typeof versionsActions.mergeVersions, publishFeedVersion: typeof versionsActions.publishFeedVersion, @@ -84,7 +88,15 @@ export default class FeedVersionDetails extends Component { _onClickPublish = () => this.props.publishFeedVersion(this.props.version) render () { - const {feedSource, gtfsPlusValidation, user, version} = this.props + const { + comparedVersion, + comparedVersionIndex, + feedSource, + feedVersionIndex, + gtfsPlusValidation, + user, + version + } = this.props const {validationSummary: summary} = version // We must check the version ID against the feed source in props (not the // feed source nested underneath version) because this is the only place the @@ -158,6 +170,16 @@ export default class FeedVersionDetails extends Component { {' '} + + {comparedVersion && ( + + )} + {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && isExtensionEnabled('mtc') &&
{ + return ( +
+
+
+ ) +} + +export default class TripsChart extends Component { + _renderFeedSpan = () => { + } + + render () { + const { activeVersion, comparedVersion, comparedVersionIndex } = this.props + + const activeVersionStartDate = moment(activeVersion.validationSummary.startDate) + const activeVersionEndDate = moment(activeVersion.validationSummary.endDate) + const comparedVersionStartDate = moment(comparedVersion.validationSummary.startDate) + const comparedVersionEndDate = moment(comparedVersion.validationSummary.endDate) + + const firstDate = moment.min(activeVersionStartDate, comparedVersionStartDate) + const lastDate = moment.max(activeVersionEndDate, comparedVersionEndDate) + + const numDays = lastDate.diff(firstDate, 'days') + const activeVersionOffset = activeVersionStartDate.diff(firstDate, 'days') + const activeVersionLength = activeVersionEndDate.diff(activeVersionStartDate, 'days') + const comparedVersionOffset = comparedVersionStartDate.diff(firstDate, 'days') + const comparedVersionLength = comparedVersionEndDate.diff(comparedVersionStartDate, 'days') + /* + const data = dailyTripCounts + .slice(0, maxDaysToShow) + .map((count, index) => [firstDate.clone().add(index, 'days'), count]) + const graphHeight = 30 + const spacing = 8 + const leftMargin = 50 + const rightMargin = 50 + const bottomMargin = 75 + const svgWidth = leftMargin + rightMargin + (data.length * spacing) + const svgHeight = graphHeight + bottomMargin + const maxTrips = Math.max.apply(Math, data.map(d => d[1])) + const yAxisMax = getChartMax(maxTrips) + const rowHeight = 20 + + const yAxisLabels = [ + `Version ${activeVersionIndex}`, + `Version ${comparedVersionIndex}` + ] +*/ + return ( + + + + + + + + + + + + + + + +
This version{activeVersion.validationSummary.startDate}{activeVersion.validationSummary.endDate}
Version {comparedVersionIndex}{comparedVersion.validationSummary.startDate}{comparedVersion.validationSummary.endDate}
+ ) + } +} diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 2475f619a..2e0e0be03 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -2,7 +2,7 @@ import moment from 'moment' import React, {Component} from 'react' -import {Row, Col, Tabs, Tab, ListGroupItem, Label} from 'react-bootstrap' +import {Col, Label as BsLabel, ListGroupItem, Row, Tab, Tabs} from 'react-bootstrap' import numeral from 'numeral' import {getComponentMessages, isModuleEnabled} from '../../../common/util/config' @@ -112,21 +112,19 @@ export default class FeedVersionTabs extends Component { return (
{numeral(summary[c]).format('0a')} - {comparedVersion - ? - + {diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) /* TODO: refactor */} + - : null} - + )}

{this.messages(c)}

@@ -137,7 +135,7 @@ export default class FeedVersionTabs extends Component {

- {numeral(daysActive).format('0 a')} + {numeral(daysActive).format('0a')}

{this.messages('daysActive')}

From 12ce9da508884161236a0bc9740fad4c3732a13b Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 10:43:15 -0500 Subject: [PATCH 024/553] refactor(FeedVersionSpanChart): Improve layout of spans. --- .../components/version/FeedVersionDetails.js | 19 ++--- .../version/FeedVersionSpanChart.js | 81 ++++++++++++------- 2 files changed, 61 insertions(+), 39 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index b437d4c0f..ce3858488 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -170,15 +170,6 @@ export default class FeedVersionDetails extends Component { {' '} - - {comparedVersion && ( - - )} {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && isExtensionEnabled('mtc') && @@ -201,6 +192,16 @@ export default class FeedVersionDetails extends Component {
} + + {comparedVersion && comparedVersionIndex && ( + + )} +

{summary && summary.avgDailyRevenueTime ? diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index d19ca8599..4bc3bd34c 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -13,14 +13,42 @@ type Props = { comparedVersionIndex: number } -const FeedSpan = ({ relativeLength, relativeOffset, ...props }) => { +const dateFormat = 'MMM. DD, YYYY' + +const FeedSpan = ({ + endLabel, + relativeLength, + relativeOffset, + startLabel, + widthPixels, + ...props +}) => { return ( -

-
+
+
+ {startLabel} + + {endLabel} +
) } +const noTopPadding = {padding: '0 5px'} + export default class TripsChart extends Component { _renderFeedSpan = () => { } @@ -41,40 +69,33 @@ export default class TripsChart extends Component { const activeVersionLength = activeVersionEndDate.diff(activeVersionStartDate, 'days') const comparedVersionOffset = comparedVersionStartDate.diff(firstDate, 'days') const comparedVersionLength = comparedVersionEndDate.diff(comparedVersionStartDate, 'days') - /* - const data = dailyTripCounts - .slice(0, maxDaysToShow) - .map((count, index) => [firstDate.clone().add(index, 'days'), count]) - const graphHeight = 30 - const spacing = 8 - const leftMargin = 50 - const rightMargin = 50 - const bottomMargin = 75 - const svgWidth = leftMargin + rightMargin + (data.length * spacing) - const svgHeight = graphHeight + bottomMargin - const maxTrips = Math.max.apply(Math, data.map(d => d[1])) - const yAxisMax = getChartMax(maxTrips) - const rowHeight = 20 - const yAxisLabels = [ - `Version ${activeVersionIndex}`, - `Version ${comparedVersionIndex}` - ] -*/ return ( - - - - + + - - - - + +
This version{activeVersion.validationSummary.startDate}{activeVersion.validationSummary.endDate}This version + +
Version {comparedVersionIndex}{comparedVersion.validationSummary.startDate}{comparedVersion.validationSummary.endDate}Version {comparedVersionIndex} + +
From 553e5aac64b94bf33ec690e0b1eee8ebfb33b335 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 10:56:33 -0500 Subject: [PATCH 025/553] refactor: Fix flow type --- lib/manager/components/version/FeedVersionTabs.js | 8 ++++---- lib/manager/components/version/FeedVersionViewer.js | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 2e0e0be03..bc3b3e6e3 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -19,8 +19,8 @@ import type {Element} from 'react' import type {FeedVersion} from '../../../types' type Props = { - comparedVersion: FeedVersion, - comparedVersionIndex: number, + comparedVersion: ?FeedVersion, + comparedVersionIndex: ?number, feedVersionIndex: number, isochroneBand: any, onChangeIsochroneBand: number => void, @@ -115,12 +115,12 @@ export default class FeedVersionTabs extends Component { title={`${summary[c]}`} // FIXME: do we need the title prop? style={{marginBottom: '0px', fontSize: '200%'}}> {numeral(summary[c]).format('0a')} - {comparedVersion && ( + {comparedVersion && comparedVersionIndex && ( 0 ? 'success' : (diff < 0 ? 'danger' : 'default')} - title={`Difference compared to Version ${comparedVersionIndex}`}> + title={`Difference compared to Version ${comparedVersionIndex || 'null'}`}> {diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) /* TODO: refactor */} diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index cd2e5a458..738ad4672 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -135,7 +135,8 @@ export default class FeedVersionViewer extends Component { } type SelectorProps = { - comparedVersion: FeedVersion, + comparedVersion: ?FeedVersion, + comparedVersionIndex: ?number, feedVersionIndex: number, gtfsPlusValidation: GtfsPlusValidation, version: FeedVersion, @@ -169,7 +170,7 @@ class VersionSectionSelector extends Component { : validationSummary.errorCount let diffLabel - if (comparedVersion) { + if (comparedVersion && comparedVersionIndex) { const diff = validationSummary.errorCount - comparedVersion.validationSummary.errorCount const diffColor = diff > 0 ? 'label-danger' : (diff < 0 ? 'label-success' : 'label-default') const diffText = diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) From 288d002a984e370af24c1e571ef9a6aab2087527 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 11:23:51 -0500 Subject: [PATCH 026/553] test(snapshots): Update snapshots --- .../__snapshots__/ActiveProjectViewer.js.snap | 1807 ++--------------- .../__snapshots__/DeploymentsPanel.js.snap | 1195 ++++------- .../__snapshots__/FeedSourceTable.js.snap | 1215 +---------- 3 files changed, 702 insertions(+), 3515 deletions(-) diff --git a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap index d494bc823..15b389d07 100644 --- a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap @@ -196,11 +196,14 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onHide={[Function]} @@ -212,23 +215,26 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransitionTimeout={150} + backdropTransition={[Function]} containerClassName="modal-open" - dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} + onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -247,11 +253,14 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onHide={[Function]} @@ -263,23 +272,26 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransitionTimeout={150} + backdropTransition={[Function]} containerClassName="modal-open" - dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} + onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -298,11 +310,14 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onHide={[Function]} @@ -314,23 +329,26 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransitionTimeout={150} + backdropTransition={[Function]} containerClassName="modal-open" - dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} + onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -353,11 +371,14 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onHide={[Function]} @@ -369,23 +390,26 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransitionTimeout={150} + backdropTransition={[Function]} containerClassName="modal-open" - dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { + "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, + "isTopModal": [Function], "modals": Array [], + "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} + onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -1860,18 +1884,18 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr eventKey="sources" > manager > ActiveProjectViewer should render with newly created pr onExited={[Function]} onExiting={[Function]} timeout={300} - transitionAppear={false} unmountOnExit={false} >
@@ -2059,10 +2082,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } } > - manager > ActiveProjectViewer should render with newly created pr /> } > -
-
+ manager > ActiveProjectViewer should render with newly created pr "user": null, } } - > - + } + onToggle={[Function]} + > +
manager > ActiveProjectViewer should render with newly created pr "user": null, } } - projectEditDisabled={false} - setFeedSort={[Function]} - setFeedSourceTableFilterCountStrategy={[Function]} - setVisibilityFilter={[Function]} - setVisibilitySearchText={[Function]} - sort="alphabetically-asc" - thirdPartySync={[Function]} - user={ - Object { - "isCheckingLogin": false, - "permissions": UserPermissions { - "appPermissionLookup": Object { - "administer-application": Object { - "type": "administer-application", - }, - }, - "orgPermissionLookup": Object {}, - "organizationLookup": Object {}, - "projectLookup": Object {}, - }, - "profile": Object { - "app_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "organizations": Array [], - "permissions": Array [ - Object { - "type": "administer-application", - }, - ], - "projects": Array [], - "subscriptions": Array [], - }, - ], - }, - "clientID": "mock-client-id", - "created_at": "2016-03-04T18:59:22.569Z", - "email": "mock-user@conveyal.com", - "email_verified": true, - "identities": Array [ - Object { - "connection": "Username-Password-Authentication", - "isSocial": false, - "provider": "auth0", - "user_id": "12345", - }, - ], - "jti": "gibberish", - "last_password_reset": "2017-07-13T13:58:01.021Z", - "name": "mock-user@conveyal.com", - "nickname": "mock-user", - "persistent": Object {}, - "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", - "sub": "auth0|12345", - "updated_at": "2019-03-21T19:05:30.180Z", - "user_id": "auth0|12345", - "user_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "editor": Object { - "map_id": "mapbox.streets", - }, - "hideTutorial": true, - "sidebarExpanded": false, - }, - ], - "lang": "en", - }, - }, - "recentActivity": null, - "redirectOnSuccess": null, - "subscriptions": UserSubscriptions { - "subscriptionLookup": Object {}, - }, - "token": "mock-token", - } - } - > - -
- -
- - - -
- - - -
-
- - - - - - -
- - - - - - - - - -
-
-
-
-
-
- - -
- -
- - - - - - -
-
-
- - -
- - - - -
- - - - - - - - - -
-
-
-
-
-
- -
-
- - -
- + } > -
    - -
  • - - -
  • -
    -
-
-
- + + + + + Create first feed source! + + + + + + +
+
+
@@ -3813,10 +2369,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } } > - mock-project @@ -3824,95 +2377,103 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } > -
-
-

+ mock-project summary

-
- +
+ mock-project + summary + + } > -
    - -
  • - Number of feeds: - 0 -
  • -
    - -
  • + Number of feeds: + 0 +
  • +
    + - Total errors: - 0 - - - -
  • + Total errors: + 0 +
  • +
    + - Total service: - - 0 - - hours per weekday - - -
- -
- +
  • + Total service: + + 0 + + hours per weekday +
  • + + +
    +
    +
    + - What is a feed source? } > -
    -
    -

    + What is a feed source?

    -
    + } + onToggle={[Function]} + >
    + What is a feed source? + + } > A feed source defines the location or upstream source of a @@ -3920,8 +2481,8 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr directly editing or uploading a zip file.
    -
    -
    + +
    @@ -3954,18 +2515,18 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr eventKey="deployments" > manager > ActiveProjectViewer should render with newly created pr onExited={[Function]} onExiting={[Function]} timeout={300} - transitionAppear={false} unmountOnExit={false} /> @@ -4004,18 +2564,18 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr eventKey="settings" > manager > ActiveProjectViewer should render with newly created pr onExited={[Function]} onExiting={[Function]} timeout={300} - transitionAppear={false} unmountOnExit={false} /> diff --git a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap index 8cfbbcf86..2598b8eb0 100644 --- a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap @@ -979,6 +979,7 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, }, @@ -1007,6 +1008,219 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, + "version": 1, + }, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + } + } + fetchProjectDeployments={[Function]} + fetchProjectFeeds={[Function]} + key="mock-deployment-id-0" + project={ + Object { + "autoFetchFeeds": true, + "autoFetchHour": 0, + "autoFetchMinute": 0, + "bounds": null, + "buildConfig": Object { + "fares": null, + "fetchElevationUS": null, + "stationTransfers": null, + "subwayAccessTime": null, + }, + "dateCreated": 1526305321824, + "defaultTimeZone": null, + "deployments": Array [ + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [ + Object { + "feedSource": Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, + }, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "version": 1, + }, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + }, + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [], + "id": "mock-deployment-id-1", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + }, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, "latestVersionId": "mock-feed-version-id", "name": "test feed with a version", "noteCount": 0, @@ -1020,132 +1234,24 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - [Circular], - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmFileId": null, - "otpCommit": null, - "otpVersion": null, - "project": [Circular], - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, - }, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": "mock-deployment-id-0", + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, + "useCustomOsmBounds": false, + "user": null, + } } saveDeployment={[Function]} updateDeployment={[Function]} @@ -1333,80 +1439,61 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "latest": null, "name": "mock-deployment", "organizationId": null, - "osmFileId": null, + "osmExtractUrl": null, "otpCommit": null, "otpVersion": null, - "project": Object { - "autoFetchFeeds": true, - "autoFetchHour": 0, - "autoFetchMinute": 0, - "bounds": null, - "buildConfig": Object { - "fares": null, - "fetchElevationUS": null, - "stationTransfers": null, - "subwayAccessTime": null, - }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [ - Object { - "feedSource": Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + } + } + fetchProjectDeployments={[Function]} + fetchProjectFeeds={[Function]} + key="mock-deployment-id-1" + project={ + Object { + "autoFetchFeeds": true, + "autoFetchHour": 0, + "autoFetchMinute": 0, + "bounds": null, + "buildConfig": Object { + "fares": null, + "fetchElevationUS": null, + "stationTransfers": null, + "subwayAccessTime": null, + }, + "dateCreated": 1526305321824, + "defaultTimeZone": null, + "deployments": Array [ + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [ + Object { + "feedSource": Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { "agencies": null, "agencyCount": 1, "avgDailyRevenueTime": 0, @@ -1427,429 +1514,24 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "version": 1, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - "r5": false, - "r5Version": null, - "routerId": null, - "user": null, - }, - [Circular], - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - }, - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, - } - } - saveDeployment={[Function]} - updateDeployment={[Function]} - updateProject={[Function]} - > - - - -
    - - - - - mock-deployment - - - - - - -
    -
    - - - - - 2 months ago - - - - - N/A - - - - - N/A - - - - - 1 - - - - - N/A - - - - -
    - - - - -
    -
    - - - - manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + "version": 1, }, - "version": 1, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - }, - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [], + "id": "mock-deployment-id-1", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": "mock-deployment-id-0", + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, + "useCustomOsmBounds": false, + "user": null, + } } - } - saveDeployment={[Function]} - updateDeployment={[Function]} - updateProject={[Function]} - > - manager > FeedSourceTable should render with a project with feeds - - - - - - -
    - -
    - - -
    + + Status + + + - - + - - -
    - - - - - - - - - -
    -
    -
    -
    -
    -
    - -
    - - - -
    - -
    - - - - - - - - - - - - - - - - - + + Dates Valid + + + + + + + manager > FeedSourceTable should render with a project with feeds "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, } @@ -2592,6 +1601,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, }, @@ -2630,19 +1640,20 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "latest": null, "name": "mock-deployment", "organizationId": null, - "osmFileId": null, + "osmExtractUrl": null, "otpCommit": null, "otpVersion": null, - "project": [Circular], "projectBounds": Object { "east": 0, "north": 0, "south": 0, "west": 0, }, + "projectId": "mock-project-with-deployments-id", "r5": false, "r5Version": null, "routerId": null, + "skipOsmExtract": false, "user": null, }, ], @@ -2833,6 +1844,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, } @@ -3016,19 +2028,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "stopCount": 237, "stopTimesCount": 11170, "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + } } createDeploymentFromFeedSource={[Function]} createFeedSource={[Function]} @@ -3073,6 +2073,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, } @@ -3141,6 +2142,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, }, @@ -3169,18 +2171,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "stopTimesCount": 11170, "tripCount": 415, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + "version": 1, }, ], "id": "mock-deployment-id-0", @@ -3190,60 +2181,53 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "latest": null, "name": "mock-deployment", "organizationId": null, - "osmFileId": null, + "osmExtractUrl": null, "otpCommit": null, "otpVersion": null, - "project": [Circular], "projectBounds": Object { "east": 0, "north": 0, "south": 0, "west": 0, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, "latestVersionId": "mock-feed-version-id", "name": "test feed with a version", @@ -3254,21 +2238,24 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "retrievalMethod": "MANUALLY_UPLOADED", "s3Url": null, "snapshotVersion": null, + "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": null, + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, }, "useCustomOsmBounds": false, "user": null, From cace9b30719289837eadcfd4909df818f22b58cd Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 11:42:37 -0500 Subject: [PATCH 027/553] refactor(FeedVersions*): Cleanup code --- lib/manager/actions/versions.js | 8 ++++---- lib/manager/components/version/FeedVersionDetails.js | 4 ---- lib/manager/components/version/FeedVersionNavigator.js | 1 + lib/manager/components/version/FeedVersionSpanChart.js | 1 - lib/manager/components/version/FeedVersionViewer.js | 10 ++++------ 5 files changed, 9 insertions(+), 15 deletions(-) diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index d58c01f29..983339613 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -604,10 +604,10 @@ export function setComparedVersionIndex ( return function (dispatch: dispatchFn, getState: getStateFn) { if (feed.feedVersions) { dispatch(setComparedVersion(feed.feedVersions[index - 1])) - if (push) { - // TODO: - // browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${activeIndex}/compareto/${index}`) - } + // TODO: add support for URL/browser history, e.g.: + // if (push) { + // browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${activeIndex}/compareto/${index}`) + // } } else { console.warn('No feed versions for feed were found.', feed) } diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index ce3858488..6a2d60ab8 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -28,7 +28,6 @@ type Props = { comparedVersion: ?FeedVersion, comparedVersionIndex: ?number, feedSource: Feed, - feedVersionIndex: number, gtfsPlusValidation: GtfsPlusValidation, mergeVersions: typeof versionsActions.mergeVersions, publishFeedVersion: typeof versionsActions.publishFeedVersion, @@ -92,7 +91,6 @@ export default class FeedVersionDetails extends Component { comparedVersion, comparedVersionIndex, feedSource, - feedVersionIndex, gtfsPlusValidation, user, version @@ -170,7 +168,6 @@ export default class FeedVersionDetails extends Component { {' '} - {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && isExtensionEnabled('mtc') &&
    { {comparedVersion && comparedVersionIndex && ( diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 907b42125..a4d71aa15 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -19,6 +19,7 @@ import * as deploymentActions from '../../../manager/actions/deployments' import DeploymentPreviewButton from '../DeploymentPreviewButton' import FeedVersionViewer from './FeedVersionViewer' import VersionSelectorDropdown, {DefaultItemFormatter} from './VersionSelectorDropdown' + import type {Props as ContainerProps} from '../../containers/ActiveFeedVersionNavigator' import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types' import type {GtfsState, ManagerUserState} from '../../../types/reducers' diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 4bc3bd34c..2aa334fcb 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -8,7 +8,6 @@ import type { FeedVersion } from '../../../types' type Props = { activeVersion: FeedVersion, - activeVersionIndex: number, comparedVersion: FeedVersion, comparedVersionIndex: number } diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 738ad4672..7a2037883 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -187,11 +187,9 @@ class VersionSectionSelector extends Component { } return ( - - - {text} {diffLabel} - - + + {text} {diffLabel} + ) } @@ -251,7 +249,7 @@ class VersionSectionSelector extends Component { active={versionSection === 'comments'}> Version comments{' '} - {version.noteCount} + {version.noteCount} From 9fee1f3695bf84e9424fca2e87c41aa134c1ea89 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 11:44:39 -0500 Subject: [PATCH 028/553] chore(deps): Use dev dependencies --- package.json | 2 +- yarn.lock | 93 +++++++++++++--------------------------------------- 2 files changed, 24 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index f6a9157e4..d19ea6ab3 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "^15.4.1", "react-addons-shallow-compare": "^15.4.1", "react-addons-update": "^15.4.1", - "react-bootstrap": "^0.33", + "react-bootstrap": "^0.30.0-rc.2", "react-bootstrap-datetimepicker": "^0.0.22", "react-bootstrap-table": "https://github.com/conveyal/react-bootstrap-table.git", "react-color": "^2.3.4", diff --git a/yarn.lock b/yarn.lock index 1ef28bce2..b6938c584 100644 --- a/yarn.lock +++ b/yarn.lock @@ -721,14 +721,6 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" -"@babel/runtime-corejs2@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.8.3.tgz#b62a61e0c41a90d2d91181fda6de21cecd3a9734" - integrity sha512-yxJXBKdIogkfF+wgeJrvU7Afp5ugBi92NzSgNPWWKVoQAlixH3gwMP6yYYr7SV1Dbc0HmNw7WUJkV5ksvtQuHg== - dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.2" - "@babel/runtime-corejs2@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz#c3214c08ef20341af4187f1c9fbdc357fbec96b2" @@ -758,13 +750,6 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.6.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" - integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== - dependencies: - regenerator-runtime "^0.13.2" - "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" @@ -1351,24 +1336,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== -"@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== - "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@types/react@^16.9.11": - version "16.9.19" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.19.tgz#c842aa83ea490007d29938146ff2e4d9e4360c40" - integrity sha512-LJV97//H+zqKWMms0kvxaKYJDG05U2TtQB3chRLF8MPNs+MQh/H1aGlyDUxjaHvu08EAGerdX2z4LTBc7ns77A== - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" - "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -3840,11 +3812,6 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" -csstype@^2.2.0: - version "2.6.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" - integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -7615,7 +7582,7 @@ jwt-decode@^2.1.0: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= -keycode@^2.2.0: +keycode@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= @@ -11214,22 +11181,20 @@ react-bootstrap-datetimepicker@^0.0.22: classnames "^2.1.2" react-modal "^1.4.0" -react-bootstrap@^0.33: - version "0.33.1" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.33.1.tgz#e072592aa143b9792526281272eca754bc9a4940" - integrity sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ== +react-bootstrap@^0.30.0-rc.2: + version "0.30.10" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.30.10.tgz#dbba6909595f2af4d91937db0f96ec8c2df2d1a8" + integrity sha1-27ppCVlfKvTZGTfbD5bsjC3y0ag= dependencies: - "@babel/runtime-corejs2" "^7.0.0" + babel-runtime "^6.11.6" classnames "^2.2.5" dom-helpers "^3.2.0" - invariant "^2.2.4" - keycode "^2.2.0" - prop-types "^15.6.1" - prop-types-extra "^1.0.1" - react-overlays "^0.9.0" + invariant "^2.2.1" + keycode "^2.1.2" + prop-types "^15.5.6" + react-overlays "^0.6.12" react-prop-types "^0.4.0" - react-transition-group "^2.0.0" - uncontrollable "^7.0.2" + uncontrollable "^4.0.1" warning "^3.0.0" react-color@^2.3.4: @@ -11342,16 +11307,14 @@ react-modal@^1.4.0: prop-types "^15.5.7" react-dom-factories "^1.0.0" -react-overlays@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.9.1.tgz#d4702bfe5b5e9335b676ff5a940253771fdeed12" - integrity sha512-b0asy/zHtRd0i2+2/uNxe3YVprF3bRT1guyr791DORjCzE/HSBMog+ul83CdtKQ1kZ+pLnxWCu5W3BMysFhHdQ== +react-overlays@^0.6.12: + version "0.6.12" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.6.12.tgz#a079c750cc429d7db4c7474a95b4b54033e255c3" + integrity sha1-oHnHUMxCnX20x0dKlbS1QDPiVcM= dependencies: classnames "^2.2.5" - dom-helpers "^3.2.1" - prop-types "^15.5.10" - prop-types-extra "^1.0.1" - react-transition-group "^2.2.1" + dom-helpers "^3.2.0" + react-prop-types "^0.4.0" warning "^3.0.0" react-prop-types@^0.4.0: @@ -11446,7 +11409,7 @@ react-transition-group@^2.2.1, react-transition-group@^2.6.1: resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: - dom-helpers "^3.3.1" + dom-helpers "^3.4.0" loose-envify "^1.4.0" prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" @@ -13769,15 +13732,12 @@ umd@^3.0.0: resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== -uncontrollable@^7.0.2: - version "7.1.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" - integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q== +uncontrollable@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9" + integrity sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak= dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" "^16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" + invariant "^2.1.0" undeclared-identifiers@^1.1.2: version "1.1.3" @@ -14112,13 +14072,6 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -warning@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - watchify-middleware@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/watchify-middleware/-/watchify-middleware-1.8.2.tgz#be84fd318049cc281f0a1da274410f9ba45a7c1e" From 97ad860ac3ca643a88bea6ea4794835f140a6853 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 11:52:45 -0500 Subject: [PATCH 029/553] revert: Revert commit 288d002 --- .../__snapshots__/ActiveProjectViewer.js.snap | 1807 ++++++- .../__snapshots__/DeploymentsPanel.js.snap | 1830 ++++--- .../__snapshots__/FeedSourceTable.js.snap | 4395 +++++++++++------ 3 files changed, 5464 insertions(+), 2568 deletions(-) diff --git a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap index 15b389d07..d494bc823 100644 --- a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap @@ -196,14 +196,11 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onHide={[Function]} @@ -215,26 +212,23 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransition={[Function]} + backdropTransitionTimeout={150} containerClassName="modal-open" + dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} - onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -253,14 +247,11 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onHide={[Function]} @@ -272,26 +263,23 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransition={[Function]} + backdropTransitionTimeout={150} containerClassName="modal-open" + dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} - onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -310,14 +298,11 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onHide={[Function]} @@ -329,26 +314,23 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransition={[Function]} + backdropTransitionTimeout={150} containerClassName="modal-open" + dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} - onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -371,14 +353,11 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onHide={[Function]} @@ -390,26 +369,23 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransition={[Function]} + backdropTransitionTimeout={150} containerClassName="modal-open" + dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} - onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -1884,18 +1860,18 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr eventKey="sources" > manager > ActiveProjectViewer should render with newly created pr onExited={[Function]} onExiting={[Function]} timeout={300} + transitionAppear={false} unmountOnExit={false} >
    @@ -2082,7 +2059,10 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } } > - manager > ActiveProjectViewer should render with newly created pr /> } > - +
    manager > ActiveProjectViewer should render with newly created pr "user": null, } } - /> - } - onToggle={[Function]} - > -
    + manager > ActiveProjectViewer should render with newly created pr "user": null, } } - /> - } + projectEditDisabled={false} + setFeedSort={[Function]} + setFeedSourceTableFilterCountStrategy={[Function]} + setVisibilityFilter={[Function]} + setVisibilitySearchText={[Function]} + sort="alphabetically-asc" + thirdPartySync={[Function]} + user={ + Object { + "isCheckingLogin": false, + "permissions": UserPermissions { + "appPermissionLookup": Object { + "administer-application": Object { + "type": "administer-application", + }, + }, + "orgPermissionLookup": Object {}, + "organizationLookup": Object {}, + "projectLookup": Object {}, + }, + "profile": Object { + "app_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "organizations": Array [], + "permissions": Array [ + Object { + "type": "administer-application", + }, + ], + "projects": Array [], + "subscriptions": Array [], + }, + ], + }, + "clientID": "mock-client-id", + "created_at": "2016-03-04T18:59:22.569Z", + "email": "mock-user@conveyal.com", + "email_verified": true, + "identities": Array [ + Object { + "connection": "Username-Password-Authentication", + "isSocial": false, + "provider": "auth0", + "user_id": "12345", + }, + ], + "jti": "gibberish", + "last_password_reset": "2017-07-13T13:58:01.021Z", + "name": "mock-user@conveyal.com", + "nickname": "mock-user", + "persistent": Object {}, + "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", + "sub": "auth0|12345", + "updated_at": "2019-03-21T19:05:30.180Z", + "user_id": "auth0|12345", + "user_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "editor": Object { + "map_id": "mapbox.streets", + }, + "hideTutorial": true, + "sidebarExpanded": false, + }, + ], + "lang": "en", + }, + }, + "recentActivity": null, + "redirectOnSuccess": null, + "subscriptions": UserSubscriptions { + "subscriptionLookup": Object {}, + }, + "token": "mock-token", + } + } + > + +
    +
    +
    +
    + + +
    + + + +
    +
    + + + + + + +
    + + + + + + + + + +
    +
    +
    +
    +
    +
    + + +
    + +
    + + + + + + +
    +
    +
    + +
    +
    + + + + +
    + + + + + + + + + +
    +
    +
    +
    +
    +
    + + + + + + + - -
      - -
    • - - -
    • -
      -
    -
    - - - + + + + Create first feed source! + + + + + +
    + + @@ -2369,7 +3813,10 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } } > - mock-project @@ -2377,103 +3824,95 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } > - +
    +
    +

    mock-project summary

    - } - onToggle={[Function]} - > -
    - mock-project - summary - - } +
    + - -
      - -
    • - Number of feeds: - 0 -
    • -
      - + + +
    • -
    • - Total errors: - 0 -
    • -
      - + + +
    • -
    • - Total service: - - 0 - - hours per weekday -
    • -
      -
    -
    -
    - - + Total service: + + 0 + + hours per weekday + + + + +
    +
    - What is a feed source? } > - +
    +
    +

    What is a feed source?

    - } - onToggle={[Function]} - > +
    - What is a feed source? - - } + className="panel-body" + key="0" > A feed source defines the location or upstream source of a @@ -2481,8 +3920,8 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr directly editing or uploading a zip file.
    - - +
    +
    @@ -2515,18 +3954,18 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr eventKey="deployments" > manager > ActiveProjectViewer should render with newly created pr onExited={[Function]} onExiting={[Function]} timeout={300} + transitionAppear={false} unmountOnExit={false} /> @@ -2564,18 +4004,18 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr eventKey="settings" > manager > ActiveProjectViewer should render with newly created pr onExited={[Function]} onExiting={[Function]} timeout={300} + transitionAppear={false} unmountOnExit={false} /> diff --git a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap index 2598b8eb0..e48ea83b0 100644 --- a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap @@ -476,14 +476,11 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onHide={[Function]} @@ -495,26 +492,23 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym autoFocus={true} backdrop={true} backdropClassName="modal-backdrop" - backdropTransition={[Function]} + backdropTransitionTimeout={150} containerClassName="modal-open" + dialogTransitionTimeout={300} enforceFocus={true} keyboard={true} manager={ ModalManager { - "add": [Function], "containers": Array [], "data": Array [], "handleContainerOverflow": true, "hideSiblingNodes": true, - "isTopModal": [Function], "modals": Array [], - "remove": [Function], } } onEntering={[Function]} onExited={[Function]} onHide={[Function]} - onMouseUp={[Function]} renderBackdrop={[Function]} restoreFocus={true} show={false} @@ -754,7 +748,10 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym updateDeployment={[Function]} updateProject={[Function]} > - manager > DeploymentsPanel should render with the list of deploym } > - +
    -
    - - - - - - - } - onToggle={[Function]} - > -
    - +
    + + + +
    - + + + - - } + + + +
    - -

    - Deployed Version -

    -
    -

    - Latest Version -

    -
    -
    -

    - - - - Feed Info -

    -
    -

    - - - - Status -

    -
    -

    - - - - Status -

    -
    -

    - - - - Dates Valid -

    -
    -

    - - - - Issues -

    -
    -
    +

    + + + + Issues +

    +
    +
    -
    -
    - - - - - - - - - - - - + + + + + + + + + + + manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "version": 1, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "version": 1, }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - } + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, + }, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, } - fetchProjectDeployments={[Function]} - fetchProjectFeeds={[Function]} - key="mock-deployment-id-0" - project={ - Object { - "autoFetchFeeds": true, - "autoFetchHour": 0, - "autoFetchMinute": 0, - "bounds": null, - "buildConfig": Object { - "fares": null, - "fetchElevationUS": null, - "stationTransfers": null, - "subwayAccessTime": null, - }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [ - Object { - "feedSource": Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { + } + fetchProjectDeployments={[Function]} + fetchProjectFeeds={[Function]} + key="mock-deployment-id-0" + project={ + Object { + "autoFetchFeeds": true, + "autoFetchHour": 0, + "autoFetchMinute": 0, + "bounds": null, + "buildConfig": Object { + "fares": null, + "fetchElevationUS": null, + "stationTransfers": null, + "subwayAccessTime": null, + }, + "dateCreated": 1526305321824, + "defaultTimeZone": null, + "deployments": Array [ + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [ + Object { + "feedSource": Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { "agencies": null, "agencyCount": 1, "avgDailyRevenueTime": 0, @@ -1131,407 +1075,407 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "version": 1, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "version": 1, }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + }, + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [], + "id": "mock-deployment-id-1", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + }, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - "useCustomOsmBounds": false, - "user": null, - } + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": "mock-deployment-id-0", + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, + }, + "useCustomOsmBounds": false, + "user": null, } - saveDeployment={[Function]} - updateDeployment={[Function]} - updateProject={[Function]} + } + saveDeployment={[Function]} + updateDeployment={[Function]} + updateProject={[Function]} + > + - - - - - - - - + + + + + + - - - + + + + + + + + + + + manager > DeploymentsPanel should render with the list of deploym "stopTimesCount": 11170, "tripCount": 415, }, - "version": 1, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, + }, + "version": 1, }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [], - "id": "mock-deployment-id-1", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + }, + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [], + "id": "mock-deployment-id-1", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, + }, + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": "mock-deployment-id-0", - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - "useCustomOsmBounds": false, - "user": null, - } + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": "mock-deployment-id-0", + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, + }, + "useCustomOsmBounds": false, + "user": null, } - saveDeployment={[Function]} - updateDeployment={[Function]} - updateProject={[Function]} + } + saveDeployment={[Function]} + updateDeployment={[Function]} + updateProject={[Function]} + > + - - - - - - - - + + + + + + - - - -
    - Name - - Created - - Last deployed - - Deployed to - - # of feeds - - Test? - -
    + Name + + Created + + Last deployed + + Deployed to + + # of feeds + + Test? + +
    - + +
    -
    - - - - - mock-deployment - - - - - + mock-deployment + + -
    - -
    - - - 2 months ago - - - - N/A - - - - N/A - - - - 1 - - - - N/A - - - -
    -
    + +
    + + + 2 months ago + + + + N/A + + + + N/A + + + + 1 + + + + N/A + + + +
    + - -
    -
    -
    - + +
    -
    - - - - - mock-deployment - - - - - + mock-deployment + + -
    - -
    - - - 2 months ago - - - - N/A - - - - N/A - - - - 0 - - - - N/A - - - -
    -
    + +
    + + + 2 months ago + + + + N/A + + + + N/A + + + + 0 + + + + N/A + + + +
    + - -
    -
    -
    - -
    - - + +
    + + + + + + + + + + + + + + @@ -1857,36 +1838,40 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym
    - Deploying feeds to OTP } > - +
    +
    +

    Deploying feeds to OTP

    - } - onToggle={[Function]} - > +
    - Deploying feeds to OTP - - } + className="panel-body" + key="0" > -

    +

    A collection of feeds can be deployed to OpenTripPlanner (OTP) instances that have been defined in the organization settings.

    @@ -1919,6 +1904,7 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym @@ -1950,8 +1936,8 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym
    - - +
    +
    diff --git a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap index 8ad7978e7..ca635b27a 100644 --- a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap @@ -555,7 +555,10 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds } } > - manager > FeedSourceTable should render with a project with feeds /> } > - +
    manager > FeedSourceTable should render with a project with feeds "user": null, } } - /> - } - onToggle={[Function]} - > -
    + manager > FeedSourceTable should render with a project with feeds "user": null, } } - /> - } - > - -
    - - - - - - - - - - - - - - - - + +
    +
    +
    +
    + + +
    + + + +
    +
    + + + + + + +
    + + + + + + + + + +
    +
    +
    +
    +
    +
    + + +
    + +
    + + + + + + +
    +
    +
    + +
    +
    + + + + +
    + + + + + + + + + +
    +
    +
    +
    +
    +
    + + + + + + + +
    +
    - -

    - Deployed Version -

    -
    -

    - Latest Version -

    -
    -
    -

    - - - - Feed Info -

    -
    -

    - - - - Status -

    -
    -

    - - - - Status -

    -
    -

    - - - - Dates Valid -

    -
    -

    - - - - Issues -

    -
    -
    + + + + + + + + + + + + + + + + manager > FeedSourceTable should render with a project with feeds "user": null, } } - > - + + - - - - + + + +
    -
    - - - - Private -
    - -
    - - - - -
    + - + - - - + + + - - - - -
    + +

    + Deployed Version +

    +
    +

    + Latest Version +

    +
    +
    +

    + + + + Feed Info +

    +
    +

    + + + + Status +

    +
    +

    + + + + Status +

    +
    +

    + + + + Dates Valid +

    +
    +

    + + + + Issues +

    +
    +
    + manager > FeedSourceTable should render with a project with feeds "transformRules": Array [], "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", "user": null, - }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": null, - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, - }, - "useCustomOsmBounds": false, - "user": null, - } - } - runFetchFeed={[Function]} - updateFeedSource={[Function]} - uploadFeed={[Function]} - user={ - Object { - "isCheckingLogin": false, - "permissions": UserPermissions { - "appPermissionLookup": Object { - "administer-application": Object { - "type": "administer-application", - }, - }, - "orgPermissionLookup": Object {}, - "organizationLookup": Object {}, - "projectLookup": Object {}, - }, - "profile": Object { - "app_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "organizations": Array [], - "permissions": Array [ - Object { - "type": "administer-application", - }, - ], - "projects": Array [], - "subscriptions": Array [], - }, - ], - }, - "clientID": "mock-client-id", - "created_at": "2016-03-04T18:59:22.569Z", - "email": "mock-user@conveyal.com", - "email_verified": true, - "identities": Array [ - Object { - "connection": "Username-Password-Authentication", - "isSocial": false, - "provider": "auth0", - "user_id": "12345", - }, - ], - "jti": "gibberish", - "last_password_reset": "2017-07-13T13:58:01.021Z", - "name": "mock-user@conveyal.com", - "nickname": "mock-user", - "persistent": Object {}, - "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", - "sub": "auth0|12345", - "updated_at": "2019-03-21T19:05:30.180Z", - "user_id": "auth0|12345", - "user_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "editor": Object { - "map_id": "mapbox.streets", - }, - "hideTutorial": true, - "sidebarExpanded": false, - }, - ], - "lang": "en", - }, - }, - "recentActivity": null, - "redirectOnSuccess": null, - "subscriptions": UserSubscriptions { - "subscriptionLookup": Object {}, - }, - "token": "mock-token", - } - } - > -
    - -
    -

    - +
    +

    + + - - test feed with a version - - -

    -
    - Last updated Nov 27, 2018 -
    - + +

    +
    + Last updated Nov 27, 2018 +
    + +
    -
    -
    + + Private + + + + + + + + - -
    - - - - - Active - -
    + + - Valid for another 2 months -
    - (Aug 1, 2019) -
    + + + Active + +
    + Valid for another 2 months +
    + (Aug 1, 2019)
    - -
    + + + - -
    - - - - - Same as Deployed - -
    + + - Last updated 5 months ago -
    + + + Same as Deployed + +
    + Last updated 5 months ago
    - -
    - Aug 1, 2018 - - -
    - Aug 1, 2019 -
    - 78 - - + + + Aug 1, 2018 + - +
    + Aug 1, 2019 +
    + 78 + + manager > FeedSourceTable should render with a project with feeds "stopCount": 237, "stopTimesCount": 11170, "tripCount": 415, - } - } - createDeploymentFromFeedSource={[Function]} - createFeedSource={[Function]} - deleteFeedSource={[Function]} - feedSource={ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - } + }, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, } - project={ - Object { - "autoFetchFeeds": true, - "autoFetchHour": 0, - "autoFetchMinute": 0, - "bounds": null, - "buildConfig": Object { - "fares": null, - "fetchElevationUS": null, - "stationTransfers": null, - "subwayAccessTime": null, - }, - "dateCreated": 1526305321824, - "defaultTimeZone": null, - "deployments": Array [ - Object { - "customBuildConfig": null, - "customRouterConfig": null, - "dateCreated": 1553292345720, - "deployJobSummaries": Array [], - "deployedTo": null, - "ec2Instances": Array [], - "feedSourceId": null, - "feedVersions": Array [ - Object { - "feedSource": Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, - }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, - }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, - }, - "id": "mock-feed-version-id", - "nextVersionId": null, - "previousVersionId": null, - "updated": 1543389038810, - "validationResult": Object { + } + project={ + Object { + "autoFetchFeeds": true, + "autoFetchHour": 0, + "autoFetchMinute": 0, + "bounds": null, + "buildConfig": Object { + "fares": null, + "fetchElevationUS": null, + "stationTransfers": null, + "subwayAccessTime": null, + }, + "dateCreated": 1526305321824, + "defaultTimeZone": null, + "deployments": Array [ + Object { + "customBuildConfig": null, + "customRouterConfig": null, + "dateCreated": 1553292345720, + "deployJobSummaries": Array [], + "deployedTo": null, + "ec2Instances": Array [], + "feedSourceId": null, + "feedVersions": Array [ + Object { + "feedSource": Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { "agencies": null, "agencyCount": 1, "avgDailyRevenueTime": 0, @@ -2171,687 +3615,712 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "stopTimesCount": 11170, "tripCount": 415, }, - "version": 1, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - ], - "id": "mock-deployment-id-0", - "invalidFeedSources": Array [], - "lastDeployed": null, - "lastUpdated": 1553292345726, - "latest": null, - "name": "mock-deployment", - "organizationId": null, - "osmExtractUrl": null, - "otpCommit": null, - "otpVersion": null, - "projectBounds": Object { - "east": 0, - "north": 0, - "south": 0, - "west": 0, - }, - "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, - "routerId": null, - "skipOsmExtract": false, - "user": null, - }, - ], - "feedSources": Array [ - Object { - "dateCreated": 1536195264564, - "deployable": false, - "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", - "externalProperties": Object {}, - "id": "mock-feed-with-version-id", - "isPublic": false, - "lastFetched": 1543389038810, - "lastUpdated": 1543389038810, - "latestValidation": Object { - "agencies": null, - "agencyCount": 1, - "avgDailyRevenueTime": 0, - "bounds": Object { - "east": -76.481211, - "north": 39.0486949672717, - "south": 38.92884, - "west": -76.5673055566884, + "id": "mock-feed-version-id", + "nextVersionId": null, + "previousVersionId": null, + "updated": 1543389038810, + "validationResult": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, + }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, - "endDate": "20190801", - "errorCount": 78, - "feedVersionId": "mock-feed-version-id", - "loadFailureReason": null, - "loadStatus": "SUCCESS", - "routeCount": 10, - "startDate": "20180801", - "stopCount": 237, - "stopTimesCount": 11170, - "tripCount": 415, + "version": 1, }, - "latestVersionId": "mock-feed-version-id", - "name": "test feed with a version", - "noteCount": 0, - "organizationId": null, - "projectId": "mock-project-id", - "publishedVersionId": null, - "retrievalMethod": "MANUALLY_UPLOADED", - "s3Url": null, - "snapshotVersion": null, - "transformRules": Array [], - "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", - "user": null, + ], + "id": "mock-deployment-id-0", + "invalidFeedSources": Array [], + "lastDeployed": null, + "lastUpdated": 1553292345726, + "latest": null, + "name": "mock-deployment", + "organizationId": null, + "osmExtractUrl": null, + "otpCommit": null, + "otpVersion": null, + "projectBounds": Object { + "east": 0, + "north": 0, + "south": 0, + "west": 0, }, - ], - "id": "mock-project-with-deployments-id", - "lastUpdated": 1553236399556, - "name": "mock-project-with-deployments", - "organizationId": null, - "otpServers": Array [], - "pinnedDeploymentId": null, - "routerConfig": Object { - "carDropoffTime": null, - "numItineraries": null, - "requestLogFile": null, - "stairsReluctance": null, - "updaters": null, - "walkSpeed": null, + "projectId": "mock-project-with-deployments-id", + "r5": false, + "r5Version": null, + "routerId": null, + "skipOsmExtract": false, + "user": null, }, - "useCustomOsmBounds": false, - "user": null, - } - } - runFetchFeed={[Function]} - updateFeedSource={[Function]} - uploadFeed={[Function]} - user={ - Object { - "isCheckingLogin": false, - "permissions": UserPermissions { - "appPermissionLookup": Object { - "administer-application": Object { - "type": "administer-application", + ], + "feedSources": Array [ + Object { + "dateCreated": 1536195264564, + "deployable": false, + "editorNamespace": "gzek_ztquwiwjmselpeswgbsrre", + "externalProperties": Object {}, + "id": "mock-feed-with-version-id", + "isPublic": false, + "lastFetched": 1543389038810, + "lastUpdated": 1543389038810, + "latestValidation": Object { + "agencies": null, + "agencyCount": 1, + "avgDailyRevenueTime": 0, + "bounds": Object { + "east": -76.481211, + "north": 39.0486949672717, + "south": 38.92884, + "west": -76.5673055566884, }, + "endDate": "20190801", + "errorCount": 78, + "feedVersionId": "mock-feed-version-id", + "loadFailureReason": null, + "loadStatus": "SUCCESS", + "routeCount": 10, + "startDate": "20180801", + "stopCount": 237, + "stopTimesCount": 11170, + "tripCount": 415, }, - "orgPermissionLookup": Object {}, - "organizationLookup": Object {}, - "projectLookup": Object {}, + "latestVersionId": "mock-feed-version-id", + "name": "test feed with a version", + "noteCount": 0, + "organizationId": null, + "projectId": "mock-project-id", + "publishedVersionId": null, + "retrievalMethod": "MANUALLY_UPLOADED", + "s3Url": null, + "snapshotVersion": null, + "transformRules": Array [], + "url": "http://mdtrip.org/googletransit/AnnapolisTransit/google_transit.zip", + "user": null, }, - "profile": Object { - "app_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "organizations": Array [], - "permissions": Array [ - Object { - "type": "administer-application", - }, - ], - "projects": Array [], - "subscriptions": Array [], - }, - ], + ], + "id": "mock-project-with-deployments-id", + "lastUpdated": 1553236399556, + "name": "mock-project-with-deployments", + "organizationId": null, + "otpServers": Array [], + "pinnedDeploymentId": null, + "routerConfig": Object { + "carDropoffTime": null, + "numItineraries": null, + "requestLogFile": null, + "stairsReluctance": null, + "updaters": null, + "walkSpeed": null, + }, + "useCustomOsmBounds": false, + "user": null, + } + } + runFetchFeed={[Function]} + updateFeedSource={[Function]} + uploadFeed={[Function]} + user={ + Object { + "isCheckingLogin": false, + "permissions": UserPermissions { + "appPermissionLookup": Object { + "administer-application": Object { + "type": "administer-application", }, - "clientID": "mock-client-id", - "created_at": "2016-03-04T18:59:22.569Z", - "email": "mock-user@conveyal.com", - "email_verified": true, - "identities": Array [ + }, + "orgPermissionLookup": Object {}, + "organizationLookup": Object {}, + "projectLookup": Object {}, + }, + "profile": Object { + "app_metadata": Object { + "datatools": Array [ Object { - "connection": "Username-Password-Authentication", - "isSocial": false, - "provider": "auth0", - "user_id": "12345", + "client_id": "mock-client-id", + "organizations": Array [], + "permissions": Array [ + Object { + "type": "administer-application", + }, + ], + "projects": Array [], + "subscriptions": Array [], }, ], - "jti": "gibberish", - "last_password_reset": "2017-07-13T13:58:01.021Z", - "name": "mock-user@conveyal.com", - "nickname": "mock-user", - "persistent": Object {}, - "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", - "sub": "auth0|12345", - "updated_at": "2019-03-21T19:05:30.180Z", - "user_id": "auth0|12345", - "user_metadata": Object { - "datatools": Array [ - Object { - "client_id": "mock-client-id", - "editor": Object { - "map_id": "mapbox.streets", - }, - "hideTutorial": true, - "sidebarExpanded": false, - }, - ], - "lang": "en", - }, }, - "recentActivity": null, - "redirectOnSuccess": null, - "subscriptions": UserSubscriptions { - "subscriptionLookup": Object {}, + "clientID": "mock-client-id", + "created_at": "2016-03-04T18:59:22.569Z", + "email": "mock-user@conveyal.com", + "email_verified": true, + "identities": Array [ + Object { + "connection": "Username-Password-Authentication", + "isSocial": false, + "provider": "auth0", + "user_id": "12345", + }, + ], + "jti": "gibberish", + "last_password_reset": "2017-07-13T13:58:01.021Z", + "name": "mock-user@conveyal.com", + "nickname": "mock-user", + "persistent": Object {}, + "picture": "https://s.gravatar.com/avatar/f8660ca52d1229e3d55e88f2db4affda?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmu.png", + "sub": "auth0|12345", + "updated_at": "2019-03-21T19:05:30.180Z", + "user_id": "auth0|12345", + "user_metadata": Object { + "datatools": Array [ + Object { + "client_id": "mock-client-id", + "editor": Object { + "map_id": "mapbox.streets", + }, + "hideTutorial": true, + "sidebarExpanded": false, + }, + ], + "lang": "en", }, - "token": "mock-token", - } + }, + "recentActivity": null, + "redirectOnSuccess": null, + "subscriptions": UserSubscriptions { + "subscriptionLookup": Object {}, + }, + "token": "mock-token", } + } + > + - - - - -
    - - - - - + + + + + - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - + + + Delete + + + + + + + +
    + + + + + + + + + + + + + + +
    From 2fcc8e54e7825bd752bb11fb84287027cf6a2d75 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 9 Nov 2020 12:35:39 -0500 Subject: [PATCH 030/553] refactor(FeedVersionSpanChart): Add comment to component... rename to proper name. --- .../version/FeedVersionSpanChart.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 2aa334fcb..0086f2708 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -14,6 +14,7 @@ type Props = { const dateFormat = 'MMM. DD, YYYY' +/** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ endLabel, relativeLength, @@ -22,22 +23,24 @@ const FeedSpan = ({ widthPixels, ...props }) => { + // Date labels and validity span occupy a third of the width available. + const baseWidth = widthPixels / 3 return (
    {startLabel} + style={{ display: 'inline-block', textAlign: 'right', width: `${baseWidth}px` }}>{startLabel} {endLabel} @@ -48,10 +51,12 @@ const FeedSpan = ({ const noTopPadding = {padding: '0 5px'} -export default class TripsChart extends Component { - _renderFeedSpan = () => { - } - +/** + * This component visually displays the validity span of two feed versions + * using spans that show an overlap or a gap according to the + * validity of the active andf compared feed versions. + */ +export default class FeedVersionSpanChart extends Component { render () { const { activeVersion, comparedVersion, comparedVersionIndex } = this.props From 0980eb95b14f3ee65bee01b374335dbfeeef0a5c Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 11 Nov 2020 12:59:52 -0500 Subject: [PATCH 031/553] fix(UserRow): show project permissions summary in label fix #622 --- i18n/english.yml | 2 ++ lib/admin/components/UserRow.js | 63 +++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 5d8a0e331..335cbf134 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -773,6 +773,8 @@ components: delete: Delete deleteConfirm: Are you sure you want to permanently delete this user? edit: Edit + missingProject: unknown + noProjectsFound: No projects orgAdmin: Org admin save: Save UserSettings: diff --git a/lib/admin/components/UserRow.js b/lib/admin/components/UserRow.js index 2da862d8e..0933775a2 100644 --- a/lib/admin/components/UserRow.js +++ b/lib/admin/components/UserRow.js @@ -3,6 +3,7 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import {Row, Col, Button, Label as BsLabel, Image, ListGroupItem} from 'react-bootstrap' +import uuidv4 from 'uuid/v4' import * as adminActions from '../actions/admin' import ConfirmModal from '../../common/components/ConfirmModal' @@ -15,6 +16,9 @@ import UserSettings from './UserSettings' import type {UserProfile, Organization, Project} from '../../types' import type {ManagerUserState} from '../../types/reducers' +// Generate random value to avoid conflicting with an existing project name/id. +const MISSING_PROJECT_VALUE = uuidv4() + type Props = { creatingUser: ManagerUserState, deleteUser: typeof adminActions.deleteUser, @@ -41,6 +45,57 @@ export default class UserRow extends Component { this.toggleExpansion() } + /** + * Constructs label indicating user authorization level (e.g., app/org admin) + * or listing the projects the user has access to. + */ + _getUserPermissionLabel = (permissions: UserPermissions) => { + const {projects} = this.props + // Default label to no projects found. + let labelText = this.messages('noProjectsFound') + let missingProjectCount = 0 + let labelStyle, title + if (permissions.isApplicationAdmin()) { + labelStyle = 'danger' + labelText = this.messages('appAdmin') + } else if (permissions.canAdministerAnOrganization()) { + labelStyle = 'warning' + labelText = this.messages('orgAdmin') + } else { + const missingProjectIds = [] + // Find project names for any projects that exist. + const projectNames = Object.keys(permissions.projectLookup) + .map(id => { + const project = projects.find(p => p.id === id) + // Use name of project for label (or track missing project with uuid). + // A missing project can occur when the same Auth0 tenant is used for + // multiple instances of Data Tools or if a project is deleted (but + // the permission is still attached to the user). + if (project) return project.name + missingProjectCount++ + missingProjectIds.push(id) + return MISSING_PROJECT_VALUE + }) + .filter(name => name) + // Store project ids in title if needed on hover. + title = `${this.messages('missingProject')}: ${missingProjectIds.join(', ')}` + const uniqueProjectNames = Array.from(new Set(projectNames)) + // Build message based on number of projects. + if (uniqueProjectNames.length > 0) { + // Use warning label if user has missing projects. + labelStyle = missingProjectCount > 0 ? 'warning' : 'info' + labelText = uniqueProjectNames + // Replace uuid with missing project count message. + .map(name => name === MISSING_PROJECT_VALUE + ? `${missingProjectCount} ${this.messages('missingProject')}` + : name + ) + .join(', ') + } + } + return {labelText} + } + save = () => { const settings = this.refs.userSettings.getSettings() this.props.updateUserData(this.props.user, settings) @@ -92,12 +147,8 @@ export default class UserRow extends Component {
    {user.email}{' '} - {permissions.isApplicationAdmin() - ? {this.messages('appAdmin')} - : permissions.canAdministerAnOrganization() - ? {this.messages('orgAdmin')} - : null - }{' '} + {this._getUserPermissionLabel(permissions)} + {' '} {userOrganization && creatorIsApplicationAdmin ? {userOrganization.name} : null From c0a89cbdf469c637afaa83e33500242aab483961 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 11 Nov 2020 13:13:47 -0500 Subject: [PATCH 032/553] refactor(UserRow): only show title for missing projects --- i18n/english.yml | 2 +- lib/admin/components/UserRow.js | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 335cbf134..7a2d6da5d 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -773,7 +773,7 @@ components: delete: Delete deleteConfirm: Are you sure you want to permanently delete this user? edit: Edit - missingProject: unknown + missingProject: Unknown project noProjectsFound: No projects orgAdmin: Org admin save: Save diff --git a/lib/admin/components/UserRow.js b/lib/admin/components/UserRow.js index 0933775a2..75778eeaa 100644 --- a/lib/admin/components/UserRow.js +++ b/lib/admin/components/UserRow.js @@ -77,13 +77,16 @@ export default class UserRow extends Component { return MISSING_PROJECT_VALUE }) .filter(name => name) - // Store project ids in title if needed on hover. - title = `${this.messages('missingProject')}: ${missingProjectIds.join(', ')}` const uniqueProjectNames = Array.from(new Set(projectNames)) // Build message based on number of projects. if (uniqueProjectNames.length > 0) { - // Use warning label if user has missing projects. - labelStyle = missingProjectCount > 0 ? 'warning' : 'info' + if (missingProjectCount > 0) { + // If any missing project ids, use warning label and show in title. + labelStyle = 'warning' + title = `${this.messages('missingProject')}: ${missingProjectIds.join(', ')}` + } else { + labelStyle = 'info' + } labelText = uniqueProjectNames // Replace uuid with missing project count message. .map(name => name === MISSING_PROJECT_VALUE From a1ec79259f8cb06c5f3a22cbf13d20eb50fd4e10 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 11 Nov 2020 13:28:18 -0500 Subject: [PATCH 033/553] refactor(english.yml): change UserRow#missingProject to unknown --- i18n/english.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/english.yml b/i18n/english.yml index 7a2d6da5d..335cbf134 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -773,7 +773,7 @@ components: delete: Delete deleteConfirm: Are you sure you want to permanently delete this user? edit: Edit - missingProject: Unknown project + missingProject: unknown noProjectsFound: No projects orgAdmin: Org admin save: Save From 0445e120afda4c6b85efa6d6851c648746944bd2 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 11 Nov 2020 17:13:38 -0500 Subject: [PATCH 034/553] feat(UserList): add users per page selector works with changes in ibi-group/datatools-server#353 --- i18n/english.yml | 1 + lib/admin/actions/admin.js | 20 ++++++++++------- lib/admin/components/UserList.js | 38 +++++++++++++++++++++++++++++++- lib/admin/components/UserRow.js | 17 +++++++++----- lib/admin/reducers/users.js | 6 +++-- 5 files changed, 66 insertions(+), 16 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 335cbf134..7de834a81 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -764,6 +764,7 @@ components: UserList: filterByOrg: Filter by org. of: of + perPage: Users per page search: Search by username showing: Showing Users title: User Management diff --git a/lib/admin/actions/admin.js b/lib/admin/actions/admin.js index 3ece5ac32..493a84349 100644 --- a/lib/admin/actions/admin.js +++ b/lib/admin/actions/admin.js @@ -1,6 +1,7 @@ // @flow import {createAction, type ActionType} from 'redux-actions' +import qs from 'qs' import {createVoidPayloadAction, secureFetch} from '../../common/actions' import {setErrorMessage} from '../../manager/actions/status' @@ -47,6 +48,10 @@ export const setUserPage = createAction( 'SET_USER_PAGE', (payload: number) => payload ) +export const setUserPerPage = createAction( + 'SET_USER_PER_PAGE', + (payload: number) => payload +) export const setUserQueryString = createAction( 'SET_USER_QUERY_STRING', (payload: string) => payload @@ -56,6 +61,7 @@ export type AdminActions = ActionType | ActionType | ActionType | ActionType | + ActionType | ActionType | ActionType | ActionType | @@ -64,17 +70,15 @@ export type AdminActions = ActionType | export function fetchUsers () { return function (dispatch: dispatchFn, getState: getStateFn) { dispatch(requestingUsers()) - const queryString = getState().admin.users.userQueryString - + const {page, perPage, userQueryString: queryString} = getState().admin.users let countUrl = '/api/manager/secure/usercount' - if (queryString) countUrl += `?queryString=${queryString}` + if (queryString) countUrl += `?${qs.stringify({queryString})}` const getCount = dispatch(secureFetch(countUrl)) - .then(response => response.json()) - - let usersUrl = `/api/manager/secure/user?page=${getState().admin.users.page}` - if (queryString) usersUrl += `&queryString=${queryString}` + .then(res => res.json()) + const params = queryString ? {page, perPage, queryString} : {page, perPage} + const usersUrl = `/api/manager/secure/user?${qs.stringify(params)}` const getUsers = dispatch(secureFetch(usersUrl)) - .then(response => response.json()) + .then(res => res.json()) Promise.all([getCount, getUsers]).then((results) => { if (Array.isArray(results[1])) { diff --git a/lib/admin/components/UserList.js b/lib/admin/components/UserList.js index bf8c6ecd5..517821807 100644 --- a/lib/admin/components/UserList.js +++ b/lib/admin/components/UserList.js @@ -3,7 +3,19 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import {connect} from 'react-redux' -import {Panel, Row, Col, Button, ButtonGroup, InputGroup, FormControl, ListGroup, ListGroupItem} from 'react-bootstrap' +import { + Panel, + Row, + Col, + Button, + ButtonGroup, + DropdownButton, + InputGroup, + FormControl, + ListGroup, + ListGroupItem, + MenuItem +} from 'react-bootstrap' import * as adminActions from '../actions/admin' import {getComponentMessages} from '../../common/util/config' @@ -27,6 +39,7 @@ type Props = { perPage: number, projects: Array, setUserPage: typeof adminActions.setUserPage, + setUserPerPage: typeof adminActions.setUserPerPage, setUserQueryString: typeof adminActions.setUserQueryString, token: string, updateUserData: typeof managerUserActions.updateUserData, @@ -75,6 +88,12 @@ class UserList extends Component { fetchUsers() } + _setUserPerPage = (perPage: number) => { + const {fetchUsers, setUserPerPage} = this.props + setUserPerPage(perPage) + fetchUsers() + } + _userSearch = () => { const {fetchUsers, setUserPage, setUserQueryString} = this.props setUserPage(0) @@ -132,6 +151,21 @@ class UserList extends Component { : (No results to show) } +
    + {this.messages('perPage')}{' '} + + {// Render users per page options. + [10, 25, 50, 100].map(val => + + {val} {val === perPage ? : null} + + ) + } + +
    { this.toggleExpansion() } + _getOrgLabel = (permissions: UserPermissions) => { + const {creatingUser, organizations} = this.props + if (!organizations) return null + const userOrganization = organizations.find(o => o.id === permissions.getOrganizationId()) + const creatorIsApplicationAdmin = creatingUser.permissions && + creatingUser.permissions.isApplicationAdmin() + return userOrganization && creatorIsApplicationAdmin + ? {userOrganization.name} + : null + } + /** * Constructs label indicating user authorization level (e.g., app/org admin) * or listing the projects the user has access to. @@ -127,7 +138,6 @@ export default class UserRow extends Component { const permissions = new UserPermissions(user.app_metadata && user.app_metadata.datatools) const creatorIsApplicationAdmin = creatingUser.permissions && creatingUser.permissions.isApplicationAdmin() - const userOrganization = organizations.find(o => o.id === permissions.getOrganizationId()) const creatorDoesNotHaveOrg = !creatingUser.permissions || // $FlowFixMe !creatingUser.permissions.hasOrganization(permissions.getOrganizationId()) @@ -152,10 +162,7 @@ export default class UserRow extends Component { {user.email}{' '} {this._getUserPermissionLabel(permissions)} {' '} - {userOrganization && creatorIsApplicationAdmin - ? {userOrganization.name} - : null - } + {this._getOrgLabel(permissions)}
    diff --git a/lib/admin/reducers/users.js b/lib/admin/reducers/users.js index af031d6b5..6e12c9eab 100644 --- a/lib/admin/reducers/users.js +++ b/lib/admin/reducers/users.js @@ -6,11 +6,11 @@ import type {Action} from '../../types/actions' import type {AdminUsersState} from '../../types/reducers' export const defaultState = { - isFetching: false, data: null, - userCount: 0, + isFetching: false, page: 0, perPage: 10, + userCount: 0, userQueryString: null } @@ -32,6 +32,8 @@ const users = (state: AdminUsersState = defaultState, action: Action): AdminUser return state case 'SET_USER_PAGE': return update(state, {page: { $set: action.payload }}) + case 'SET_USER_PER_PAGE': + return update(state, {perPage: { $set: action.payload }}) case 'SET_USER_QUERY_STRING': return update(state, {userQueryString: { $set: action.payload }}) default: From 548508d475e9f753195db42ab58edd170e3d80cc Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 12 Nov 2020 17:14:57 -0500 Subject: [PATCH 035/553] feat(feed-fetch): add feed fetch frequency form elements re ibi-group/datatools-server#346 --- lib/common/constants/index.js | 12 ++++ lib/common/containers/App.js | 1 + lib/manager/components/CreateFeedSource.js | 63 +++++++++++++++++++- lib/manager/components/GeneralSettings.js | 69 +++++++++++++++++++--- lib/types/index.js | 8 ++- 5 files changed, 143 insertions(+), 10 deletions(-) diff --git a/lib/common/constants/index.js b/lib/common/constants/index.js index e862c9363..3eb71f69d 100644 --- a/lib/common/constants/index.js +++ b/lib/common/constants/index.js @@ -11,6 +11,18 @@ export const DEFAULT_LOGO = 'https://d2tyb7byn1fef9.cloudfront.net/ibi_group_bla export const DEFAULT_LOGO_SMALL = 'https://d2tyb7byn1fef9.cloudfront.net/ibi_group-128x128.png' export const DEFAULT_TITLE = 'Data Tools' +export const FETCH_FREQUENCIES = Object.freeze({ + MINUTES: 'MINUTES', + HOURS: 'HOURS', + DAYS: 'DAYS' +}) + +export const FREQUENCY_INTERVALS = Object.freeze({ + [FETCH_FREQUENCIES.MINUTES]: [5, 10, 15, 30], + [FETCH_FREQUENCIES.HOURS]: [1, 6, 12], + [FETCH_FREQUENCIES.DAYS]: [1, 2, 7, 14] +}) + export const RETRIEVAL_METHODS = Object.freeze({ MANUALLY_UPLOADED: 'MANUALLY_UPLOADED', FETCHED_AUTOMATICALLY: 'FETCHED_AUTOMATICALLY', diff --git a/lib/common/containers/App.js b/lib/common/containers/App.js index ba7e0ecb5..8767bb297 100644 --- a/lib/common/containers/App.js +++ b/lib/common/containers/App.js @@ -23,6 +23,7 @@ import ActiveProjectViewer from '../../manager/containers/ActiveProjectViewer' import ActivePublicLandingPage from '../../public/containers/ActivePublicLandingPage' import ActiveUserAccount from '../../public/containers/ActiveUserAccount' import ActiveUserHomePage from '../../manager/containers/ActiveUserHomePage' +// import CreateFeedSource from '../../manager/containers/CreateFeedSource' import CreateProject from '../../manager/containers/CreateProject' import ActiveGtfsPlusEditor from '../../gtfsplus/containers/ActiveGtfsPlusEditor' import {logPageView} from '../util/analytics' diff --git a/lib/manager/components/CreateFeedSource.js b/lib/manager/components/CreateFeedSource.js index a0b5d0fc9..84b7a66be 100644 --- a/lib/manager/components/CreateFeedSource.js +++ b/lib/manager/components/CreateFeedSource.js @@ -1,5 +1,6 @@ // @flow +import Icon from '@conveyal/woonerf/components/icon' import memoize from 'lodash.memoize' import React, {Component} from 'react' import update from 'react-addons-update' @@ -8,11 +9,13 @@ import { Checkbox, Col, ControlLabel, + DropdownButton, FormControl, FormGroup, HelpBlock, ListGroup, ListGroupItem, + MenuItem, Panel, Row } from 'react-bootstrap' @@ -20,9 +23,10 @@ import validator from 'validator' import {createFeedSource} from '../actions/feeds' import Loading from '../../common/components/Loading' +import {FREQUENCY_INTERVALS} from '../../common/constants' import {validationState} from '../util' -import type {NewFeed} from '../../types' +import type {FetchFrequency, NewFeed} from '../../types' type Props = { createFeedSource: typeof createFeedSource, @@ -71,6 +75,8 @@ export default class CreateFeedSource extends Component { model: { autoFetchFeed: false, deployable: false, + fetchFrequency: 'DAYS', + fetchInterval: 1, name: '', projectId: props.projectId, url: '' @@ -93,6 +99,32 @@ export default class CreateFeedSource extends Component { } ) + _intervalsForFreq = (fetchFrequency: FetchFrequency) => { + return FREQUENCY_INTERVALS[fetchFrequency] || FREQUENCY_INTERVALS['DAYS'] + } + + _onSelectFetchInterval = (fetchInterval: number) => { + const updatedState: State = update(this.state, { + model: {fetchInterval: {$set: fetchInterval}} + }) + this.setState(updatedState) + } + + _onSelectFetchFrequency = (fetchFrequency: FetchFrequency) => { + let {fetchInterval} = this.state.model + const intervals = this._intervalsForFreq(fetchFrequency) + if (intervals.indexOf(fetchInterval) === -1) { + fetchInterval = intervals[0] + } + const updatedState: State = update(this.state, { + model: { + fetchFrequency: {$set: fetchFrequency}, + fetchInterval: {$set: fetchInterval} + } + }) + this.setState(updatedState) + } + _onSave = () => { const {model, validation} = this.state // Prevent a save if the form has validation issues @@ -127,6 +159,7 @@ export default class CreateFeedSource extends Component { render () { const {loading, model, validation} = this.state if (loading) return + const intervals = this._intervalsForFreq(model.fetchFrequency) return ( @@ -196,6 +229,34 @@ export default class CreateFeedSource extends Component { source URL must be specified and project auto fetch must be enabled.) + {model.autoFetchFeed + ?
    + Fetch feed every + {' '} + + {intervals.map(value => + + {value} {model.fetchInterval === value && } + ) + } + + {' '} + + {Object.keys(FREQUENCY_INTERVALS).map((value) => + + {value} {model.fetchFrequency === value && } + ) + } + +
    + : null + } diff --git a/lib/manager/components/GeneralSettings.js b/lib/manager/components/GeneralSettings.js index 933513a6f..3af9b24e2 100644 --- a/lib/manager/components/GeneralSettings.js +++ b/lib/manager/components/GeneralSettings.js @@ -3,21 +3,24 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import { - Col, - ListGroup, - ListGroupItem, Button, - Panel, - FormControl, - InputGroup, + Checkbox, + Col, ControlLabel, + DropdownButton, + FormControl, FormGroup, - Checkbox + InputGroup, + ListGroup, + ListGroupItem, + MenuItem, + Panel } from 'react-bootstrap' import * as feedsActions from '../actions/feeds' +import {FREQUENCY_INTERVALS} from '../../common/constants' -import type {Feed, Project} from '../../types' +import type {Feed, FetchFrequency, Project} from '../../types' import type {ManagerUserState} from '../../types/reducers' type Props = { @@ -66,6 +69,25 @@ export default class GeneralSettings extends Component { updateFeedSource(feedSource, {retrievalMethod: value}) } + _intervalsForFreq = (fetchFrequency: FetchFrequency) => { + return FREQUENCY_INTERVALS[fetchFrequency] || FREQUENCY_INTERVALS['DAYS'] + } + + _onSelectFetchInterval = (fetchInterval: number) => { + const {feedSource, updateFeedSource} = this.props + updateFeedSource(feedSource, {fetchInterval}) + } + + _onSelectFetchFrequency = (fetchFrequency: FetchFrequency) => { + const {feedSource, updateFeedSource} = this.props + let {fetchInterval} = feedSource + const intervals = this._intervalsForFreq(fetchFrequency) + if (intervals.indexOf(fetchInterval) === -1) { + fetchInterval = intervals[0] + } + updateFeedSource(feedSource, {fetchFrequency, fetchInterval}) + } + _onTogglePublic = () => { const {feedSource, updateFeedSource} = this.props updateFeedSource(feedSource, {isPublic: !feedSource.isPublic}) @@ -96,6 +118,9 @@ export default class GeneralSettings extends Component { url } = this.state const autoFetchFeed = feedSource.retrievalMethod === 'FETCHED_AUTOMATICALLY' + const fetchFrequency = feedSource.fetchFrequency || 'DAYS' + const intervals = this._intervalsForFreq(fetchFrequency) + const fetchInterval = feedSource.fetchInterval || intervals[0] return ( {/* Settings */} @@ -168,6 +193,34 @@ export default class GeneralSettings extends Component { Set this feed source to fetch automatically. (Feed source URL must be specified and project auto fetch must be enabled.) + {autoFetchFeed + ?
    + Fetch feed every + {' '} + + {intervals.map(value => + + {value} {fetchInterval === value && } + ) + } + + {' '} + + {Object.keys(FREQUENCY_INTERVALS).map((value) => + + {value} {fetchFrequency === value && } + ) + } + +
    + : null + } diff --git a/lib/types/index.js b/lib/types/index.js index 16898626e..d90e92872 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -1,7 +1,7 @@ // @flow import {POINT_TYPE} from '../editor/constants' -import {FEED_TRANSFORMATION_TYPES, RETRIEVAL_METHODS} from '../common/constants' +import {FEED_TRANSFORMATION_TYPES, FETCH_FREQUENCIES, RETRIEVAL_METHODS} from '../common/constants' import type UserPermissions from '../common/user/UserPermissions' @@ -289,6 +289,8 @@ export type Snapshot = { export type RetrievalMethod = $Values +export type FetchFrequency = $Values + export type FeedTransformation = { '@type': $Values, active: boolean, @@ -314,6 +316,8 @@ export type Feed = { editorSnapshots?: Array, externalProperties?: any, // TODO: add more exact type feedVersions?: Array, + fetchFrequency?: FetchFrequency, + fetchInterval?: number, id: string, isCreating?: boolean, isPublic: boolean, @@ -339,6 +343,8 @@ export type Feed = { export type NewFeed = { autoFetchFeed?: boolean, deployable?: boolean, + fetchFrequency: FetchFrequency, + fetchInterval: number, name?: string, projectId: string, retrievalMethod?: string, From ceadc859723093a6176733cbfece39d7bdbe5f6b Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 13 Nov 2020 15:15:38 -0500 Subject: [PATCH 036/553] refactor(FeedFetchFrequency): refactor fetch selectors into separate component --- i18n/english.yml | 2 + lib/common/containers/App.js | 1 - lib/manager/components/CreateFeedSource.js | 42 +++----------- lib/manager/components/FeedFetchFrequency.js | 58 ++++++++++++++++++++ lib/manager/components/GeneralSettings.js | 45 ++++----------- lib/manager/util/index.js | 2 + 6 files changed, 80 insertions(+), 70 deletions(-) create mode 100644 lib/manager/components/FeedFetchFrequency.js diff --git a/i18n/english.yml b/i18n/english.yml index 335cbf134..a29e72894 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -176,6 +176,8 @@ components: snapshot: snapshot title: Snapshots version: Version + FeedFetchFrequency: + fetchFeedEvery: Fetch feed every FeedInfoPanel: uploadShapefile: body: 'Select a zipped shapefile to display on map. Note: this is only for use as a visual aid.' diff --git a/lib/common/containers/App.js b/lib/common/containers/App.js index 8767bb297..ba7e0ecb5 100644 --- a/lib/common/containers/App.js +++ b/lib/common/containers/App.js @@ -23,7 +23,6 @@ import ActiveProjectViewer from '../../manager/containers/ActiveProjectViewer' import ActivePublicLandingPage from '../../public/containers/ActivePublicLandingPage' import ActiveUserAccount from '../../public/containers/ActiveUserAccount' import ActiveUserHomePage from '../../manager/containers/ActiveUserHomePage' -// import CreateFeedSource from '../../manager/containers/CreateFeedSource' import CreateProject from '../../manager/containers/CreateProject' import ActiveGtfsPlusEditor from '../../gtfsplus/containers/ActiveGtfsPlusEditor' import {logPageView} from '../util/analytics' diff --git a/lib/manager/components/CreateFeedSource.js b/lib/manager/components/CreateFeedSource.js index 84b7a66be..6022e6957 100644 --- a/lib/manager/components/CreateFeedSource.js +++ b/lib/manager/components/CreateFeedSource.js @@ -1,6 +1,5 @@ // @flow -import Icon from '@conveyal/woonerf/components/icon' import memoize from 'lodash.memoize' import React, {Component} from 'react' import update from 'react-addons-update' @@ -9,13 +8,11 @@ import { Checkbox, Col, ControlLabel, - DropdownButton, FormControl, FormGroup, HelpBlock, ListGroup, ListGroupItem, - MenuItem, Panel, Row } from 'react-bootstrap' @@ -24,6 +21,7 @@ import validator from 'validator' import {createFeedSource} from '../actions/feeds' import Loading from '../../common/components/Loading' import {FREQUENCY_INTERVALS} from '../../common/constants' +import FeedFetchFrequency from './FeedFetchFrequency' import {validationState} from '../util' import type {FetchFrequency, NewFeed} from '../../types' @@ -99,10 +97,6 @@ export default class CreateFeedSource extends Component { } ) - _intervalsForFreq = (fetchFrequency: FetchFrequency) => { - return FREQUENCY_INTERVALS[fetchFrequency] || FREQUENCY_INTERVALS['DAYS'] - } - _onSelectFetchInterval = (fetchInterval: number) => { const updatedState: State = update(this.state, { model: {fetchInterval: {$set: fetchInterval}} @@ -112,7 +106,7 @@ export default class CreateFeedSource extends Component { _onSelectFetchFrequency = (fetchFrequency: FetchFrequency) => { let {fetchInterval} = this.state.model - const intervals = this._intervalsForFreq(fetchFrequency) + const intervals = FREQUENCY_INTERVALS[fetchFrequency] if (intervals.indexOf(fetchInterval) === -1) { fetchInterval = intervals[0] } @@ -159,7 +153,6 @@ export default class CreateFeedSource extends Component { render () { const {loading, model, validation} = this.state if (loading) return - const intervals = this._intervalsForFreq(model.fetchFrequency) return ( @@ -230,31 +223,12 @@ export default class CreateFeedSource extends Component { be enabled.) {model.autoFetchFeed - ?
    - Fetch feed every - {' '} - - {intervals.map(value => - - {value} {model.fetchInterval === value && } - ) - } - - {' '} - - {Object.keys(FREQUENCY_INTERVALS).map((value) => - - {value} {model.fetchFrequency === value && } - ) - } - -
    + ? : null } diff --git a/lib/manager/components/FeedFetchFrequency.js b/lib/manager/components/FeedFetchFrequency.js new file mode 100644 index 000000000..5aefca069 --- /dev/null +++ b/lib/manager/components/FeedFetchFrequency.js @@ -0,0 +1,58 @@ +// @flow +import Icon from '@conveyal/woonerf/components/icon' +import React from 'react' +import { + DropdownButton, + MenuItem +} from 'react-bootstrap' + +import {FREQUENCY_INTERVALS} from '../../common/constants' +import {getComponentMessages} from '../../common/util/config' + +import type {FetchFrequency} from '../../types' + +type Props = { + fetchFrequency?: FetchFrequency, + fetchInterval?: number, + onSelectFetchFrequency: FetchFrequency => void, + onSelectFetchInterval: number => void +} + +const FeedFetchFrequency = (props: Props) => { + const {onSelectFetchFrequency, onSelectFetchInterval} = props + let {fetchFrequency, fetchInterval} = props + // If frequency and interval are not defined, use default of one fetch per day. + if (!fetchFrequency) fetchFrequency = 'DAYS' + const intervals = FREQUENCY_INTERVALS[fetchFrequency] + if (!fetchInterval) fetchInterval = intervals[0] + const messages = getComponentMessages('FeedFetchFrequency') + return ( +
    + {messages('fetchFeedEvery')} + {' '} + + {intervals.map(value => + + {value} {fetchInterval === value && } + ) + } + + {' '} + + {Object.keys(FREQUENCY_INTERVALS).map((value) => + + {value} {fetchFrequency === value && } + ) + } + +
    + ) +} + +export default FeedFetchFrequency diff --git a/lib/manager/components/GeneralSettings.js b/lib/manager/components/GeneralSettings.js index 3af9b24e2..e2bf4beb0 100644 --- a/lib/manager/components/GeneralSettings.js +++ b/lib/manager/components/GeneralSettings.js @@ -7,18 +7,17 @@ import { Checkbox, Col, ControlLabel, - DropdownButton, FormControl, FormGroup, InputGroup, ListGroup, ListGroupItem, - MenuItem, Panel } from 'react-bootstrap' import * as feedsActions from '../actions/feeds' import {FREQUENCY_INTERVALS} from '../../common/constants' +import FeedFetchFrequency from './FeedFetchFrequency' import type {Feed, FetchFrequency, Project} from '../../types' import type {ManagerUserState} from '../../types/reducers' @@ -69,10 +68,6 @@ export default class GeneralSettings extends Component { updateFeedSource(feedSource, {retrievalMethod: value}) } - _intervalsForFreq = (fetchFrequency: FetchFrequency) => { - return FREQUENCY_INTERVALS[fetchFrequency] || FREQUENCY_INTERVALS['DAYS'] - } - _onSelectFetchInterval = (fetchInterval: number) => { const {feedSource, updateFeedSource} = this.props updateFeedSource(feedSource, {fetchInterval}) @@ -81,7 +76,9 @@ export default class GeneralSettings extends Component { _onSelectFetchFrequency = (fetchFrequency: FetchFrequency) => { const {feedSource, updateFeedSource} = this.props let {fetchInterval} = feedSource - const intervals = this._intervalsForFreq(fetchFrequency) + const intervals = FREQUENCY_INTERVALS[fetchFrequency] + // If the current interval is not in the set for this frequency, overwrite + // with the first value from the allowed set. if (intervals.indexOf(fetchInterval) === -1) { fetchInterval = intervals[0] } @@ -118,9 +115,6 @@ export default class GeneralSettings extends Component { url } = this.state const autoFetchFeed = feedSource.retrievalMethod === 'FETCHED_AUTOMATICALLY' - const fetchFrequency = feedSource.fetchFrequency || 'DAYS' - const intervals = this._intervalsForFreq(fetchFrequency) - const fetchInterval = feedSource.fetchInterval || intervals[0] return ( {/* Settings */} @@ -194,31 +188,12 @@ export default class GeneralSettings extends Component { Set this feed source to fetch automatically. (Feed source URL must be specified and project auto fetch must be enabled.) {autoFetchFeed - ?
    - Fetch feed every - {' '} - - {intervals.map(value => - - {value} {fetchInterval === value && } - ) - } - - {' '} - - {Object.keys(FREQUENCY_INTERVALS).map((value) => - - {value} {fetchFrequency === value && } - ) - } - -
    + ? : null } diff --git a/lib/manager/util/index.js b/lib/manager/util/index.js index 4a5b89e08..ac5e6c222 100644 --- a/lib/manager/util/index.js +++ b/lib/manager/util/index.js @@ -4,11 +4,13 @@ import moment from 'moment' import {get} from 'object-path' import {getVersionValidationSummaryByFilterStrategy} from './version' +import {FREQUENCY_INTERVALS} from '../../common/constants' import type { Bounds, Feed, FeedVersion, + FetchFrequency, Project, ValidationSummary } from '../../types' From bc0eff59ba7387aa53eb080f7d792fcae6093fa8 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 13 Nov 2020 16:01:03 -0500 Subject: [PATCH 037/553] refactor(MenuItem): add wrapper component to handle checkmark icon --- lib/admin/components/UserList.js | 12 ++++---- lib/common/components/MenuItem.js | 28 +++++++++++++++++++ .../components/ProjectFeedListToolbar.js | 7 +++-- .../version/VersionSelectorDropdown.js | 14 ++-------- 4 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 lib/common/components/MenuItem.js diff --git a/lib/admin/components/UserList.js b/lib/admin/components/UserList.js index 517821807..61221a57d 100644 --- a/lib/admin/components/UserList.js +++ b/lib/admin/components/UserList.js @@ -4,20 +4,20 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import {connect} from 'react-redux' import { - Panel, - Row, - Col, Button, ButtonGroup, + Col, DropdownButton, InputGroup, FormControl, ListGroup, ListGroupItem, - MenuItem + Panel, + Row } from 'react-bootstrap' import * as adminActions from '../actions/admin' +import MenuItem from '../../common/components/MenuItem' import {getComponentMessages} from '../../common/util/config' import CreateUser from './CreateUser' import * as feedActions from '../../manager/actions/feeds' @@ -159,8 +159,8 @@ class UserList extends Component { onSelect={this._setUserPerPage}> {// Render users per page options. [10, 25, 50, 100].map(val => - - {val} {val === perPage ? : null} + + {val} ) } diff --git a/lib/common/components/MenuItem.js b/lib/common/components/MenuItem.js new file mode 100644 index 000000000..8b6fcd40b --- /dev/null +++ b/lib/common/components/MenuItem.js @@ -0,0 +1,28 @@ +// @flow + +import Icon from '@conveyal/woonerf/components/icon' +import * as React from 'react' +import {MenuItem as BsMenuItem} from 'react-bootstrap' + +/** + * Simple wrapper around Bootstrap's menu item to inject a checkmark if the item + * is selected. + */ +const MenuItem = ({children, selected, ...menuItemProps}: {children: React.Node, selected?: boolean}) => ( + + {selected + ? + : null + } + {children} + +) + +export default MenuItem diff --git a/lib/manager/components/ProjectFeedListToolbar.js b/lib/manager/components/ProjectFeedListToolbar.js index d0b7f0fa0..c357d52a1 100644 --- a/lib/manager/components/ProjectFeedListToolbar.js +++ b/lib/manager/components/ProjectFeedListToolbar.js @@ -21,6 +21,7 @@ import { import * as projectsActions from '../actions/projects' import * as visibilityFilterActions from '../actions/visibilityFilter' +import SelectableMenuItem from '../../common/components/MenuItem' import OptionButton from '../../common/components/OptionButton' import {getComponentMessages, isExtensionEnabled} from '../../common/util/config' import { @@ -248,13 +249,13 @@ export default class ProjectFeedListToolbar extends PureComponent { _renderSortOption = (option: FeedSourceTableSortStrategiesWithOrders) => { const {sort} = this.props return ( - {this.messages(`sort.${option.replace('-', '.')}`)} - {sort === option && } - + ) } diff --git a/lib/manager/components/version/VersionSelectorDropdown.js b/lib/manager/components/version/VersionSelectorDropdown.js index 048f18eec..22a4155f0 100644 --- a/lib/manager/components/version/VersionSelectorDropdown.js +++ b/lib/manager/components/version/VersionSelectorDropdown.js @@ -1,9 +1,9 @@ // @flow -import Icon from '@conveyal/woonerf/components/icon' import * as React from 'react' -import { Dropdown, MenuItem } from 'react-bootstrap' +import { Dropdown } from 'react-bootstrap' +import MenuItem from '../../../common/components/MenuItem' import VersionRetrievalBadge from './VersionRetrievalBadge' import type { FeedVersion } from '../../../types' @@ -20,18 +20,10 @@ type Props = { const DefaultItemFormatter = (version: FeedVersion, activeVersion: ?FeedVersion) => ( - {activeVersion && version.id === activeVersion.id - ? - : null} {version.version}. {version.name}{' '} From fb199c6d38fdf7e20075d76c6b1d5ed3eebf5d83 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Mon, 16 Nov 2020 14:47:15 -0500 Subject: [PATCH 038/553] build(auth0-lock): bump auth0-lock to 11.27.1 --- package.json | 2 +- yarn.lock | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d19ea6ab3..3e09f1f4a 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@turf/line-slice-along": "^4.6.0", "@turf/nearest-point-on-line": "^5.1.5", "auth0-js": "^9.3.2", - "auth0-lock": "^11.3.1", + "auth0-lock": "^11.27.1", "bootstrap": "^3.4.1", "bugsnag-js": "^4.7.2", "bugsnag-react": "^1.1.1", diff --git a/yarn.lock b/yarn.lock index c03e9bea5..a0e395608 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1952,10 +1952,10 @@ auth0-js@^9.13.3, auth0-js@^9.3.2: url-join "^4.0.1" winchan "^0.2.2" -auth0-lock@^11.3.1: - version "11.26.0" - resolved "https://registry.yarnpkg.com/auth0-lock/-/auth0-lock-11.26.0.tgz#5a4a7c3df47004b710743b178300bfda9235f7ef" - integrity sha512-9b40aZkNiSMmASuyyz+lGB66aSfceVORTT+Ae9/Mr0+gFoKG7E6h+dDn52sDVQ2FEedI5zRlfpN4w4G54dK2qA== +auth0-lock@^11.27.1: + version "11.27.1" + resolved "https://registry.yarnpkg.com/auth0-lock/-/auth0-lock-11.27.1.tgz#942301f61561f67caf40894104e8b3dfd8c67876" + integrity sha512-qUa6f+rQJgTI3vCw8jDQA6m91TXiTYCQM9FLINyMRFKYvcJ/gIE1E5jMEll84miaAkXVWU8X+1vC7UHiRx8epA== dependencies: auth0-js "^9.13.3" auth0-password-policies "^1.0.2" @@ -1970,6 +1970,7 @@ auth0-lock@^11.3.1: react-transition-group "^2.2.1" trim "0.0.1" url-join "^1.1.0" + validator "^13.1.1" auth0-password-policies@^1.0.2: version "1.0.2" @@ -14015,6 +14016,11 @@ validator@7.0.0: resolved "https://registry.yarnpkg.com/validator/-/validator-7.0.0.tgz#c74deb8063512fac35547938e6f0b1504a282fd2" integrity sha1-x03rgGNRL6w1VHk45vCxUEooL9I= +validator@^13.1.1: + version "13.1.17" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.1.17.tgz#ad677736950adddd3c37209484a6b2e0966579ad" + integrity sha512-zL5QBoemJ3jYFb2/j38y7ljhwYGXVLUp8H6W1nVxadnAOvUOytec+L7BHh1oBQ82/TzWXHd+GSaxUWp4lROkLg== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From 129ad7d5f318de4cdc1c0fd45e79546f8c521699 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Mon, 16 Nov 2020 16:57:54 -0500 Subject: [PATCH 039/553] test(snapshots): update snaps --- .../__snapshots__/ActiveProjectViewer.js.snap | 478 ++++++++++-------- .../__snapshots__/FeedSourceTable.js.snap | 478 ++++++++++-------- 2 files changed, 552 insertions(+), 404 deletions(-) diff --git a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap index d494bc823..b7839776c 100644 --- a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap @@ -2498,87 +2498,105 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr -
  • - - - A-Z - - - - - -
  • + type="check" + > + + + A-Z + + + +
    -
  • - - - Z-A - - -
  • + + Z-A + + + +
    manager > ActiveProjectViewer should render with newly created pr -
  • - - - Earliest-Latest - - -
  • + + Earliest-Latest + + + +
    -
  • - - - Latest-Earliest - - -
  • + + Latest-Earliest + + + +
    manager > ActiveProjectViewer should render with newly created pr -
  • - - - Earliest-Latest - - -
  • + + Earliest-Latest + + + +
    -
  • - - - Latest-Earliest - - -
  • + + Latest-Earliest + + + +
    manager > ActiveProjectViewer should render with newly created pr -
  • - - - Stale-Recent - - -
  • + + Stale-Recent + + + +
    -
  • - - - Recent-Stale - - -
  • + + Recent-Stale + + + +
    manager > ActiveProjectViewer should render with newly created pr -
  • - - - Least-Most - - -
  • + + Least-Most + + + +
    -
  • - - - Most-Least - - -
  • + + Most-Least + + + +
    diff --git a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap index ca635b27a..163f34121 100644 --- a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap @@ -1442,87 +1442,105 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds -
  • - - - A-Z - - - - - -
  • + type="check" + > + + + A-Z + + + +
    -
  • - - - Z-A - - -
  • + + Z-A + + + +
    manager > FeedSourceTable should render with a project with feeds -
  • - - - Earliest-Latest - - -
  • + + Earliest-Latest + + + +
    -
  • - - - Latest-Earliest - - -
  • + + Latest-Earliest + + + +
    manager > FeedSourceTable should render with a project with feeds -
  • - - - Earliest-Latest - - -
  • + + Earliest-Latest + + + +
    -
  • - - - Latest-Earliest - - -
  • + + Latest-Earliest + + + +
    manager > FeedSourceTable should render with a project with feeds -
  • - - - Stale-Recent - - -
  • + + Stale-Recent + + + +
    -
  • - - - Recent-Stale - - -
  • + + Recent-Stale + + + +
    manager > FeedSourceTable should render with a project with feeds -
  • - - - Least-Most - - -
  • + + Least-Most + + + +
    -
  • - - - Most-Least - - -
  • + + Most-Least + + + +
    From 30c72de432e7d9dbb14bef817510d7203bb99309 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Mon, 16 Nov 2020 17:21:28 -0500 Subject: [PATCH 040/553] refactor: address PR comments --- i18n/english.yml | 3 ++ lib/manager/components/FeedFetchFrequency.js | 34 ++++++++++++++------ lib/manager/util/index.js | 2 -- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 8a875aa5a..536449c8f 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -177,7 +177,10 @@ components: title: Snapshots version: Version FeedFetchFrequency: + DAYS: days fetchFeedEvery: Fetch feed every + HOURS: hours + MINUTES: minutes FeedInfoPanel: uploadShapefile: body: 'Select a zipped shapefile to display on map. Note: this is only for use as a visual aid.' diff --git a/lib/manager/components/FeedFetchFrequency.js b/lib/manager/components/FeedFetchFrequency.js index 5aefca069..9ced368b6 100644 --- a/lib/manager/components/FeedFetchFrequency.js +++ b/lib/manager/components/FeedFetchFrequency.js @@ -2,11 +2,11 @@ import Icon from '@conveyal/woonerf/components/icon' import React from 'react' import { - DropdownButton, - MenuItem + DropdownButton } from 'react-bootstrap' import {FREQUENCY_INTERVALS} from '../../common/constants' +import MenuItem from '../../common/components/MenuItem' import {getComponentMessages} from '../../common/util/config' import type {FetchFrequency} from '../../types' @@ -18,6 +18,11 @@ type Props = { onSelectFetchInterval: number => void } +/** + * Renders a set of dropdown form elements used to set a the auto-fetch + * interval/frequency properties for a FeedSource (i.e., how often data tools + * should check for an updated GTFS file at the fetch URL). + */ const FeedFetchFrequency = (props: Props) => { const {onSelectFetchFrequency, onSelectFetchInterval} = props let {fetchFrequency, fetchInterval} = props @@ -26,28 +31,37 @@ const FeedFetchFrequency = (props: Props) => { const intervals = FREQUENCY_INTERVALS[fetchFrequency] if (!fetchInterval) fetchInterval = intervals[0] const messages = getComponentMessages('FeedFetchFrequency') + console.log(Object.keys(FREQUENCY_INTERVALS), messages); return (
    - {messages('fetchFeedEvery')} + {messages('fetchFeedEvery')} {' '} {intervals.map(value => - - {value} {fetchInterval === value && } + + {value} ) } {' '} {Object.keys(FREQUENCY_INTERVALS).map((value) => - - {value} {fetchFrequency === value && } + + {messages(value)} ) } diff --git a/lib/manager/util/index.js b/lib/manager/util/index.js index ac5e6c222..4a5b89e08 100644 --- a/lib/manager/util/index.js +++ b/lib/manager/util/index.js @@ -4,13 +4,11 @@ import moment from 'moment' import {get} from 'object-path' import {getVersionValidationSummaryByFilterStrategy} from './version' -import {FREQUENCY_INTERVALS} from '../../common/constants' import type { Bounds, Feed, FeedVersion, - FetchFrequency, Project, ValidationSummary } from '../../types' From 196750f9a02eee12b8bb1f021fce8632be7db654 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 16 Nov 2020 20:11:54 -0500 Subject: [PATCH 041/553] refactor(manager/util/version): Extract delta formatting function. --- lib/manager/components/version/FeedVersionTabs.js | 3 ++- lib/manager/components/version/FeedVersionViewer.js | 5 ++--- lib/manager/util/version.js | 13 +++++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index bc3b3e6e3..2303da244 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -10,6 +10,7 @@ import Patterns from '../reporter/containers/Patterns' import Routes from '../reporter/containers/Routes' import Stops from '../reporter/containers/Stops' import Timetables from '../reporter/containers/Timetables' +import {formatDelta} from '../../util/version' import ServicePerModeChart from '../validation/ServicePerModeChart' import TripsChart from '../validation/TripsChart' import FeedVersionAccessibility from './FeedVersionAccessibility' @@ -121,7 +122,7 @@ export default class FeedVersionTabs extends Component { style={{fontSize: '50%', padding: '0 0.2em 0.1em'}} bsStyle={diff > 0 ? 'success' : (diff < 0 ? 'danger' : 'default')} title={`Difference compared to Version ${comparedVersionIndex || 'null'}`}> - {diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) /* TODO: refactor */} + {formatDelta(diff)} )} diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 7a2037883..e28a394fd 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -15,7 +15,7 @@ import FeedVersionReport from './FeedVersionReport' import ActiveGtfsPlusVersionSummary from '../../../gtfsplus/containers/ActiveGtfsPlusVersionSummary' import VersionDateLabel from './VersionDateLabel' import NotesViewer from '../NotesViewer' -import {errorPriorityLevels, getTableFatalExceptions} from '../../util/version' +import {errorPriorityLevels, formatDelta, getTableFatalExceptions} from '../../util/version' import GtfsValidationViewer from '../validation/GtfsValidationViewer' import VersionButtonToolbar from './VersionButtonToolbar' @@ -173,7 +173,6 @@ class VersionSectionSelector extends Component { if (comparedVersion && comparedVersionIndex) { const diff = validationSummary.errorCount - comparedVersion.validationSummary.errorCount const diffColor = diff > 0 ? 'label-danger' : (diff < 0 ? 'label-success' : 'label-default') - const diffText = diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a')) diffLabel = ( { style={{border: '0.5px solid #ccc'}} title={`Difference compared to Version ${comparedVersionIndex}`} > - {diffText} + {formatDelta(diff)} ) } diff --git a/lib/manager/util/version.js b/lib/manager/util/version.js index ea61a4c3b..be4219ecf 100644 --- a/lib/manager/util/version.js +++ b/lib/manager/util/version.js @@ -1,6 +1,7 @@ // @flow import moment from 'moment' +import numeral from 'numeral' import { isExtensionEnabled } from '../../common/util/config' @@ -170,3 +171,15 @@ export function getVersionValidationSummaryByFilterStrategy ( export const versionsLastUpdatedComparator = (a: FeedVersion, b: FeedVersion) => { return a.updated - b.updated } + +/** + * Formats a difference with a leading + sign, or as '=' if the difference is zero, + * and converts large numbers into nearest thousands unit (e.g. 25000 => 25k). + */ +export function formatDelta ( + delta: number +): string { + return delta === 0 + ? '=' + : ((delta > 0 ? '+' : '') + numeral(delta).format('0a')) +} From 08c881ccaf552b503dddbb05ada677e37e3a9272 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 17 Nov 2020 10:42:59 -0500 Subject: [PATCH 042/553] refactor(FeedVersionChart): Address PR comments --- .../version/FeedVersionSpanChart.js | 68 +++++++++---------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 0086f2708..a66d8052b 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -14,42 +14,7 @@ type Props = { const dateFormat = 'MMM. DD, YYYY' -/** Renders the validity span of one feed using the given props. */ -const FeedSpan = ({ - endLabel, - relativeLength, - relativeOffset, - startLabel, - widthPixels, - ...props -}) => { - // Date labels and validity span occupy a third of the width available. - const baseWidth = widthPixels / 3 - return ( -
    -
    - {startLabel} - - {endLabel} -
    -
    - ) -} - -const noTopPadding = {padding: '0 5px'} +const noTopPadding = { padding: '0 5px' } /** * This component visually displays the validity span of two feed versions @@ -106,3 +71,34 @@ export default class FeedVersionSpanChart extends Component { ) } } + +/** Renders the validity span of one feed using the given props. */ +const FeedSpan = ({ + endLabel, + relativeLength, + relativeOffset, + startLabel, + widthPixels +}) => { + // Date labels and validity span occupy a third of the width available. + const baseWidth = widthPixels / 3 + return ( +
    +
    + + {startLabel} + + + {endLabel} +
    +
    + ) +} From 5fbbb2e918cdcaa58e793013574d7b7d5d0ae0d6 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 17 Nov 2020 10:52:21 -0500 Subject: [PATCH 043/553] refactor(FeedVersionNavigator): Rename var per PR comment. --- lib/manager/components/version/FeedVersionViewer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index e28a394fd..a57df3445 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -172,11 +172,11 @@ class VersionSectionSelector extends Component { let diffLabel if (comparedVersion && comparedVersionIndex) { const diff = validationSummary.errorCount - comparedVersion.validationSummary.errorCount - const diffColor = diff > 0 ? 'label-danger' : (diff < 0 ? 'label-success' : 'label-default') + const diffClassName = diff > 0 ? 'label-danger' : (diff < 0 ? 'label-success' : 'label-default') diffLabel = ( From 82846d9ddb5e926cafa49887455574b5f604b8ce Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 17 Nov 2020 11:19:01 -0500 Subject: [PATCH 044/553] refactor(FeedVersionViewer): Make tests pass. --- lib/manager/components/version/FeedVersionSpanChart.js | 1 + lib/manager/components/version/FeedVersionViewer.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index a66d8052b..4cf7a08ac 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -9,6 +9,7 @@ import type { FeedVersion } from '../../../types' type Props = { activeVersion: FeedVersion, comparedVersion: FeedVersion, + // Used for display only. comparedVersionIndex: number } diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index a57df3445..e3c87775c 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -4,7 +4,6 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import { Row, Col, Panel, Label as BsLabel, Glyphicon, ListGroup, ListGroupItem } from 'react-bootstrap' import { LinkContainer } from 'react-router-bootstrap' -import numeral from 'numeral' import * as plusActions from '../../../gtfsplus/actions/gtfsplus' import * as versionsActions from '../../actions/versions' From 671fbfd757e894d64dcba6a49d45601c67a73397 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Tue, 17 Nov 2020 15:08:25 -0500 Subject: [PATCH 045/553] refactor(FeedFetchFrequency): remove console log --- lib/manager/components/FeedFetchFrequency.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/manager/components/FeedFetchFrequency.js b/lib/manager/components/FeedFetchFrequency.js index 9ced368b6..a09fd5ac6 100644 --- a/lib/manager/components/FeedFetchFrequency.js +++ b/lib/manager/components/FeedFetchFrequency.js @@ -1,5 +1,4 @@ // @flow -import Icon from '@conveyal/woonerf/components/icon' import React from 'react' import { DropdownButton @@ -31,7 +30,6 @@ const FeedFetchFrequency = (props: Props) => { const intervals = FREQUENCY_INTERVALS[fetchFrequency] if (!fetchInterval) fetchInterval = intervals[0] const messages = getComponentMessages('FeedFetchFrequency') - console.log(Object.keys(FREQUENCY_INTERVALS), messages); return (
    {messages('fetchFeedEvery')} From d4a82d0db8ca002810c49d08e8b3ed4bc2c6cc0f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Nov 2020 21:57:52 +0000 Subject: [PATCH 046/553] build(deps-dev): bump semantic-release from 15.13.3 to 17.2.3 Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 15.13.3 to 17.2.3. - [Release notes](https://github.com/semantic-release/semantic-release/releases) - [Commits](https://github.com/semantic-release/semantic-release/compare/v15.13.3...v17.2.3) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 2436 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 1653 insertions(+), 785 deletions(-) diff --git a/package.json b/package.json index 3e09f1f4a..5ab1b4947 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "react-addons-test-utils": "^15.6.2", "redux-mock-store": "^1.5.3", "request": "^2.88.0", - "semantic-release": "^15.13.3", + "semantic-release": "^17.2.3", "simple-node-logger": "^0.93.37", "slack": "^11.0.1" }, diff --git a/yarn.lock b/yarn.lock index b5586070d..0a150e118 100644 --- a/yarn.lock +++ b/yarn.lock @@ -829,6 +829,15 @@ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@iarna/cli@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641" + integrity sha512-ukITQAqVs2n9HGmn3car/Ir7d3ta650iXhrG7pjr3EWdFmJuuOVWgYsu7ftsSe5VifEFFhjxVuX9+8F7L8hwcA== + dependencies: + signal-exit "^3.0.2" + update-notifier "^2.2.0" + yargs "^8.0.2" + "@jest/console@^24.7.1": version "24.7.1" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" @@ -975,130 +984,203 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^12.0.9" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== -"@octokit/endpoint@^4.0.0": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-4.1.1.tgz#847075b85157c7bd60d0f23c426b23bed8a232dd" - integrity sha512-lfphGC9hglBDiIOU84f1xDUzjWE5j3jGkO3Ng/IpDDVARw760A+/x408JOEpdV20ZUj2GRWdDBC0+HPu5qA5gQ== +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== dependencies: - deepmerge "3.2.0" - is-plain-object "^2.0.4" - universal-user-agent "^2.0.1" - url-template "^2.0.8" + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" -"@octokit/request@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-3.0.0.tgz#304a279036b2dc89e7fba7cb30c9e6a9b1f4d2df" - integrity sha512-DZqmbm66tq+a9FtcKrn0sjrUpi0UaZ9QPUCxxyk/4CJ2rseTMpAWRf6gCwOSUCzZcx/4XVIsDk+kz5BVdaeenA== +"@octokit/auth-token@^2.4.0": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.3.tgz#b868b5f2366533a7e62933eaa1181a8924228cc4" + integrity sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg== dependencies: - "@octokit/endpoint" "^4.0.0" - deprecation "^1.0.1" - is-plain-object "^2.0.4" - node-fetch "^2.3.0" + "@octokit/types" "^5.0.0" + +"@octokit/core@^3.0.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.1.tgz#9e04df3f4e7f825ac0559327490ce34299140af5" + integrity sha512-XfFSDDwv6tclUenS0EmB6iA7u+4aOHBT1Lz4PtQNQQg3hBbNaR/+Uv5URU+egeIuuGAiMRiDyY92G4GBOWOqDA== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/graphql" "^4.3.1" + "@octokit/request" "^5.4.0" + "@octokit/types" "^5.0.0" + before-after-hook "^2.1.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.9" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.9.tgz#c6a772e024202b1bd19ab69f90e0536a2598b13e" + integrity sha512-3VPLbcCuqji4IFTclNUtGdp9v7g+nspWdiCUbK3+iPMjJCZ6LEhn1ts626bWLOn0GiDb6j+uqGvPpqLnY7pBgw== + dependencies: + "@octokit/types" "^5.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.3.1": + version "4.5.7" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.7.tgz#f4562dcd9e80ea94602068e85aefac19a88f8578" + integrity sha512-Gk0AR+DcwIK/lK/GX+OQ99UqtenQhcbrhHHfOYlrCQe17ADnX3EKAOKRsAZ9qZvpi5MuwWm/Nm+9aO2kTDSdyA== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/plugin-paginate-rest@^2.2.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.6.0.tgz#03416396e7a227b268c5b827365238f620a9c5c1" + integrity sha512-o+O8c1PqsC5++BHXfMZabRRsBIVb34tXPWyQLyp2IXq5MmkxdipS7TXM4Y9ldL1PzY9CTrCsn/lzFFJGM3oRRA== + dependencies: + "@octokit/types" "^5.5.0" + +"@octokit/plugin-request-log@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz#394d59ec734cd2f122431fbaf05099861ece3c44" + integrity sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg== + +"@octokit/plugin-rest-endpoint-methods@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.2.1.tgz#8224833a45c3394836dc6e86f1e6c49269a2c350" + integrity sha512-QyFr4Bv807Pt1DXZOC5a7L5aFdrwz71UHTYoHVajYV5hsqffWm8FUl9+O7nxRu5PDMtB/IKrhFqTmdBTK5cx+A== + dependencies: + "@octokit/types" "^5.5.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.3.tgz#b51b200052bf483f6fa56c9e7e3aa51ead36ecd8" + integrity sha512-GgD5z8Btm301i2zfvJLk/mkhvGCdjQ7wT8xF9ov5noQY8WbKZDH9cOBqXzoeKd1mLr1xH2FwbtGso135zGBgTA== + dependencies: + "@octokit/types" "^5.0.1" + deprecation "^2.0.0" once "^1.4.0" - universal-user-agent "^2.0.1" - -"@octokit/rest@^16.13.1": - version "16.25.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.25.0.tgz#1111dc2b2058bc77442fd7fbd295dab3991b62bf" - integrity sha512-QKIzP0gNYjyIGmY3Gpm3beof0WFwxFR+HhRZ+Wi0fYYhkEUvkJiXqKF56Pf5glzzfhEwOrggfluEld5F/ZxsKw== - dependencies: - "@octokit/request" "3.0.0" - atob-lite "^2.0.0" - before-after-hook "^1.4.0" - btoa-lite "^1.0.0" - deprecation "^1.0.1" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.0": + version "5.4.10" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.10.tgz#402d2c53768bde12b99348329ba4129746aebb9c" + integrity sha512-egA49HkqEORVGDZGav1mh+VD+7uLgOxtn5oODj6guJk0HCy+YBSYapFkSLFgeYj3Fr18ZULKGURkjyhkAChylw== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^5.0.0" + deprecation "^2.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" once "^1.4.0" - universal-user-agent "^2.0.0" - url-template "^2.0.8" + universal-user-agent "^6.0.0" -"@semantic-release/commit-analyzer@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-6.1.0.tgz#32bbe3c23da86e23edf072fbb276fa2f383fcb17" - integrity sha512-2lb+t6muGenI86mYGpZYOgITx9L3oZYF697tJoqXeQEk0uw0fm+OkkOuDTBA3Oax9ftoNIrCKv9bwgYvxrbM6w== +"@octokit/rest@^18.0.0": + version "18.0.9" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.0.9.tgz#964d707d914eb34b1787895fdcacff96de47844d" + integrity sha512-CC5+cIx974Ygx9lQNfUn7/oXDQ9kqGiKUC6j1A9bAVZZ7aoTF8K6yxu0pQhQrLBwSl92J6Z3iVDhGhGFgISCZg== + dependencies: + "@octokit/core" "^3.0.0" + "@octokit/plugin-paginate-rest" "^2.2.0" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "4.2.1" + +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b" + integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ== + dependencies: + "@types/node" ">= 8" + +"@semantic-release/commit-analyzer@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz#5d2a37cd5a3312da0e3ac05b1ca348bf60b90bca" + integrity sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A== dependencies: conventional-changelog-angular "^5.0.0" conventional-commits-filter "^2.0.0" - conventional-commits-parser "^3.0.0" + conventional-commits-parser "^3.0.7" debug "^4.0.0" - import-from "^2.1.0" + import-from "^3.0.0" lodash "^4.17.4" + micromatch "^4.0.2" "@semantic-release/error@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-2.2.0.tgz#ee9d5a09c9969eade1ec864776aeda5c5cddbbf0" integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg== -"@semantic-release/github@^5.1.0": - version "5.2.10" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-5.2.10.tgz#bf325f11685d59b864c8946d7d30fcb749d89e37" - integrity sha512-z/UwIxKb+EMiJDIy/57MBzJ80ar5H9GJQRyML/ILQ8dlrPwXs7cTyTvC7AesrF7t1mJZtg3ht9Qf9RdtR/LGzw== +"@semantic-release/github@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.2.0.tgz#925f3efd91adabfc4bbe0de24b79fe1a8a38b4e2" + integrity sha512-tMRnWiiWb43whRHvbDGXq4DGEbKRi56glDpXDJZit4PIiwDPX7Kx3QzmwRtDOcG+8lcpGjpdPabYZ9NBxoI2mw== dependencies: - "@octokit/rest" "^16.13.1" + "@octokit/rest" "^18.0.0" "@semantic-release/error" "^2.2.0" - aggregate-error "^2.0.0" - bottleneck "^2.0.1" + aggregate-error "^3.0.0" + bottleneck "^2.18.1" debug "^4.0.0" - dir-glob "^2.0.0" - fs-extra "^7.0.0" - globby "^9.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - issue-parser "^3.0.0" + dir-glob "^3.0.0" + fs-extra "^9.0.0" + globby "^11.0.0" + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + issue-parser "^6.0.0" lodash "^4.17.4" - mime "^2.0.3" - p-filter "^1.0.0" - p-retry "^3.0.0" - parse-github-url "^1.0.1" + mime "^2.4.3" + p-filter "^2.0.0" + p-retry "^4.0.0" url-join "^4.0.0" -"@semantic-release/npm@^5.0.5": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-5.1.4.tgz#970b62765e6c5d51f94e1c14d3bc1f5a224e2ed0" - integrity sha512-YRl8VTVwnRTl/sVRvTXs1ncYcuvuGrqPEXYy+lUK1YRLq25hkrhIdv3Ju0u1zGLqVCA8qRlF3NzWl7pULJXVog== +"@semantic-release/npm@^7.0.0": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-7.0.8.tgz#228b6327d9e9e9d0adc7bf37b8be3d6fc9744e3e" + integrity sha512-8c1TLwKB/xT5E1FNs5l4GFtaNTznHesJk7tw3pGSlVxRqDXa1EZI+DfziZlO58Wk3PpS2ecu661kvBdz9aMgYQ== dependencies: "@semantic-release/error" "^2.2.0" - aggregate-error "^2.0.0" - execa "^1.0.0" - fs-extra "^7.0.0" - lodash "^4.17.4" + aggregate-error "^3.0.0" + execa "^4.0.0" + fs-extra "^9.0.0" + lodash "^4.17.15" nerf-dart "^1.0.0" - normalize-url "^4.0.0" - npm "6.5.0" + normalize-url "^5.0.0" + npm "^6.14.8" rc "^1.2.8" - read-pkg "^4.0.0" - registry-auth-token "^3.3.1" + read-pkg "^5.0.0" + registry-auth-token "^4.0.0" + semver "^7.1.2" + tempy "^1.0.0" -"@semantic-release/release-notes-generator@^7.1.2": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-7.1.4.tgz#8f4f752c5a8385abdaac1256127cef05988bc2ad" - integrity sha512-pWPouZujddgb6t61t9iA9G3yIfp3TeQ7bPbV1ixYSeP6L7gI1+Du82fY/OHfEwyifpymLUQW0XnIKgKct5IMMw== +"@semantic-release/release-notes-generator@^9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz#732d285d103064f2a64f08a32031551ebb4f918b" + integrity sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ== dependencies: conventional-changelog-angular "^5.0.0" conventional-changelog-writer "^4.0.0" conventional-commits-filter "^2.0.0" conventional-commits-parser "^3.0.0" debug "^4.0.0" - get-stream "^4.0.0" - import-from "^2.1.0" - into-stream "^4.0.0" + get-stream "^5.0.0" + import-from "^3.0.0" + into-stream "^5.0.0" lodash "^4.17.4" + read-pkg-up "^7.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@turf/along@^5.1.5": version "5.1.5" @@ -1287,20 +1369,6 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -1326,21 +1394,41 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== "@types/node@*": version "11.13.8" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== +"@types/node@>= 8": + version "14.14.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.8.tgz#2127bd81949a95c8b7d3240f3254352d72563aec" + integrity sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/retry@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1378,7 +1466,7 @@ lodash.unescape "4.0.1" semver "5.5.0" -JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.4: +JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -1471,13 +1559,20 @@ add-dom-event-listener@^1.1.0: dependencies: object-assign "4.x" -agent-base@4, agent-base@^4.1.0, agent-base@^4.3.0: +agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + agent-base@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -1492,14 +1587,6 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -aggregate-error@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-2.2.0.tgz#f54b464db18cc77c907ae084451f39134707134a" - integrity sha512-E5n+IZkhh22/pFdUvHUU/o9z752lc+7tgHt+FXS/g6BjlbE9249dGmuS/SxIWMPhTljZJkFN+7OXE0+O5+WT8w== - dependencies: - clean-stack "^2.0.0" - indent-string "^3.0.0" - aggregate-error@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" @@ -1556,11 +1643,18 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" @@ -1581,6 +1675,11 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.0.1.tgz#b033f57f93e2d28adeb8bc11138fa13da0fd20a3" @@ -1603,6 +1702,13 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansicolors@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" @@ -1621,12 +1727,12 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2, aproba@~1.2.0: +aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -"aproba@^1.1.2 || 2": +"aproba@^1.1.2 || 2", aproba@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== @@ -1778,17 +1884,10 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= -array-union@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@^2.1.0: version "2.1.0" @@ -1922,10 +2021,10 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== atob@^2.1.1: version "2.1.2" @@ -2181,10 +2280,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" - integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== +before-after-hook@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" + integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== bin-links@^1.1.2: version "1.1.2" @@ -2197,6 +2296,18 @@ bin-links@^1.1.2: graceful-fs "^4.1.11" write-file-atomic "^2.3.0" +bin-links@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228" + integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ== + dependencies: + bluebird "^3.5.3" + cmd-shim "^3.0.0" + gentle-fs "^2.3.0" + graceful-fs "^4.1.15" + npm-normalize-package-bin "^1.0.0" + write-file-atomic "^2.3.0" + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -2216,18 +2327,16 @@ bl@^3.0.0: dependencies: readable-stream "^3.0.1" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3: version "3.5.4" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + blueimp-md5@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.3.1.tgz#992a6737733b9da1edd641550dc3acab2e9cfc5a" @@ -2298,10 +2407,10 @@ bootstrap@^3.4.1: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== -bottleneck@^2.0.1: - version "2.18.0" - resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.18.0.tgz#41fa63ae185b65435d789d1700334bc48222dacf" - integrity sha512-U1xiBRaokw4yEguzikOl0VrnZp6uekjpmfrh6rKtr1D+/jFjYCL6J83ZXlGtlBDwVdTmJJ+4Lg5FpB3xmLSiyA== +bottleneck@^2.18.1: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== boxen@^1.2.1: version "1.3.0" @@ -2340,6 +2449,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -2517,11 +2633,6 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= - budo@^11.6.1: version "11.6.3" resolved "https://registry.yarnpkg.com/budo/-/budo-11.6.3.tgz#146408e1f646b2b30528bef88fb491e3fd34fdf3" @@ -2612,11 +2723,6 @@ bugsnag-react@^1.1.1: resolved "https://registry.yarnpkg.com/bugsnag-react/-/bugsnag-react-1.1.1.tgz#da210c9102acfa427a3cdd00efa8cca785b87ea8" integrity sha512-u+aodYDZwlmPMj0kCC+nZiO0Rhw4LaJ8ve1cYzEb5gcToPjuIkOfFIQO4T7QhR96V2Uy6UdVw7e04OEPR4/0wg== -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2632,10 +2738,10 @@ byline@^5.0.0: resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= -byte-size@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.4.tgz#29d381709f41aae0d89c631f1c81aec88cd40b23" - integrity sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw== +byte-size@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" + integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== bytes@1.0.0: version "1.0.0" @@ -2652,41 +2758,23 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== +cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: - bluebird "^3.5.3" + bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" - glob "^7.1.3" + glob "^7.1.4" graceful-fs "^4.1.15" + infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.2" + rimraf "^2.6.3" ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -2716,15 +2804,10 @@ cachedir@2.1.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.1.0.tgz#b448c32b44cd9c0cd6ce4c419fa5b3c112c02191" integrity sha512-xGBpPqoBvn3unBW7oxgb8aJn42K0m9m1/wyjmazah10Fq7bROGG3kRAE6OIyr3U3PIJUqGuebhCEdMk9OKJG0A== -call-limit@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" - integrity sha1-b9YbA/PaQqLNDsK2DwK9DnGZH+o= - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +call-limit@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" + integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ== caller-callsite@^2.0.0: version "2.0.0" @@ -2768,6 +2851,15 @@ camelcase-keys@^6.0.0: map-obj "^4.0.0" quick-lru "^4.0.1" +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" @@ -2866,6 +2958,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2912,22 +3012,17 @@ chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.2: optionalDependencies: fsevents "^1.2.7" -chownr@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== - chownr@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== -chownr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= +chownr@^1.1.2, chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^1.5.0, ci-info@^1.6.0: +ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== @@ -3004,7 +3099,7 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-table3@^0.5.0: +cli-table3@^0.5.0, cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== @@ -3053,12 +3148,21 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -cmd-shim@^2.0.2, cmd-shim@~2.0.2: +cmd-shim@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" integrity sha1-b8vamUg6j9FdfTChlspp1oii79s= @@ -3066,6 +3170,14 @@ cmd-shim@^2.0.2, cmd-shim@~2.0.2: graceful-fs "^4.1.2" mkdirp "~0.5.0" +cmd-shim@^3.0.0, cmd-shim@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-3.0.3.tgz#2c35238d3df37d98ecdd7d5f6b8dc6b21cadc7cb" + integrity sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA== + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3100,12 +3212,19 @@ color-convert@^1.9.0, color-convert@^1.9.1: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -3257,7 +3376,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: +concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3384,6 +3503,19 @@ conventional-commits-parser@^3.0.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" +conventional-commits-parser@^3.0.7: + version "3.2.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz#9e261b139ca4b7b29bcebbc54460da36894004ca" + integrity sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^2.0.0" + through2 "^4.0.0" + trim-off-newlines "^1.0.0" + convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -3482,15 +3614,16 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" - integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.0" - parse-json "^4.0.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" crc32-stream@^3.0.1: version "3.0.1" @@ -3590,6 +3723,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -3622,6 +3764,11 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + css-animation@^1.3.2: version "1.5.0" resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.5.0.tgz#c96b9097a5ef74a7be8480b45cc44e4ec6ca2bf5" @@ -3898,6 +4045,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3905,13 +4059,6 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -3919,12 +4066,12 @@ debug@~2.2.0: dependencies: ms "0.7.1" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.0.0: +decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -3974,11 +4121,6 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.0.tgz#58ef463a57c08d376547f8869fdc5bcee957f44e" - integrity sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow== - default-gateway@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" @@ -4028,6 +4170,20 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4048,10 +4204,10 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -deprecation@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-1.0.1.tgz#2df79b79005752180816b7b6e079cbd80490d711" - integrity sha512-ccVHpE72+tcIKaGMql33x5MAjKQIZrk+3x2GbJ7TeraUCZWHoT+KSZpoC+JQFsUBlSTXUrBaGiF0j6zVTepPLg== +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== deps-sort@^2.0.0: version "2.0.0" @@ -4127,12 +4283,12 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.0.0, dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== +dir-glob@^3.0.0, dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - path-type "^3.0.0" + path-type "^4.0.0" discontinuous-range@1.0.0: version "1.0.0" @@ -4355,6 +4511,11 @@ emoji-regex@^7.0.1, emoji-regex@^7.0.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -4379,13 +4540,18 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -env-ci@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-3.2.0.tgz#982f02a0501ca8c43bf0765c5bd3d83ffb28b23a" - integrity sha512-TFjNiDlXrL8/pfHswdvJGEZzJcq3aBPb8Eka83hlGLwuNw9F9BC9S9ETlkfkItLRT9k5JgpGgeP+rL6/3cEbcw== +env-ci@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-5.0.2.tgz#48b6687f8af8cdf5e31b8fcf2987553d085249d9" + integrity sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw== dependencies: - execa "^1.0.0" - java-properties "^0.2.9" + execa "^4.0.0" + java-properties "^1.0.0" + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== envify@^4.1.0: version "4.1.0" @@ -4981,6 +5147,21 @@ execa@^2.0.4: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + exenv@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.0.tgz#3835f127abf075bfe082d0aed4484057c78e3c89" @@ -5151,17 +5332,17 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-glob@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" - integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -5173,6 +5354,13 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" @@ -5200,7 +5388,7 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" -figgy-pudding@^3.0.0, figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== @@ -5212,6 +5400,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -5234,6 +5429,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" @@ -5441,7 +5643,7 @@ from2@^1.3.0: inherits "~2.0.1" readable-stream "~1.1.10" -from2@^2.0.3, from2@^2.1.0, from2@^2.1.1: +from2@^2.0.3, from2@^2.1.0, from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -5481,6 +5683,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -5520,16 +5732,6 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5584,7 +5786,7 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== -gentle-fs@^2.0.0, gentle-fs@^2.0.1: +gentle-fs@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew== @@ -5598,6 +5800,23 @@ gentle-fs@^2.0.0, gentle-fs@^2.0.1: read-cmd-shim "^1.0.1" slide "^1.1.6" +gentle-fs@^2.3.0, gentle-fs@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1" + integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q== + dependencies: + aproba "^1.1.2" + chownr "^1.1.2" + cmd-shim "^3.0.3" + fs-vacuum "^1.2.10" + graceful-fs "^4.1.11" + iferr "^0.1.5" + infer-owner "^1.0.4" + mkdirp "^0.5.1" + path-is-inside "^1.0.2" + read-cmd-shim "^1.0.1" + slide "^1.1.6" + geojson-area@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/geojson-area/-/geojson-area-0.2.1.tgz#2537b0982db86309f21d2c428a4257c7a6282cc6" @@ -5651,7 +5870,7 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -5725,10 +5944,12 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" glob@7.0.5: version "7.0.5" @@ -5742,7 +5963,7 @@ glob@7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3, glob@^7.0.3: +glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -5777,6 +5998,18 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~4.3.0: version "4.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3" @@ -5819,19 +6052,17 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^9.0.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== +globby@^11.0.0, globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" got@^6.7.1: version "6.7.1" @@ -5860,6 +6091,11 @@ graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.2.2, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + gravatar@^1.5.2: version "1.8.0" resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.0.tgz#1dd9ce0f6bb625802377233b96796181b39af8ff" @@ -5899,6 +6135,11 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" @@ -5918,16 +6159,16 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" @@ -6052,17 +6293,24 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hook-std@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-1.2.0.tgz#b37d533ea5f40068fe368cb4d022ee1992588c27" - integrity sha512-yntre2dbOAjgQ5yoRykyON0D9T96BfshR8IuiL/r3celeHD8I/76w4qo8m3z99houR4Z678jakV3uXrQdSvW/w== +hook-std@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" + integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g== -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -hsl-regex@^1.0.0: +hosted-git-info@^3.0.0, hosted-git-info@^3.0.6: + version "3.0.7" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" + integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== + dependencies: + lru-cache "^6.0.0" + +hsl-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= @@ -6142,6 +6390,15 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" +http-proxy-agent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -6156,7 +6413,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: +https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== @@ -6172,6 +6429,19 @@ https-proxy-agent@^3.0.0: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + humanize-duration@^3.18.0: version "3.18.0" resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.18.0.tgz#ba07a945d6d4358b9751fecabe27864bf965afbc" @@ -6242,7 +6512,7 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -6252,6 +6522,11 @@ ignore@^5.0.2, ignore@^5.1.2: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -6278,12 +6553,20 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= +import-fresh@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== dependencies: - resolve-from "^3.0.0" + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" import-lazy@^2.1.0: version "2.1.0" @@ -6298,7 +6581,7 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -6323,6 +6606,11 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/individual/-/individual-3.0.0.tgz#e7ca4f85f8957b018734f285750dc22ec2f9862d" integrity sha1-58pPhfiVewGHNPKFdQ3CLsL5hi0= +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4, inflight@~1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6331,7 +6619,7 @@ inflight@^1.0.4, inflight@~1.0.6: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6460,13 +6748,13 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -into-stream@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-4.0.0.tgz#ef10ee2ffb6f78af34c93194bbdc36c35f7d8a9d" - integrity sha512-i29KNyE5r0Y/UQzcQ0IbZO1MYJ53Jn0EcFRZPj5FzWKYH17kDFEOwuA+3jroymOI06SW1dEDnly9A1CAreC5dg== +into-stream@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8" + integrity sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA== dependencies: - from2 "^2.1.1" - p-is-promise "^2.0.0" + from2 "^2.3.0" + p-is-promise "^3.0.0" invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" @@ -6490,7 +6778,7 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ip@^1.1.4, ip@^1.1.5: +ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= @@ -6556,13 +6844,6 @@ is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" - is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -6582,10 +6863,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-cidr@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-2.0.7.tgz#0fd4b863c26b2eb2d157ed21060c4f3f8dd356ce" - integrity sha512-YfOm5liUO1RoYfFh+lhiGNYtbLzem7IXzFqvfjXh+zLCEuAiznTBlQ2QcMWxsgYeOFmjzljOxJfmZID4/cRBAQ== +is-cidr@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.1.tgz#e92ef121bdec2782271a77ce487a8b8df3718ab7" + integrity sha512-Gx+oErgq1j2jAKCR2Kbq0b3wbH0vQKqZ0wOlHxm0o56nq51Cs/DZA8oz9dMDhbHyHEGgJ86eTeVudtgMMOx3Mw== dependencies: cidr-regex "^2.0.10" @@ -6601,6 +6882,13 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" +is-core-module@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6679,6 +6967,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -6691,7 +6984,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -6723,11 +7016,21 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -6735,6 +7038,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -6747,6 +7055,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-promise@^2.1, is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -6808,7 +7121,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-text-path@^1.0.0: +is-text-path@^1.0.0, is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= @@ -6893,10 +7206,10 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -issue-parser@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-3.0.1.tgz#ee8dd677fdb5be64541f81fa5e7267baa271a7ee" - integrity sha512-5wdT3EE8Kq38x/hJD8QZCJ9scGoOZ5QnzwXyClkviSWTS+xOCE6hJ0qco3H5n5jCsFqpbofZCcMWqlXJzF72VQ== +issue-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-6.0.0.tgz#b1edd06315d4f2044a9755daf85fdafde9b4014a" + integrity sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA== dependencies: lodash.capitalize "^4.2.1" lodash.escaperegexp "^4.1.2" @@ -6979,10 +7292,10 @@ istanbul@0.4.x: which "^1.1.1" wordwrap "^1.0.0" -java-properties@^0.2.9: - version "0.2.10" - resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-0.2.10.tgz#2551560c25fa1ad94d998218178f233ad9b18f60" - integrity sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w== +java-properties@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" + integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== jest-changed-files@^24.8.0: version "24.8.0" @@ -7451,6 +7764,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -7492,6 +7810,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -7612,6 +7939,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + kleur@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -7693,38 +8025,130 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libcipm@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.2.tgz#4f38c2b37acf2ec156936cef1cbf74636568fc7b" - integrity sha512-9uZ6/LAflVEijksTRq/RX0e+pGA4mr8tND9Cmk2JMg7j2fFUBrs8PpFX2DOAJR/XoxPzz+5h8bkWmtIYLunKAg== +libcipm@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" + integrity sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA== dependencies: bin-links "^1.1.2" bluebird "^3.5.1" + figgy-pudding "^3.5.1" find-npm-prefix "^1.0.2" graceful-fs "^4.1.11" - lock-verify "^2.0.2" + ini "^1.3.5" + lock-verify "^2.1.0" mkdirp "^0.5.1" - npm-lifecycle "^2.0.3" + npm-lifecycle "^3.0.0" npm-logical-tree "^1.2.1" npm-package-arg "^6.1.0" - pacote "^8.1.6" - protoduck "^5.0.0" + pacote "^9.1.0" read-package-json "^2.0.13" rimraf "^2.6.2" worker-farm "^1.6.0" -libnpmhook@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-4.0.1.tgz#63641654de772cbeb96a88527a7fd5456ec3c2d7" - integrity sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg== +libnpm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/libnpm/-/libnpm-3.0.1.tgz#0be11b4c9dd4d1ffd7d95c786e92e55d65be77a2" + integrity sha512-d7jU5ZcMiTfBqTUJVZ3xid44fE5ERBm9vBnmhp2ECD2Ls+FNXWxHSkO7gtvrnbLO78gwPdNPz1HpsF3W4rjkBQ== dependencies: - figgy-pudding "^3.1.0" - npm-registry-fetch "^3.0.0" + bin-links "^1.1.2" + bluebird "^3.5.3" + find-npm-prefix "^1.0.2" + libnpmaccess "^3.0.2" + libnpmconfig "^1.2.1" + libnpmhook "^5.0.3" + libnpmorg "^1.0.1" + libnpmpublish "^1.1.2" + libnpmsearch "^2.0.2" + libnpmteam "^1.0.2" + lock-verify "^2.0.2" + npm-lifecycle "^3.0.0" + npm-logical-tree "^1.2.1" + npm-package-arg "^6.1.0" + npm-profile "^4.0.2" + npm-registry-fetch "^4.0.0" + npmlog "^4.1.2" + pacote "^9.5.3" + read-package-json "^2.0.13" + stringify-package "^1.0.0" -libnpx@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" - integrity sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ== +libnpmaccess@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.2.tgz#8b2d72345ba3bef90d3b4f694edd5c0417f58923" + integrity sha512-01512AK7MqByrI2mfC7h5j8N9V4I7MHJuk9buo8Gv+5QgThpOgpjB7sQBDDkeZqRteFb1QM/6YNdHfG7cDvfAQ== + dependencies: + aproba "^2.0.0" + get-stream "^4.0.0" + npm-package-arg "^6.1.0" + npm-registry-fetch "^4.0.0" + +libnpmconfig@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0" + integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA== + dependencies: + figgy-pudding "^3.5.1" + find-up "^3.0.0" + ini "^1.3.5" + +libnpmhook@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-5.0.3.tgz#4020c0f5edbf08ebe395325caa5ea01885b928f7" + integrity sha512-UdNLMuefVZra/wbnBXECZPefHMGsVDTq5zaM/LgKNE9Keyl5YXQTnGAzEo+nFOpdRqTWI9LYi4ApqF9uVCCtuA== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^4.0.0" + +libnpmorg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-1.0.1.tgz#5d2503f6ceb57f33dbdcc718e6698fea6d5ad087" + integrity sha512-0sRUXLh+PLBgZmARvthhYXQAWn0fOsa6T5l3JSe2n9vKG/lCVK4nuG7pDsa7uMq+uTt2epdPK+a2g6btcY11Ww== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^4.0.0" + +libnpmpublish@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-1.1.3.tgz#e3782796722d79eef1a0a22944c117e0c4ca4280" + integrity sha512-/3LsYqVc52cHXBmu26+J8Ed7sLs/hgGVFMH1mwYpL7Qaynb9RenpKqIKu0sJ130FB9PMkpMlWjlbtU8A4m7CQw== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + lodash.clonedeep "^4.5.0" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-registry-fetch "^4.0.0" + semver "^5.5.1" + ssri "^6.0.1" + +libnpmsearch@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-2.0.2.tgz#9a4f059102d38e3dd44085bdbfe5095f2a5044cf" + integrity sha512-VTBbV55Q6fRzTdzziYCr64+f8AopQ1YZ+BdPOv16UegIEaE8C0Kch01wo4s3kRTFV64P121WZJwgmBwrq68zYg== + dependencies: + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + npm-registry-fetch "^4.0.0" + +libnpmteam@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-1.0.2.tgz#8b48bcbb6ce70dd8150c950fcbdbf3feb6eec820" + integrity sha512-p420vM28Us04NAcg1rzgGW63LMM6rwe+6rtZpfDxCcXxM0zUTLl7nPFEnRF3JfFBF5skF/yuZDUthTsHgde8QA== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^4.0.0" + +libnpx@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.4.tgz#ef0e3258e29aef2ec7ee3276115e20e67f67d4ee" + integrity sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA== dependencies: dotenv "^5.0.1" npm-package-arg "^6.0.0" @@ -7733,7 +8157,7 @@ libnpx@^10.2.0: update-notifier "^2.3.0" which "^1.3.0" y18n "^4.0.0" - yargs "^11.0.0" + yargs "^14.2.3" lie@^3.0.1: version "3.3.0" @@ -7749,6 +8173,11 @@ lie@~3.1.0: dependencies: immediate "~3.0.5" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -7811,6 +8240,15 @@ lock-verify@^2.0.2: npm-package-arg "^6.1.0" semver "^5.4.1" +lock-verify@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1" + integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww== + dependencies: + "@iarna/cli" "^1.2.0" + npm-package-arg "^6.1.0" + semver "^5.4.1" + lockfile@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" @@ -7823,6 +8261,11 @@ lodash-es@^4.2.1: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.14.tgz#12a95a963cc5955683cee3b74e85458954f37ecc" integrity sha512-7zchRrGa8UZXjD/4ivUWP1867jDkhzTG2c/uj739utSd7O/pFFdxspCemIFKEEjErbcqRzn8nKnGsi7mvTgRPA== +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -7831,12 +8274,29 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@^3.0.0: +lodash._getnative@*, lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= @@ -7861,7 +8321,7 @@ lodash.capitalize@^4.2.1: resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= -lodash.clonedeep@~4.5.0: +lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= @@ -7896,11 +8356,6 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -7960,10 +8415,10 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= lodash.sortby@^4.7.0: version "4.7.0" @@ -8020,10 +8475,10 @@ lodash@4.17.14: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== lodash@~3.2.0: version "3.2.0" @@ -8085,7 +8540,7 @@ lru-cache@^2.7.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -8100,6 +8555,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + lru-queue@0.1: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" @@ -8107,11 +8569,6 @@ lru-queue@0.1: dependencies: es5-ext "~0.10.2" -macos-release@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.2.0.tgz#ab58d55dd4714f0a05ad4b0e90f4370fef5cdea8" - integrity sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA== - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -8127,40 +8584,23 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -"make-fetch-happen@^2.5.0 || 3 || 4", make-fetch-happen@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" - integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== +make-fetch-happen@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" + integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== dependencies: agentkeepalive "^3.4.1" - cacache "^11.0.1" + cacache "^12.0.0" http-cache-semantics "^3.8.1" http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - lru-cache "^4.1.2" + https-proxy-agent "^2.2.3" + lru-cache "^5.1.1" mississippi "^3.0.0" node-fetch-npm "^2.0.2" promise-retry "^1.1.1" socks-proxy-agent "^4.0.0" ssri "^6.0.0" -make-fetch-happen@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz#7b661d2372fc4710ab5cc8e1fa3c290eea69a961" - integrity sha512-FmWY7gC0mL6Z4N86vE14+m719JKE4H0A+pyiOH18B025gF/C113pyfb4gHDDYP5cqnRMHOz06JGdmffC/SES+w== - dependencies: - agentkeepalive "^3.4.1" - cacache "^10.0.4" - http-cache-semantics "^3.8.1" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.0" - lru-cache "^4.1.2" - mississippi "^3.0.0" - node-fetch-npm "^2.0.2" - promise-retry "^1.1.1" - socks-proxy-agent "^3.0.1" - ssri "^5.2.4" - make-plural@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" @@ -8216,22 +8656,22 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked-terminal@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.2.0.tgz#3fc91d54569332bcf096292af178d82219000474" - integrity sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ== +marked-terminal@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-4.1.0.tgz#01087372d3636dc7cb286475a1d6147187f500e0" + integrity sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ== dependencies: - ansi-escapes "^3.1.0" + ansi-escapes "^4.3.1" cardinal "^2.1.1" - chalk "^2.4.1" + chalk "^4.0.0" cli-table "^0.3.1" - node-emoji "^1.4.1" - supports-hyperlinks "^1.0.1" + node-emoji "^1.10.0" + supports-hyperlinks "^2.1.0" -marked@^0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a" - integrity sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA== +marked@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.4.tgz#94e99230b03496c9383b1322ac51bc17dd388a1d" + integrity sha512-6x5TFGCTKSQBLTZtOburGxCxFEBJEGYVLwCMTBCxzvyuisGcC20UNzDSJhCr/cJ/Kmh6ulfJm10g6WWEAJ3kvg== mastarm@^5.3.1: version "5.3.1" @@ -8349,10 +8789,10 @@ mdn-data@~1.1.0: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== -meant@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" - integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== +meant@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.3.tgz#67769af9de1d158773e928ae82c456114903554c" + integrity sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw== media-typer@0.3.0: version "0.3.0" @@ -8404,6 +8844,23 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" +meow@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.0.0.tgz#1aa10ee61046719e334ffdc038bb5069250ec99a" + integrity sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8421,10 +8878,10 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== merge@^1.2.1: version "1.2.1" @@ -8479,6 +8936,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + middleware-proxy@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/middleware-proxy/-/middleware-proxy-2.0.5.tgz#4038f309a1ee95afd3d017bc701950df82fd1660" @@ -8538,6 +9003,11 @@ mime@^2.4.0: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== +mime@^2.4.3: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -8548,6 +9018,11 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -8579,6 +9054,15 @@ minimatch@^2.0.1: dependencies: brace-expansion "^1.0.0" +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" @@ -8602,12 +9086,17 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.3, minipass@^2.3.4, minipass@^2.3.5: +minipass@^2.2.1, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -8615,29 +9104,21 @@ minipass@^2.2.1, minipass@^2.3.3, minipass@^2.3.4, minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1, minizlib@^1.2.1: +minipass@^2.8.6: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -8662,13 +9143,20 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -8740,7 +9228,7 @@ ms@2.1.1, ms@^2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -8842,7 +9330,7 @@ nock@^9.0.14: qs "^6.5.1" semver "^5.5.0" -node-emoji@^1.10.0, node-emoji@^1.4.1: +node-emoji@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== @@ -8866,28 +9354,27 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.4.0.tgz#125ae2b0c2a75cb3b2ed141bf73e106cfe1f0ca8" - integrity sha512-1mt8bw5JQWWTcwUM1FGjFJLFo5lB/jz6zbm+qwdEh2iqYobKS4aHWgz1d+mvho5cqCaShFDF+hnpgraIi/5tqA== +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== +node-gyp@^5.0.2, node-gyp@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" + integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" node-int64@^0.4.0: version "0.4.0" @@ -8938,14 +9425,14 @@ node-releases@^1.1.25: dependencies: semver "^5.3.0" -"nopt@2 || 3", nopt@3.x: +nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" -nopt@^4.0.1, nopt@~4.0.1: +nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= @@ -8953,7 +9440,15 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0": +nopt@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8963,14 +9458,14 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@~2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2" - integrity sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw== +normalize-package-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" + integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" + hosted-git-info "^3.0.6" + resolve "^1.17.0" + semver "^7.3.2" validate-npm-package-license "^3.0.1" normalize-path@^2.1.1: @@ -8995,15 +9490,15 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -normalize-url@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" - integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== +normalize-url@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.3.0.tgz#8959b3cdaa295b61592c1f245dded34b117618dd" + integrity sha512-9/nOVLYYe/dO/eJeQUNaGUF4m4Z5E7cb9oNTKabH+bNf19mqj60txTcveQxL0GlcWLXCxkOu2/LwL8oW0idIDA== -npm-audit-report@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.2.tgz#303bc78cd9e4c226415076a4f7e528c89fc77018" - integrity sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw== +npm-audit-report@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.3.tgz#8226deeb253b55176ed147592a3995442f2179ed" + integrity sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw== dependencies: cli-table3 "^0.5.0" console-control-strings "^1.1.0" @@ -9018,21 +9513,21 @@ npm-cache-filename@~1.0.2: resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE= -npm-install-checks@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" - integrity sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc= +npm-install-checks@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.2.tgz#ab2e32ad27baa46720706908e5b14c1852de44d9" + integrity sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg== dependencies: semver "^2.3.0 || 3.x || 4 || 5" -npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569" - integrity sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g== +npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" + integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== dependencies: byline "^5.0.0" - graceful-fs "^4.1.11" - node-gyp "^3.8.0" + graceful-fs "^4.1.15" + node-gyp "^5.0.2" resolve-from "^4.0.0" slide "^1.1.6" uid-number "0.0.6" @@ -9044,7 +9539,12 @@ npm-logical-tree@^1.2.1: resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg== -"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== @@ -9054,7 +9554,17 @@ npm-logical-tree@^1.2.1: semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.10, npm-packlist@^1.1.12: +npm-package-arg@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== + dependencies: + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.12: version "1.4.1" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== @@ -9070,6 +9580,15 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" +npm-packlist@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-path@^2.0.2, npm-path@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" @@ -9077,65 +9596,36 @@ npm-path@^2.0.2, npm-path@^2.0.4: dependencies: which "^1.2.10" -npm-pick-manifest@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" - integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== +npm-pick-manifest@^3.0.0, npm-pick-manifest@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" + integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw== dependencies: figgy-pudding "^3.5.1" npm-package-arg "^6.0.0" semver "^5.4.1" -npm-profile@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-3.0.2.tgz#58d568f1b56ef769602fd0aed8c43fa0e0de0f57" - integrity sha512-rEJOFR6PbwOvvhGa2YTNOJQKNuc6RovJ6T50xPU7pS9h/zKPNCJ+VHZY2OFXyZvEi+UQYtHRTp8O/YM3tUD20A== +npm-profile@^4.0.2, npm-profile@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.4.tgz#28ee94390e936df6d084263ee2061336a6a1581b" + integrity sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ== dependencies: aproba "^1.1.2 || 2" - make-fetch-happen "^2.5.0 || 3 || 4" - -npm-registry-client@^8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" - integrity sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg== - dependencies: - concat-stream "^1.5.2" - graceful-fs "^4.1.6" - normalize-package-data "~1.0.1 || ^2.0.0" - npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - once "^1.3.3" - request "^2.74.0" - retry "^0.10.0" - safe-buffer "^5.1.1" - semver "2 >=2.2.1 || 3.x || 4 || 5" - slide "^1.1.3" - ssri "^5.2.4" - optionalDependencies: - npmlog "2 || ^3.1.0 || ^4.0.0" - -npm-registry-fetch@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-1.1.1.tgz#710bc5947d9ee2c549375072dab6d5d17baf2eb2" - integrity sha512-ev+zxOXsgAqRsR8Rk+ErjgWOlbrXcqGdme94/VNdjDo1q8TSy10Pp8xgDv/ZmMk2jG/KvGtXUNG4GS3+l6xbDw== - dependencies: - bluebird "^3.5.1" - figgy-pudding "^3.0.0" - lru-cache "^4.1.2" - make-fetch-happen "^3.0.0" - npm-package-arg "^6.0.0" - safe-buffer "^5.1.1" + figgy-pudding "^3.4.1" + npm-registry-fetch "^4.0.0" -npm-registry-fetch@^3.0.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz#44d841780e2833f06accb34488f8c7450d1a6856" - integrity sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw== +npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7" + integrity sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" figgy-pudding "^3.4.1" - lru-cache "^4.1.3" - make-fetch-happen "^4.0.1" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" npm-package-arg "^6.1.0" + safe-buffer "^5.2.0" npm-run-path@^2.0.0: version "2.0.2" @@ -9151,6 +9641,13 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + npm-run@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/npm-run/-/npm-run-5.0.1.tgz#1baea93389b50ae25a32382c8ca322398e50cd16" @@ -9175,29 +9672,30 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -npm@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.5.0.tgz#30ed48d4cd4d17d68ee04a5fcf9fa2ca9167d819" - integrity sha512-SPq8zG2Kto+Xrq55E97O14Jla13PmQT5kSnvwBj88BmJZ5Nvw++OmlWfhjkB67pcgP5UEXljEtnGFKZtOgt6MQ== +npm@^6.14.8: + version "6.14.8" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.8.tgz#64ef754345639bc035982ec3f609353c8539033c" + integrity sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A== dependencies: - JSONStream "^1.3.4" + JSONStream "^1.3.5" abbrev "~1.1.1" ansicolors "~0.3.2" ansistyles "~0.1.3" - aproba "~1.2.0" + aproba "^2.0.0" archy "~1.0.0" - bin-links "^1.1.2" - bluebird "^3.5.3" - byte-size "^4.0.3" - cacache "^11.2.0" - call-limit "~1.1.0" - chownr "~1.0.1" - ci-info "^1.6.0" + bin-links "^1.1.8" + bluebird "^3.5.5" + byte-size "^5.0.1" + cacache "^12.0.3" + call-limit "^1.1.1" + chownr "^1.1.4" + ci-info "^2.0.0" cli-columns "^3.1.2" - cli-table3 "^0.5.0" - cmd-shim "~2.0.2" + cli-table3 "^0.5.1" + cmd-shim "^3.0.3" columnify "~1.5.4" config-chain "^1.1.12" + debuglog "*" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" @@ -9206,91 +9704,104 @@ npm@6.5.0: find-npm-prefix "^1.0.2" fs-vacuum "~1.2.10" fs-write-stream-atomic "~1.0.10" - gentle-fs "^2.0.1" - glob "^7.1.3" - graceful-fs "^4.1.15" + gentle-fs "^2.3.1" + glob "^7.1.6" + graceful-fs "^4.2.4" has-unicode "~2.0.1" - hosted-git-info "^2.7.1" + hosted-git-info "^2.8.8" iferr "^1.0.2" + imurmurhash "*" + infer-owner "^1.0.4" inflight "~1.0.6" - inherits "~2.0.3" + inherits "^2.0.4" ini "^1.3.5" init-package-json "^1.10.3" - is-cidr "^2.0.6" + is-cidr "^3.0.0" json-parse-better-errors "^1.0.2" lazy-property "~1.0.0" - libcipm "^2.0.2" - libnpmhook "^4.0.1" - libnpx "^10.2.0" - lock-verify "^2.0.2" + libcipm "^4.0.8" + libnpm "^3.0.1" + libnpmaccess "^3.0.2" + libnpmhook "^5.0.3" + libnpmorg "^1.0.1" + libnpmsearch "^2.0.2" + libnpmteam "^1.0.2" + libnpx "^10.2.4" + lock-verify "^2.1.0" lockfile "^1.0.4" + lodash._baseindexof "*" lodash._baseuniq "~4.6.0" + lodash._bindcallback "*" + lodash._cacheindexof "*" + lodash._createcache "*" + lodash._getnative "*" lodash.clonedeep "~4.5.0" + lodash.restparam "*" lodash.union "~4.6.0" lodash.uniq "~4.5.0" lodash.without "~4.4.0" - lru-cache "^4.1.3" - meant "~1.0.1" + lru-cache "^5.1.1" + meant "^1.0.2" mississippi "^3.0.0" - mkdirp "~0.5.1" + mkdirp "^0.5.5" move-concurrently "^1.0.1" - node-gyp "^3.8.0" - nopt "~4.0.1" - normalize-package-data "~2.4.0" - npm-audit-report "^1.3.1" + node-gyp "^5.1.0" + nopt "^4.0.3" + normalize-package-data "^2.5.0" + npm-audit-report "^1.3.3" npm-cache-filename "~1.0.2" - npm-install-checks "~3.0.0" - npm-lifecycle "^2.1.0" - npm-package-arg "^6.1.0" - npm-packlist "^1.1.12" - npm-pick-manifest "^2.1.0" - npm-profile "^3.0.2" - npm-registry-client "^8.6.0" - npm-registry-fetch "^1.1.0" + npm-install-checks "^3.0.2" + npm-lifecycle "^3.1.5" + npm-package-arg "^6.1.1" + npm-packlist "^1.4.8" + npm-pick-manifest "^3.0.2" + npm-profile "^4.0.4" + npm-registry-fetch "^4.0.7" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" opener "^1.5.1" osenv "^0.1.5" - pacote "^8.1.6" + pacote "^9.5.12" path-is-inside "~1.0.2" promise-inflight "~1.0.1" qrcode-terminal "^0.12.0" - query-string "^6.1.0" + query-string "^6.8.2" qw "~1.0.1" read "~1.0.7" - read-cmd-shim "~1.0.1" + read-cmd-shim "^1.0.5" read-installed "~4.0.3" - read-package-json "^2.0.13" - read-package-tree "^5.2.1" - readable-stream "^2.3.6" + read-package-json "^2.1.1" + read-package-tree "^5.3.1" + readable-stream "^3.6.0" + readdir-scoped-modules "^1.1.0" request "^2.88.0" retry "^0.12.0" - rimraf "~2.6.2" + rimraf "^2.7.1" safe-buffer "^5.1.2" - semver "^5.5.1" - sha "~2.0.1" + semver "^5.7.1" + sha "^3.0.0" slide "~1.1.6" sorted-object "~2.0.1" sorted-union-stream "~2.1.3" ssri "^6.0.1" - stringify-package "^1.0.0" - tar "^4.4.8" + stringify-package "^1.0.1" + tar "^4.4.13" text-table "~0.2.0" tiny-relative-date "^1.3.0" uid-number "0.0.6" umask "~1.1.0" - unique-filename "~1.1.0" + unique-filename "^1.1.1" unpipe "~1.0.0" update-notifier "^2.5.0" - uuid "^3.3.2" + uuid "^3.3.3" validate-npm-package-license "^3.0.4" validate-npm-package-name "~3.0.0" which "^1.3.1" - worker-farm "^1.6.0" - write-file-atomic "^2.3.0" + worker-farm "^1.7.0" + write-file-atomic "^2.4.3" -"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.2, npmlog@~4.1.2: +npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -9438,11 +9949,6 @@ object.values@^1.0.4, object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" -octokit-pagination-methods@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== - on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -9462,7 +9968,7 @@ on-headers@^1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0, once@~1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -9557,20 +10063,12 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-name@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== - dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - 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" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4, osenv@^0.1.5: +osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -9597,12 +10095,17 @@ p-each-series@^1.0.0: dependencies: p-reduce "^1.0.0" -p-filter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-1.0.0.tgz#629d317150209c8fd508ba137713ef4bb920e9db" - integrity sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds= +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + +p-filter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== dependencies: - p-map "^1.0.0" + p-map "^2.0.0" p-finally@^1.0.0: version "1.0.0" @@ -9619,6 +10122,11 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-is-promise@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" + integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -9654,21 +10162,34 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= -p-retry@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-reduce@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-retry@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.2.0.tgz#ea9066c6b44f23cab4cd42f6147cdbbc6604da5d" + integrity sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA== dependencies: + "@types/retry" "^0.12.0" retry "^0.12.0" p-try@^1.0.0: @@ -9691,36 +10212,41 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" -pacote@^8.1.6: - version "8.1.6" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-8.1.6.tgz#8e647564d38156367e7a9dc47a79ca1ab278d46e" - integrity sha512-wTOOfpaAQNEQNtPEx92x9Y9kRWVu45v583XT8x2oEV2xRB74+xdqMZIeGW4uFvAyZdmSBtye+wKdyyLaT8pcmw== +pacote@^9.1.0, pacote@^9.5.12, pacote@^9.5.3: + version "9.5.12" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66" + integrity sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ== dependencies: - bluebird "^3.5.1" - cacache "^11.0.2" - get-stream "^3.0.0" - glob "^7.1.2" - lru-cache "^4.1.3" - make-fetch-happen "^4.0.1" + bluebird "^3.5.3" + cacache "^12.0.2" + chownr "^1.1.2" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.3" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" minimatch "^3.0.4" - minipass "^2.3.3" + minipass "^2.3.5" mississippi "^3.0.0" mkdirp "^0.5.1" normalize-package-data "^2.4.0" + npm-normalize-package-bin "^1.0.0" npm-package-arg "^6.1.0" - npm-packlist "^1.1.10" - npm-pick-manifest "^2.1.0" + npm-packlist "^1.1.12" + npm-pick-manifest "^3.0.0" + npm-registry-fetch "^4.0.0" osenv "^0.1.5" promise-inflight "^1.0.1" promise-retry "^1.1.1" - protoduck "^5.0.0" + protoduck "^5.0.1" rimraf "^2.6.2" safe-buffer "^5.1.2" - semver "^5.5.0" - ssri "^6.0.0" - tar "^4.4.3" - unique-filename "^1.1.0" - which "^1.3.0" + semver "^5.6.0" + ssri "^6.0.1" + tar "^4.4.10" + unique-filename "^1.1.1" + which "^1.3.1" pad-left@^2.0.0: version "2.1.0" @@ -9781,11 +10307,6 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-github-url@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" - integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== - parse-json@2.2.0, parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -9801,6 +10322,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" @@ -9893,6 +10424,11 @@ path-key@^3.0.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -9931,6 +10467,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -9967,6 +10508,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10828,7 +11374,7 @@ protochain@^1.0.5: resolved "https://registry.yarnpkg.com/protochain/-/protochain-1.0.5.tgz#991c407e99de264aadf8f81504b5e7faf7bfa260" integrity sha1-mRxAfpneJkqt+PgVBLXn+ve/omA= -protoduck@^5.0.0: +protoduck@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== @@ -10875,7 +11421,7 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0, pump@^2.0.1: +pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== @@ -10962,10 +11508,10 @@ query-string@^4.2.2, query-string@^4.2.3: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.1.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.4.2.tgz#8be1dbd105306aebf86022144f575a29d516b713" - integrity sha512-DfJqAen17LfLA3rQ+H5S4uXphrF+ANU1lT2ijds4V/Tj4gZxA3gx5/tg1bz7kYCmwna7LyJNCYqO7jNRzo3aLw== +query-string@^6.8.2: + version "6.13.7" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee" + integrity sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -11480,13 +12026,20 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: +read-cmd-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= dependencies: graceful-fs "^4.1.2" +read-cmd-shim@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" + integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA== + dependencies: + graceful-fs "^4.1.2" + read-installed@~4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" @@ -11520,16 +12073,24 @@ read-only-stream@^2.0.0: optionalDependencies: graceful-fs "^4.1.2" -read-package-tree@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.2.tgz#4b6a0ef2d943c1ea36a578214c9a7f6b7424f7a8" - integrity sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA== +read-package-json@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-tree@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" + integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - once "^1.3.0" read-package-json "^2.0.0" readdir-scoped-modules "^1.0.0" + util-promisify "^2.1.0" read-pkg-up@^1.0.1: version "1.0.1" @@ -11563,6 +12124,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -11590,14 +12160,15 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -read-pkg@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= +read-pkg@^5.0.0, read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" read@1, read@^1.0.4, read@~1.0.1, read@~1.0.7: version "1.0.7" @@ -11628,6 +12199,15 @@ read@1, read@^1.0.4, read@~1.0.1, read@~1.0.7: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@3, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26, readable-stream@~1.0.33: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -11679,6 +12259,16 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" +readdir-scoped-modules@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -11710,6 +12300,14 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redeyed@~2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" @@ -11877,7 +12475,7 @@ regexpu-core@^4.5.4: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" -registry-auth-token@^3.0.1, registry-auth-token@^3.3.1: +registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== @@ -11885,6 +12483,13 @@ registry-auth-token@^3.0.1, registry-auth-token@^3.3.1: rc "^1.1.6" safe-buffer "^5.0.1" +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -12040,6 +12645,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -12064,6 +12674,14 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" +resolve@^1.17.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + resp-modifier@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" @@ -12095,6 +12713,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -12115,20 +12738,34 @@ right-pad@^1.0.1: resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" integrity sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA= -rimraf@2, rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: 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" -rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" +rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -12162,6 +12799,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + 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" @@ -12186,6 +12828,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -12223,37 +12870,39 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semantic-release@^15.13.3: - version "15.13.3" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-15.13.3.tgz#412720b9c09f39f04df67478fa409a914107e05b" - integrity sha512-cax0xPPTtsxHlrty2HxhPql2TTvS74Ni2O8BzwFHxNY/mviVKEhI4OxHzBYJkpVxx1fMVj36+oH7IlP+SJtPNA== +semantic-release@^17.2.3: + version "17.2.3" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.2.3.tgz#11f10b851d4e75b1015b17515c433049b3df994c" + integrity sha512-MY1MlowGQrkOR7+leOD8ICkVOC6i1szbwDODdbJ0UdshtMx8Ms0bhpRQmEEliqYKEb5PLv/dqs6zKKuHT7UxTg== dependencies: - "@semantic-release/commit-analyzer" "^6.1.0" + "@semantic-release/commit-analyzer" "^8.0.0" "@semantic-release/error" "^2.2.0" - "@semantic-release/github" "^5.1.0" - "@semantic-release/npm" "^5.0.5" - "@semantic-release/release-notes-generator" "^7.1.2" - aggregate-error "^2.0.0" - cosmiconfig "^5.0.1" + "@semantic-release/github" "^7.0.0" + "@semantic-release/npm" "^7.0.0" + "@semantic-release/release-notes-generator" "^9.0.0" + aggregate-error "^3.0.0" + cosmiconfig "^6.0.0" debug "^4.0.0" - env-ci "^3.0.0" - execa "^1.0.0" - figures "^2.0.0" + env-ci "^5.0.0" + execa "^4.0.0" + figures "^3.0.0" find-versions "^3.0.0" - get-stream "^4.0.0" + get-stream "^5.0.0" git-log-parser "^1.2.0" - hook-std "^1.1.0" - hosted-git-info "^2.7.1" - lodash "^4.17.4" - marked "^0.6.0" - marked-terminal "^3.2.0" - p-locate "^3.0.0" - p-reduce "^1.0.0" - read-pkg-up "^4.0.0" - resolve-from "^4.0.0" - semver "^5.4.1" + hook-std "^2.0.0" + hosted-git-info "^3.0.0" + lodash "^4.17.15" + marked "^1.0.0" + marked-terminal "^4.0.0" + micromatch "^4.0.2" + p-each-series "^2.1.0" + p-reduce "^2.0.0" + read-pkg-up "^7.0.0" + resolve-from "^5.0.0" + semver "^7.3.2" + semver-diff "^3.1.1" signale "^1.2.1" - yargs "^12.0.0" + yargs "^15.0.1" semver-diff@^2.0.0: version "2.1.0" @@ -12262,30 +12911,37 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + semver-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^6.0.0, semver@^6.1.1: +semver@^6.0.0, semver@^6.1.1, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= +semver@^7.1.2, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== send@0.16.2: version "0.16.2" @@ -12390,13 +13046,12 @@ sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: inherits "^2.0.1" safe-buffer "^5.0.1" -sha@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" - integrity sha1-YDCCL70smCOUn49y7WQR7lzyWq4= +sha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sha/-/sha-3.0.0.tgz#b2f2f90af690c16a3a839a6a6c680ea51fedd1ae" + integrity sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw== dependencies: graceful-fs "^4.1.2" - readable-stream "^2.0.2" shallowequal@^0.2.2: version "0.2.2" @@ -12420,11 +13075,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shell-quote@^1.4.2, shell-quote@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" @@ -12530,6 +13197,11 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -12539,7 +13211,7 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -slide@^1.1.3, slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: +slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= @@ -12549,11 +13221,6 @@ smart-buffer@4.0.2: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== -smart-buffer@^1.0.13: - version "1.1.15" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" - integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY= - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -12584,14 +13251,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socks-proxy-agent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" - integrity sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA== - dependencies: - agent-base "^4.1.0" - socks "^1.1.10" - socks-proxy-agent@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" @@ -12600,14 +13259,6 @@ socks-proxy-agent@^4.0.0: agent-base "~4.2.1" socks "~2.3.2" -socks@^1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" - integrity sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o= - dependencies: - ip "^1.1.4" - smart-buffer "^1.0.13" - socks@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" @@ -12761,13 +13412,6 @@ sshpk@^1.16.1, sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== - dependencies: - safe-buffer "^5.1.1" - ssri@^6.0.0, ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -12937,6 +13581,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string.prototype.matchall@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.1.tgz#5a9e0b64bcbeb336aa4814820237c2006985646d" @@ -12999,6 +13652,11 @@ stringify-package@^1.0.0: resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g== +stringify-package@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" + integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== + strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" @@ -13027,6 +13685,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -13054,6 +13719,13 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + 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" @@ -13113,7 +13785,7 @@ supports-color@^3.1.0: dependencies: has-flag "^1.0.0" -supports-color@^5.0.0, supports-color@^5.3.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -13127,13 +13799,20 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-hyperlinks@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" - integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== dependencies: - has-flag "^2.0.0" - supports-color "^5.0.0" + has-flag "^4.0.0" + supports-color "^7.0.0" svgo@^1.0.0: version "1.3.0" @@ -13209,15 +13888,6 @@ tar-stream@~1.1.0: readable-stream "~1.0.33" xtend "^4.0.0" -tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - tar@^4: version "4.4.10" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" @@ -13231,18 +13901,23 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@^4.4.3, tar@^4.4.8: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== +tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.8.6" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== temp@0.8.3: version "0.8.3" @@ -13252,6 +13927,17 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +tempy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.0.tgz#4f192b3ee3328a2684d0e3fc5c491425395aab65" + integrity sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w== + dependencies: + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + term-color@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/term-color/-/term-color-1.0.1.tgz#38e192553a473e35e41604ff5199846bf8117a3a" @@ -13350,6 +14036,13 @@ through2@^3.0.1: dependencies: readable-stream "2 || 3" +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + through2@~0.6.1: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -13457,6 +14150,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -13519,6 +14219,11 @@ trim-newlines@^2.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" @@ -13676,6 +14381,31 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@~1.6.16, type-is@~1.6.2: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -13809,7 +14539,7 @@ uniqs@^2.0.0: resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= -unique-filename@^1.1.0, unique-filename@^1.1.1, unique-filename@~1.1.0: +unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -13830,18 +14560,33 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -universal-user-agent@^2.0.0, universal-user-agent@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.3.tgz#9f6f09f9cc33de867bb720d84c08069b14937c6c" - integrity sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g== +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - os-name "^3.0.0" + crypto-random-string "^2.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -13870,7 +14615,7 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== -update-notifier@^2.3.0, update-notifier@^2.5.0: +update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== @@ -13915,11 +14660,6 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= - url-trim@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-trim/-/url-trim-1.0.0.tgz#40057e2f164b88e5daca7269da47e6d1dd837adc" @@ -13964,6 +14704,13 @@ util-extend@^1.0.1: resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + dependencies: + object.getownpropertydescriptors "^2.0.3" + util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" @@ -13996,6 +14743,11 @@ uuid@3.3.2, uuid@^3.1.0, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -14170,13 +14922,20 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@^1.1.1, which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -14201,13 +14960,6 @@ window-size@^0.2.0: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= -windows-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== - dependencies: - execa "^1.0.0" - wkt-parser@^1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/wkt-parser/-/wkt-parser-1.2.3.tgz#240fe1dacc816bfe5674b66180041059eaa9a9ba" @@ -14235,6 +14987,13 @@ worker-farm@^1.6.0: dependencies: errno "~0.1.7" +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -14252,6 +15011,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -14275,6 +15043,15 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -14344,6 +15121,16 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yamljs@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" @@ -14368,6 +15155,27 @@ yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.3: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f" @@ -14376,6 +15184,13 @@ yargs-parser@^3.2.0: camelcase "^3.0.0" lodash.assign "^4.1.0" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= + dependencies: + camelcase "^4.1.0" + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -14421,7 +15236,7 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@^12.0.0, yargs@^12.0.2: +yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -14455,6 +15270,59 @@ yargs@^13.2.4: y18n "^4.0.0" yargs-parser "^13.1.1" +yargs@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.0.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" From 1022e00899a56af39e91c9f17c85b216e01e05c7 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Mon, 23 Nov 2020 10:10:27 -0500 Subject: [PATCH 047/553] fix(EditorMapLayersControl): remove show routes on map fix ibi-group/datatools-ui#627 --- .../components/map/EditorMapLayersControl.js | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/lib/editor/components/map/EditorMapLayersControl.js b/lib/editor/components/map/EditorMapLayersControl.js index dc46fd805..a5178d169 100644 --- a/lib/editor/components/map/EditorMapLayersControl.js +++ b/lib/editor/components/map/EditorMapLayersControl.js @@ -28,33 +28,35 @@ type OverlayItem = {component: any, name: string} export default class EditorMapLayersControl extends Component { render () { - const { tripPatterns, stops, user } = this.props + const { stops, user } = this.props const { BaseLayer, Overlay } = LayersControl const OVERLAYS: Array = [ - { - name: 'Route alignments', - component: ( - - {tripPatterns - ? tripPatterns.map((tp) => { - if (!tp.latLngs) return null - return ( - - - {tp.name} ({tp.route_id}) - - - ) - }) - : null - } - - ) - }, + // FIXME: Do not show trip pattern overlay because it can cause out of + // memory issues for very large GTFS feeds. + // { + // name: 'Route alignments', + // component: ( + // + // {tripPatterns + // ? tripPatterns.map((tp) => { + // if (!tp.latLngs) return null + // return ( + // + // + // {tp.name} ({tp.route_id}) + // + // + // ) + // }) + // : null + // } + // + // ) + // }, { name: 'Stop locations', component: From e32b55fec7c30156a19c65a4d4e1e0abaaca86d3 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Mon, 23 Nov 2020 13:56:53 -0500 Subject: [PATCH 048/553] refactor(EditorMapLayersControl): remove unused imports --- lib/editor/components/map/EditorMapLayersControl.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/editor/components/map/EditorMapLayersControl.js b/lib/editor/components/map/EditorMapLayersControl.js index a5178d169..a9448cf3c 100644 --- a/lib/editor/components/map/EditorMapLayersControl.js +++ b/lib/editor/components/map/EditorMapLayersControl.js @@ -3,11 +3,8 @@ import React, {Component} from 'react' import {Browser} from 'leaflet' import { - TileLayer, - FeatureGroup, LayersControl, - Polyline, - Tooltip + TileLayer } from 'react-leaflet' import {getUserMetadataProperty} from '../../../common/util/user' From f004d9562e6c9e4927d0ed60bb38fda578ed9878 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Nov 2020 23:43:07 +0000 Subject: [PATCH 049/553] build(deps): bump highlight.js from 9.15.9 to 9.18.5 Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 9.15.9 to 9.18.5. - [Release notes](https://github.com/highlightjs/highlight.js/releases) - [Changelog](https://github.com/highlightjs/highlight.js/blob/9.18.5/CHANGES.md) - [Commits](https://github.com/highlightjs/highlight.js/compare/9.15.9...9.18.5) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b5586070d..491ab99b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5998,9 +5998,9 @@ hex-color-regex@^1.1.0: integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== highlight.js@^9.7.0: - version "9.15.9" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.9.tgz#865257da1dbb4a58c4552d46c4b3854f77f0e6d5" - integrity sha512-M0zZvfLr5p0keDMCAhNBp03XJbKBxUx5AfyfufMdFMEP4N/Xj6dh0IqC75ys7BAzceR34NgcvXjupRVaHBPPVQ== + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== history@^3.0.0: version "3.3.0" From 84abb63ec1ee28af8e4605e5340232d2438794cd Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Mon, 30 Nov 2020 15:52:18 -0500 Subject: [PATCH 050/553] fix(editor-map): handle new gtfs-lib response for encoded polylines fix #627 --- lib/editor/actions/tripPattern.js | 24 +++++++++++-- .../components/map/EditorMapLayersControl.js | 19 +++++----- lib/editor/containers/ActiveGtfsEditor.js | 3 +- lib/editor/reducers/data.js | 35 ++++++++++++------- lib/manager/actions/versions.js | 2 +- 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/lib/editor/actions/tripPattern.js b/lib/editor/actions/tripPattern.js index 5c174ccfe..6f8fdd7ce 100644 --- a/lib/editor/actions/tripPattern.js +++ b/lib/editor/actions/tripPattern.js @@ -5,10 +5,10 @@ import {ActionCreators} from 'redux-undo' import {toast} from 'react-toastify' import {resetActiveGtfsEntity, savedGtfsEntity, updateActiveGtfsEntity, updateEditSetting} from './active' -import {createVoidPayloadAction, secureFetch} from '../../common/actions' +import {createVoidPayloadAction, fetchGraphQL, secureFetch} from '../../common/actions' import {snakeCaseKeys} from '../../common/util/map-keys' import {generateUID} from '../../common/util/util' -import {fetchGTFSEntities} from '../../manager/actions/versions' +import {fetchGTFSEntities, receiveGTFSEntities} from '../../manager/actions/versions' import {fetchTripCounts} from './trip' import {getEditorNamespace} from '../util/gtfs' import {resequenceStops, resequenceShapePoints} from '../util/map' @@ -17,6 +17,7 @@ import {entityIsNew} from '../util/objects' import type {ControlPoint, Pattern, PatternStop} from '../../types' import type {dispatchFn, getStateFn} from '../../types/reducers' +const fetchingTripPatterns = createVoidPayloadAction('FETCHING_TRIP_PATTERNS') const savedTripPattern = createVoidPayloadAction('SAVED_TRIP_PATTERN') export const setActivePatternSegment = createAction( 'SET_ACTIVE_PATTERN_SEGMENT', @@ -118,8 +119,25 @@ export function togglePatternEditing () { */ export function fetchTripPatterns (feedId: string) { return function (dispatch: dispatchFn, getState: getStateFn) { + dispatch(fetchingTripPatterns()) const namespace = getEditorNamespace(feedId, getState()) - return dispatch(fetchGTFSEntities({namespace, type: 'pattern', editor: true})) + const query = ` +query shapesQuery ($namespace: String) { + feed(namespace: $namespace) { + feed_version + feed_info { + feed_id + } + shapes (limit: -1) { + shape_id + polyline + } + } +} +` + const variables = {namespace} + return dispatch(fetchGraphQL({query, variables})) + .then(data => dispatch(receiveGTFSEntities({namespace, component: 'pattern', data, editor: true, replaceNew: true}))) } } diff --git a/lib/editor/components/map/EditorMapLayersControl.js b/lib/editor/components/map/EditorMapLayersControl.js index dc46fd805..6c014f881 100644 --- a/lib/editor/components/map/EditorMapLayersControl.js +++ b/lib/editor/components/map/EditorMapLayersControl.js @@ -1,13 +1,12 @@ // @flow -import React, {Component} from 'react' -import {Browser} from 'leaflet' +import React, {PureComponent} from 'react' +import L from 'leaflet' import { TileLayer, FeatureGroup, LayersControl, - Polyline, - Tooltip + Polyline } from 'react-leaflet' import {getUserMetadataProperty} from '../../../common/util/user' @@ -26,8 +25,9 @@ type Props = { type OverlayItem = {component: any, name: string} -export default class EditorMapLayersControl extends Component { +export default class EditorMapLayersControl extends PureComponent { render () { + const canvas = L.canvas() const { tripPatterns, stops, user } = this.props const { BaseLayer, Overlay } = LayersControl const OVERLAYS: Array = [ @@ -43,11 +43,8 @@ export default class EditorMapLayersControl extends Component { key={tp.id} positions={tp.latLngs} weight={2} - color='#888'> - - {tp.name} ({tp.route_id}) - - + renderer={canvas} + color='#888' /> ) }) : null @@ -78,7 +75,7 @@ export default class EditorMapLayersControl extends Component { name='Route layer' key='route-layer'> + url={`https://s3.amazonaws.com/datatools-nysdot/tiles/{z}_{x}_{y}${L.Browser.retina ? '@2x' : ''}.png`} /> } {OVERLAYS.map((overlay: OverlayItem, i: number) => ( diff --git a/lib/editor/containers/ActiveGtfsEditor.js b/lib/editor/containers/ActiveGtfsEditor.js index cc025783f..3f7fa77c7 100644 --- a/lib/editor/containers/ActiveGtfsEditor.js +++ b/lib/editor/containers/ActiveGtfsEditor.js @@ -65,7 +65,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { const {activeEntityId, subEntityId} = getIdsFromParams(ownProps.routeParams) const {data, editSettings: editSettingsState, mapState} = state.editor const {present: editSettings} = editSettingsState - const {active, tables, status} = data + const {active, tables, tripPatterns, status} = data // FIXME: entityId is now a non-string line number and somewhere the number is // being cast to a string. const activeEntity = active.entity && active.entity.id === activeEntityId @@ -130,6 +130,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { tableData: tables, tableView, timetableStatus, + tripPatterns, user, validationErrors } diff --git a/lib/editor/reducers/data.js b/lib/editor/reducers/data.js index 3d45f17e1..bbd2e337e 100644 --- a/lib/editor/reducers/data.js +++ b/lib/editor/reducers/data.js @@ -2,6 +2,7 @@ import update from 'react-addons-update' import clone from 'lodash/cloneDeep' +import {decode as decodePolyline} from 'polyline' import SortDirection from 'react-virtualized/dist/commonjs/Table/SortDirection' import {ENTITY} from '../constants' @@ -22,6 +23,11 @@ const getUpdateEntityKeys = component => component === 'trippattern' export const defaultState = { active: {}, lock: {}, + sort: { + key: 'name', + direction: SortDirection.ASC + }, + status: {}, tables: { agency: [], calendar: [], @@ -36,11 +42,7 @@ export const defaultState = { service_id: [] } }, - sort: { - key: 'name', - direction: SortDirection.ASC - }, - status: {} + tripPatterns: null } /* eslint-disable complexity */ @@ -51,6 +53,10 @@ const data = (state: DataState = defaultState, action: Action): DataState => { return update(state, {active: {$merge: {feedSourceId}}}) case 'RECEIVE_BASE_GTFS': { const feed = clone(action.payload.feed) + if (!feed) { + console.warn('Could not fetch base GTFS!') + return state + } if (feed.feed_info.length === 0) { console.warn(`No feed info found. Adding feed info with null values.`) feed.feed_info.push(generateNullProps('feedinfo')) @@ -223,6 +229,11 @@ const data = (state: DataState = defaultState, action: Action): DataState => { if (!tableName) return state return update(state, {tables: {[tableName]: {$push: [entity]}}}) } + case 'FETCHING_TRIP_PATTERNS': { + // Set value to an empty array to prevent the user from accidentally + // triggering multiple fetches. + return update(state, {tripPatterns: {$set: []}}) + } case 'RECEIVE_GTFS_ENTITIES': { let activePattern const {data, editor, component} = action.payload @@ -235,15 +246,13 @@ const data = (state: DataState = defaultState, action: Action): DataState => { // Handle trip patterns to be drawn as overlay layer in editor return update(state, { tripPatterns: {$set: - data.feed.patterns.map(pattern => { + data.feed.shapes.map(shape => { return { - id: pattern.id, - name: pattern.name, - route_id: pattern.route_id, - latLngs: pattern.shape_points - ? (pattern.shape_points.map(sp => - ({lon: sp.shape_pt_lon, lat: sp.shape_pt_lat}))) - : null + id: shape.shape_id, + // Decode polyline and coords divide by ten (gtfs-lib + // simplification level requires this). + latLngs: decodePolyline(shape.polyline) + .map(coords => ([coords[0] / 10, coords[1] / 10])) } }) } diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index d5dbf8359..ccfe12835 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -49,7 +49,7 @@ const receiveFeedVersions = createAction( versions: Array }) => payload ) -const receiveGTFSEntities = createAction( +export const receiveGTFSEntities = createAction( 'RECEIVE_GTFS_ENTITIES', (payload: { component: string, From e7c5f4d7e7eedc72f63103b3f5a1bff0f8534285 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 1 Dec 2020 14:38:42 -0500 Subject: [PATCH 051/553] refactor(FeedVersionSpanChart): Extract common date logic. --- .../version/FeedVersionSpanChart.js | 101 ++++++++++++------ 1 file changed, 67 insertions(+), 34 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 4cf7a08ac..8ad0739d6 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -1,8 +1,8 @@ // @flow +import moment from 'moment' import React, { Component } from 'react' import { Table } from 'react-bootstrap' -import moment from 'moment' import type { FeedVersion } from '../../../types' @@ -13,32 +13,72 @@ type Props = { comparedVersionIndex: number } +// Type used for rendering FeedSpan sub-components. +type VersionDateRange = { + // Number of days for this range + days: number, + endDate: moment$Moment, + // Length and offset should be ratios. + length: number, + offset: number, + startDate: moment$Moment +} + +type VersionDateRanges = { + v1Range: VersionDateRange, + v2Range: VersionDateRange +} + const dateFormat = 'MMM. DD, YYYY' const noTopPadding = { padding: '0 5px' } +function getDateRange (version: FeedVersion): VersionDateRange { + const { validationSummary: vs } = version + const startDate = moment(vs.startDate) + const endDate = moment(vs.endDate) + + return { + days: endDate.diff(startDate, 'days'), + endDate, + length: 0, + offset: 0, + startDate + } +} + /** - * This component visually displays the validity span of two feed versions - * using spans that show an overlap or a gap according to the - * validity of the active andf compared feed versions. + * Obtains the date range objects for the provided feed versions. */ -export default class FeedVersionSpanChart extends Component { - render () { - const { activeVersion, comparedVersion, comparedVersionIndex } = this.props +function extractVersionDateRanges (v1: FeedVersion, v2: FeedVersion): VersionDateRanges { + const v1Range = getDateRange(v1) + const v2Range = getDateRange(v2) - const activeVersionStartDate = moment(activeVersion.validationSummary.startDate) - const activeVersionEndDate = moment(activeVersion.validationSummary.endDate) - const comparedVersionStartDate = moment(comparedVersion.validationSummary.startDate) - const comparedVersionEndDate = moment(comparedVersion.validationSummary.endDate) + const firstDate = moment.min(v1Range.startDate, v2Range.startDate) + const lastDate = moment.max(v1Range.endDate, v2Range.endDate) + const numDays = lastDate.diff(firstDate, 'days') - const firstDate = moment.min(activeVersionStartDate, comparedVersionStartDate) - const lastDate = moment.max(activeVersionEndDate, comparedVersionEndDate) + v1Range.offset = v1Range.startDate.diff(firstDate, 'days') / numDays + v1Range.length = v1Range.days / numDays + v2Range.offset = v2Range.startDate.diff(firstDate, 'days') / numDays + v2Range.length = v2Range.days / numDays - const numDays = lastDate.diff(firstDate, 'days') - const activeVersionOffset = activeVersionStartDate.diff(firstDate, 'days') - const activeVersionLength = activeVersionEndDate.diff(activeVersionStartDate, 'days') - const comparedVersionOffset = comparedVersionStartDate.diff(firstDate, 'days') - const comparedVersionLength = comparedVersionEndDate.diff(comparedVersionStartDate, 'days') + return { + v1Range, + v2Range + } +} + +/** + * This component renders bars representing the date ranges for which the given feed versions + * are valid (e.g., Jan 1 - March 27) and lets the user visualize overlaps or gaps in the validity periods + * of the active and compared feed versions. + */ +export default class FeedVersionSpanChart extends Component { + render () { + const { activeVersion, comparedVersion, comparedVersionIndex } = this.props + const { v1Range: activeRange, v2Range: comparedRange } = + extractVersionDateRanges(activeVersion, comparedVersion) return ( @@ -47,10 +87,7 @@ export default class FeedVersionSpanChart extends Component { @@ -59,10 +96,7 @@ export default class FeedVersionSpanChart extends Component { @@ -75,19 +109,18 @@ export default class FeedVersionSpanChart extends Component { /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ - endLabel, - relativeLength, - relativeOffset, - startLabel, + range, widthPixels }) => { + const { endDate, length, offset, startDate } = range // Date labels and validity span occupy a third of the width available. const baseWidth = widthPixels / 3 + return (
    -
    +
    - {startLabel} + {startDate.format(dateFormat)} - {endLabel} + {endDate.format(dateFormat)}
    ) From 5fa63cd05c6aca8f7775f84b1a17791002cd6fac Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 1 Dec 2020 15:44:21 -0500 Subject: [PATCH 052/553] refactor(FeedVersionTabs): Extract component for rendering stat and variation. --- .../components/version/FeedVersionTabs.js | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 2303da244..73feabe2e 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -71,13 +71,14 @@ export default class FeedVersionTabs extends Component { render () { const { - feedVersionIndex, + // FIXME: prop drilling. + comparedVersion, comparedVersionIndex, + feedVersionIndex, isochroneBand, onChangeIsochroneBand, tab, - version, - comparedVersion + version } = this.props const tableOptions = { striped: true, @@ -112,22 +113,12 @@ export default class FeedVersionTabs extends Component { return (
    -
    - {numeral(summary[c]).format('0a')} - {comparedVersion && comparedVersionIndex && ( - - 0 ? 'success' : (diff < 0 ? 'danger' : 'default')} - title={`Difference compared to Version ${comparedVersionIndex || 'null'}`}> - {formatDelta(diff)} - - - )} -
    - +

    {this.messages(c)}

    ) @@ -186,3 +177,28 @@ export default class FeedVersionTabs extends Component { ) } } + +/** + * Renders a statistic of a feed version with a small label attached to indicate a variation. + */ +const StatisticWithVariation = ({ showVariation, title, value, variation }) => { + const bsStyle = variation > 0 + ? 'success' + : (variation < 0 ? 'danger' : 'default') + + return ( + + {numeral(value).format('0a')} + {showVariation && + // Apply a zero-width to superscript so that `value` above always appears centered. + + + {formatDelta(variation)} + + } + + ) +} From 7cc84f723b660a4eeab42e760f8612e7af527463 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 2 Dec 2020 08:38:56 -0500 Subject: [PATCH 053/553] fix(actions/editor.js): request base GTFS with no limits on tables adds agency, calendars, fares to list of tables for which limit is omitted fix #631 --- lib/editor/actions/editor.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/editor/actions/editor.js b/lib/editor/actions/editor.js index 35d1a999a..1a837c5c3 100644 --- a/lib/editor/actions/editor.js +++ b/lib/editor/actions/editor.js @@ -385,17 +385,17 @@ export function fetchBaseGtfs ({ default_route_color default_route_type } - agency { + agency (limit: -1) { id agency_id agency_name } - calendar { + calendar (limit: -1) { id service_id description } - fares { + fares (limit: -1) { id fare_id } From 312ef451df27f84f506e19471b3351da4fb495e9 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 2 Dec 2020 09:39:46 -0500 Subject: [PATCH 054/553] refactor(tripPattern.js): address PR comments --- lib/editor/actions/editor.js | 2 +- lib/editor/actions/tripPattern.js | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/editor/actions/editor.js b/lib/editor/actions/editor.js index 35d1a999a..71ad95fad 100644 --- a/lib/editor/actions/editor.js +++ b/lib/editor/actions/editor.js @@ -40,7 +40,7 @@ const setEditorCheckIn = createAction( 'SET_EDITOR_CHECK_IN', (payload: LockState) => payload ) -const showEditorModal = createVoidPayloadAction('SHOW_EDITOR_MODAL') +export const showEditorModal = createVoidPayloadAction('SHOW_EDITOR_MODAL') export type EditorActions = ActionType | ActionType | diff --git a/lib/editor/actions/tripPattern.js b/lib/editor/actions/tripPattern.js index 6f8fdd7ce..5c3aa788c 100644 --- a/lib/editor/actions/tripPattern.js +++ b/lib/editor/actions/tripPattern.js @@ -8,6 +8,7 @@ import {resetActiveGtfsEntity, savedGtfsEntity, updateActiveGtfsEntity, updateEd import {createVoidPayloadAction, fetchGraphQL, secureFetch} from '../../common/actions' import {snakeCaseKeys} from '../../common/util/map-keys' import {generateUID} from '../../common/util/util' +import {showEditorModal} from './editor' import {fetchGTFSEntities, receiveGTFSEntities} from '../../manager/actions/versions' import {fetchTripCounts} from './trip' import {getEditorNamespace} from '../util/gtfs' @@ -128,16 +129,30 @@ query shapesQuery ($namespace: String) { feed_info { feed_id } - shapes (limit: -1) { + shapes_as_polylines (limit: -1) { shape_id polyline } } } ` + if (!namespace) { + console.error('Cannot fetch GTFS for undefined or null namespace') + dispatch(showEditorModal()) + return + } const variables = {namespace} return dispatch(fetchGraphQL({query, variables})) - .then(data => dispatch(receiveGTFSEntities({namespace, component: 'pattern', data, editor: true, replaceNew: true}))) + .then(data => dispatch( + receiveGTFSEntities({ + namespace, + component: 'pattern', + data, + editor: true, + id: null, + replaceNew: true + }) + )) } } From 9a257eaabbeb88e402ca87ffebbb654ab6850f06 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 2 Dec 2020 09:48:36 -0500 Subject: [PATCH 055/553] refactor(reducers/data): fix processing of shapes_as_polylines --- lib/editor/reducers/data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/editor/reducers/data.js b/lib/editor/reducers/data.js index bbd2e337e..0e5d2dd9c 100644 --- a/lib/editor/reducers/data.js +++ b/lib/editor/reducers/data.js @@ -246,7 +246,7 @@ const data = (state: DataState = defaultState, action: Action): DataState => { // Handle trip patterns to be drawn as overlay layer in editor return update(state, { tripPatterns: {$set: - data.feed.shapes.map(shape => { + data.feed.shapes_as_polylines.map(shape => { return { id: shape.shape_id, // Decode polyline and coords divide by ten (gtfs-lib From 72db542aef23eb06a361e153d548dd308e204961 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 2 Dec 2020 09:52:01 -0500 Subject: [PATCH 056/553] refactor(FeedVersionViewer): Insert comment about prop drilling. --- lib/manager/containers/ActiveFeedVersionNavigator.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/manager/containers/ActiveFeedVersionNavigator.js b/lib/manager/containers/ActiveFeedVersionNavigator.js index 248b77a27..1a9462922 100644 --- a/lib/manager/containers/ActiveFeedVersionNavigator.js +++ b/lib/manager/containers/ActiveFeedVersionNavigator.js @@ -79,6 +79,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { comparedVersion = sortedVersions[comparedVersionIndex - 1] } } + // FIXME: prop drilling. return { gtfs, hasVersions, From a90c93f6379e5fda78090a534780670c167ee057 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 2 Dec 2020 10:12:44 -0500 Subject: [PATCH 057/553] test(flow): fix data reducer flow type for trip patterns --- lib/types/reducers.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/types/reducers.js b/lib/types/reducers.js index da3fa45ac..274a3897c 100644 --- a/lib/types/reducers.js +++ b/lib/types/reducers.js @@ -13,6 +13,7 @@ import type { GtfsPlusValidation, GtfsRoute, GtfsStop, + LatLng, Organization, OtpServer, Pattern, @@ -197,7 +198,11 @@ export type DataState = { lock: LockState, sort: DataStateSort, status: EditorStatus, - tables: EditorTables + tables: EditorTables, + tripPatterns: ?Array<{ + id: string, + latlngs: Array + }> } export type EditSettingsState = { From 7ad691a22e15419d3f170d38a6c2a1574f2c8691 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 2 Dec 2020 14:16:55 -0500 Subject: [PATCH 058/553] refactor(tripPattern.js): remove limit arg on shapes query --- lib/editor/actions/tripPattern.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/editor/actions/tripPattern.js b/lib/editor/actions/tripPattern.js index 5c3aa788c..2817ead54 100644 --- a/lib/editor/actions/tripPattern.js +++ b/lib/editor/actions/tripPattern.js @@ -129,7 +129,7 @@ query shapesQuery ($namespace: String) { feed_info { feed_id } - shapes_as_polylines (limit: -1) { + shapes_as_polylines { shape_id polyline } From 93a7dec276d2a2598a1197f468893f0c24d7fd0f Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 3 Dec 2020 10:17:56 -0500 Subject: [PATCH 059/553] refactor(EditorMapLayersControl): sort props, make route layer non-interactive --- lib/editor/components/map/EditorMapLayersControl.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/editor/components/map/EditorMapLayersControl.js b/lib/editor/components/map/EditorMapLayersControl.js index f9eb4e395..8e83530e6 100644 --- a/lib/editor/components/map/EditorMapLayersControl.js +++ b/lib/editor/components/map/EditorMapLayersControl.js @@ -40,11 +40,12 @@ export default class EditorMapLayersControl extends PureComponent { if (!tp.latLngs) return null return ( + weight={2} /> ) }) : null From 9d9cd2e91b4a915b0f9b7c0654554eafc8a72635 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Tue, 8 Dec 2020 16:42:23 -0500 Subject: [PATCH 060/553] refactor(compare-versions): refactor compare versions feature Added some new components, tweaked layout and styling --- lib/manager/actions/versions.js | 2 +- lib/manager/components/version/DeltaStat.js | 59 ++++++ .../components/version/FeedVersionDetails.js | 60 +++--- .../version/FeedVersionNavigator.js | 48 +---- .../version/FeedVersionSpanChart.js | 173 +++++++++--------- .../components/version/FeedVersionTabs.js | 67 ++++--- .../components/version/FeedVersionViewer.js | 38 ++-- .../version/VersionComparisonDropdown.js | 87 +++++++++ .../containers/ActiveFeedVersionNavigator.js | 2 - lib/manager/util/version.js | 2 +- 10 files changed, 322 insertions(+), 216 deletions(-) create mode 100644 lib/manager/components/version/DeltaStat.js create mode 100644 lib/manager/components/version/VersionComparisonDropdown.js diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index 983339613..95027a186 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -597,7 +597,7 @@ export function setVersionIndex ( export function setComparedVersionIndex ( feed: Feed, - index: number, + index: ?number, push?: boolean = true, isPublic?: boolean ) { diff --git a/lib/manager/components/version/DeltaStat.js b/lib/manager/components/version/DeltaStat.js new file mode 100644 index 000000000..becc309c6 --- /dev/null +++ b/lib/manager/components/version/DeltaStat.js @@ -0,0 +1,59 @@ +// @flow + +import React from 'react' +import {Label as BsLabel, OverlayTrigger, Tooltip} from 'react-bootstrap' + +import {formatDelta} from '../../util/version' + +/** + * Renders a delta statistic as a label with tooltip when comparing feed + * versions. + */ +const DeltaStat = ( + { + comparedVersionIndex, + diff, + inverse, + style + }: { + comparedVersionIndex: number, + diff: number, + inverse?: boolean, + style: any +}) => { + // Construct the tooltip label and style based on positive/negative diff. + let bsStyle = 'default' + let comparePhrase = 'No change' + let conjunction = 'from' + if (diff > 0) { + comparePhrase = `${Math.abs(diff)} more` + conjunction = 'than' + if (inverse) bsStyle = 'danger' + else bsStyle = 'success' + } else if (diff < 0) { + comparePhrase = `${Math.abs(diff)} fewer` + conjunction = 'than' + if (inverse) bsStyle = 'success' + else bsStyle = 'danger' + } + // Render the label + return ( + + {comparePhrase} {conjunction} version {comparedVersionIndex} + + } + > + + {formatDelta(diff)} + + + ) +} + +export default DeltaStat diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index 6a2d60ab8..cb3ce3854 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -18,8 +18,8 @@ import {getConfigProperty, isExtensionEnabled} from '../../../common/util/config import {BLOCKING_ERROR_TYPES} from '../../util/version' import VersionDateLabel from './VersionDateLabel' import VersionRetrievalBadge from './VersionRetrievalBadge' +import VersionComparisonDropdown from './VersionComparisonDropdown' import VersionSelectorDropdown from './VersionSelectorDropdown' -import FeedVersionSpanChart from './FeedVersionSpanChart' import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' import type {ManagerUserState} from '../../../types/reducers' @@ -88,7 +88,6 @@ export default class FeedVersionDetails extends Component { render () { const { - comparedVersion, comparedVersionIndex, feedSource, gtfsPlusValidation, @@ -120,23 +119,32 @@ export default class FeedVersionDetails extends Component { return (

    - {isExtensionEnabled('mtc') - ? - {// Only show merge feeds button if the feed starts in the future. - // FIXME: uncomment out the below to prevent merges with non-future feeds. - // moment(summary.startDate).isAfter(moment().startOf('day')) && - {mergeButtonLabel}} - itemFormatter={this._mergeItemFormatter} - version={version} - versions={feedSource.feedVersions} - /> - } + + + {/* + Only show merge feeds button if the feed starts in the future. + FIXME: uncomment out the below to prevent merges with non-future feeds. + moment(summary.startDate).isAfter(moment().startOf('day')) && + */} + {isExtensionEnabled('mtc') && + {mergeButtonLabel}} + itemFormatter={this._mergeItemFormatter} + version={version} + versions={feedSource.feedVersions} + /> + } + {isExtensionEnabled('mtc') && - - : null - } + } + {' '} Valid from {moment(summary.startDate).format(dateFormat)}{' '} @@ -189,15 +196,6 @@ export default class FeedVersionDetails extends Component { }

    - - {comparedVersion && comparedVersionIndex && ( - - )} -

    {summary && summary.avgDailyRevenueTime ? diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index a4d71aa15..c86ec914e 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -18,7 +18,7 @@ import * as gtfsPlusActions from '../../../gtfsplus/actions/gtfsplus' import * as deploymentActions from '../../../manager/actions/deployments' import DeploymentPreviewButton from '../DeploymentPreviewButton' import FeedVersionViewer from './FeedVersionViewer' -import VersionSelectorDropdown, {DefaultItemFormatter} from './VersionSelectorDropdown' +import VersionSelectorDropdown from './VersionSelectorDropdown' import type {Props as ContainerProps} from '../../containers/ActiveFeedVersionNavigator' import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types' @@ -44,7 +44,6 @@ type Props = ContainerProps & { publishFeedVersion: typeof versionsActions.publishFeedVersion, renameFeedVersion: typeof versionsActions.renameFeedVersion, runFetchFeed: typeof feedsActions.runFetchFeed, - setComparedVersionIndex: typeof versionsActions.setComparedVersionIndex, setVersionIndex: typeof versionsActions.setVersionIndex, sortedVersions: Array, uploadFeed: typeof versionsActions.uploadFeed, @@ -135,49 +134,6 @@ export default class FeedVersionNavigator extends Component { } } - _onSelectComparedVersion = (index: number) => { - if (index !== this.props.comparedVersionIndex) { - this.props.setComparedVersionIndex(this.props.feedSource, index) - } - } - - /** Show comparison dropdown if there are 2+ versions to compare. */ - _renderComparisonDropdown = () => { - const { - comparedVersionIndex, - sortedVersions, - version - } = this.props - - if (sortedVersions.length >= 2) { - const comparedFeedVersion = sortedVersions[comparedVersionIndex - 1] - const compareTitle = comparedFeedVersion ? `Comparing to Version ${comparedVersionIndex}` : 'Compare' - - // This custom formatter adds and hides the active version in the list to preserve version indexes. - const itemFormatter = (itemVersion: FeedVersion, activeVersion: ?FeedVersion) => ( - itemVersion === version - ? - : DefaultItemFormatter(itemVersion, activeVersion) - ) - - return ( - - ) - } - - return null - } - render () { const versionTitleStyle = { fontSize: '24px', @@ -270,8 +226,6 @@ export default class FeedVersionNavigator extends Component { onClick={this._incrementVersion}> - - {this._renderComparisonDropdown()} } diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 8ad0739d6..625c4bb42 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -2,71 +2,20 @@ import moment from 'moment' import React, { Component } from 'react' -import { Table } from 'react-bootstrap' +import { OverlayTrigger, Table, Tooltip } from 'react-bootstrap' import type { FeedVersion } from '../../../types' type Props = { activeVersion: FeedVersion, - comparedVersion: FeedVersion, - // Used for display only. - comparedVersionIndex: number -} - -// Type used for rendering FeedSpan sub-components. -type VersionDateRange = { - // Number of days for this range - days: number, - endDate: moment$Moment, - // Length and offset should be ratios. - length: number, - offset: number, - startDate: moment$Moment -} - -type VersionDateRanges = { - v1Range: VersionDateRange, - v2Range: VersionDateRange + comparedVersion: FeedVersion } const dateFormat = 'MMM. DD, YYYY' -const noTopPadding = { padding: '0 5px' } - -function getDateRange (version: FeedVersion): VersionDateRange { - const { validationSummary: vs } = version - const startDate = moment(vs.startDate) - const endDate = moment(vs.endDate) - - return { - days: endDate.diff(startDate, 'days'), - endDate, - length: 0, - offset: 0, - startDate - } -} - -/** - * Obtains the date range objects for the provided feed versions. - */ -function extractVersionDateRanges (v1: FeedVersion, v2: FeedVersion): VersionDateRanges { - const v1Range = getDateRange(v1) - const v2Range = getDateRange(v2) - - const firstDate = moment.min(v1Range.startDate, v2Range.startDate) - const lastDate = moment.max(v1Range.endDate, v2Range.endDate) - const numDays = lastDate.diff(firstDate, 'days') - - v1Range.offset = v1Range.startDate.diff(firstDate, 'days') / numDays - v1Range.length = v1Range.days / numDays - v2Range.offset = v2Range.startDate.diff(firstDate, 'days') / numDays - v2Range.length = v2Range.days / numDays - - return { - v1Range, - v2Range - } +const cellStyle = { + border: 'none', + padding: '0 5px' } /** @@ -76,28 +25,59 @@ function extractVersionDateRanges (v1: FeedVersion, v2: FeedVersion): VersionDat */ export default class FeedVersionSpanChart extends Component { render () { - const { activeVersion, comparedVersion, comparedVersionIndex } = this.props - const { v1Range: activeRange, v2Range: comparedRange } = - extractVersionDateRanges(activeVersion, comparedVersion) + const { activeVersion, comparedVersion } = this.props + // Construct moment objects for the active/compared version start/end dates. + const activeStartDate = moment(activeVersion.validationSummary.startDate) + const activeEndDate = moment(activeVersion.validationSummary.endDate) + const comparedStartDate = moment(comparedVersion.validationSummary.startDate) + const comparedEndDate = moment(comparedVersion.validationSummary.endDate) + + const firstDate = moment.min(activeStartDate, comparedStartDate) + const lastDate = moment.max(activeEndDate, comparedEndDate) + + const earliestEnd = moment.min(activeEndDate, comparedEndDate) + const latestStart = moment.max(activeStartDate, comparedStartDate) return ( -

    This version Version {comparedVersionIndex}
    +
    - - + + {/* Highlight gap in service if one exists */} + {latestStart.diff(earliestEnd, 'days') > 0 && + + {/* Cell placeholder to prevent formatting issues */} + + + + } - - + @@ -107,31 +87,52 @@ export default class FeedVersionSpanChart extends Component { } } +// Width of feed span +const WIDTH_PIXELS = 400 + /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ - range, - widthPixels + firstDate, + lastDate, + isServiceGap = false, + versionStartDate, + versionEndDate }) => { - const { endDate, length, offset, startDate } = range + const totalDays = lastDate.diff(firstDate, 'days') + const versionOffset = versionStartDate.diff(firstDate, 'days') + const daysActive = versionEndDate.diff(versionStartDate, 'days') + const endLabel = versionEndDate.format(dateFormat) + const relativeLength = daysActive / totalDays + const relativeOffset = versionOffset / totalDays + const startLabel = versionStartDate.format(dateFormat) // Date labels and validity span occupy a third of the width available. - const baseWidth = widthPixels / 3 - + const baseWidth = WIDTH_PIXELS / 3 return ( -
    -
    +
    +
    - {startDate.format(dateFormat)} + {isServiceGap ? null : startLabel} - - {endDate.format(dateFormat)} + + {isServiceGap && 'No service for'}{' '} + {daysActive} days + + }> + + + {isServiceGap ? null : endLabel}
    ) diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 73feabe2e..5839fc185 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -2,18 +2,19 @@ import moment from 'moment' import React, {Component} from 'react' -import {Col, Label as BsLabel, ListGroupItem, Row, Tab, Tabs} from 'react-bootstrap' +import {Col, ListGroupItem, Row, Tab, Tabs} from 'react-bootstrap' import numeral from 'numeral' import {getComponentMessages, isModuleEnabled} from '../../../common/util/config' +import DeltaStat from './DeltaStat' import Patterns from '../reporter/containers/Patterns' import Routes from '../reporter/containers/Routes' import Stops from '../reporter/containers/Stops' import Timetables from '../reporter/containers/Timetables' -import {formatDelta} from '../../util/version' import ServicePerModeChart from '../validation/ServicePerModeChart' import TripsChart from '../validation/TripsChart' import FeedVersionAccessibility from './FeedVersionAccessibility' +import FeedVersionSpanChart from './FeedVersionSpanChart' import type {Element} from 'react' @@ -110,15 +111,28 @@ export default class FeedVersionTabs extends Component { {countFields.map(c => { const summary = version.validationSummary const diff = comparedVersion ? (summary[c] - comparedVersion.validationSummary[c]) : 0 - + const value = summary[c] return (
    - + + {numeral(value).format('0a')} + {comparedVersion && comparedVersionIndex && + // Apply a zero-width to superscript so that `value` + // above always appears centered. + + + } +

    {this.messages(c)}

    ) @@ -132,6 +146,16 @@ export default class FeedVersionTabs extends Component {

    {this.messages('daysActive')}

    + +
    + {comparedVersion && comparedVersionIndex && ( + + )} + +
    @@ -177,28 +201,3 @@ export default class FeedVersionTabs extends Component { ) } } - -/** - * Renders a statistic of a feed version with a small label attached to indicate a variation. - */ -const StatisticWithVariation = ({ showVariation, title, value, variation }) => { - const bsStyle = variation > 0 - ? 'success' - : (variation < 0 ? 'danger' : 'default') - - return ( - - {numeral(value).format('0a')} - {showVariation && - // Apply a zero-width to superscript so that `value` above always appears centered. - - - {formatDelta(variation)} - - } - - ) -} diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index e3c87775c..6584931e2 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -2,15 +2,26 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' -import { Row, Col, Panel, Label as BsLabel, Glyphicon, ListGroup, ListGroupItem } from 'react-bootstrap' +import { + Col, + Glyphicon, + Label + as + BsLabel, + ListGroup, + ListGroupItem, + Panel, + Row +} from 'react-bootstrap' import { LinkContainer } from 'react-router-bootstrap' -import * as plusActions from '../../../gtfsplus/actions/gtfsplus' import * as versionsActions from '../../actions/versions' import {getComponentMessages, isModuleEnabled} from '../../../common/util/config' import Loading from '../../../common/components/Loading' +import DeltaStat from './DeltaStat' import * as snapshotActions from '../../../editor/actions/snapshots' import FeedVersionReport from './FeedVersionReport' +import * as plusActions from '../../../gtfsplus/actions/gtfsplus' import ActiveGtfsPlusVersionSummary from '../../../gtfsplus/containers/ActiveGtfsPlusVersionSummary' import VersionDateLabel from './VersionDateLabel' import NotesViewer from '../NotesViewer' @@ -171,23 +182,22 @@ class VersionSectionSelector extends Component { let diffLabel if (comparedVersion && comparedVersionIndex) { const diff = validationSummary.errorCount - comparedVersion.validationSummary.errorCount - const diffClassName = diff > 0 ? 'label-danger' : (diff < 0 ? 'label-success' : 'label-default') - diffLabel = ( - - {formatDelta(diff)} - + ) } return ( - - {text} {diffLabel} - +
    + + {text} + + {diffLabel} +
    ) } diff --git a/lib/manager/components/version/VersionComparisonDropdown.js b/lib/manager/components/version/VersionComparisonDropdown.js new file mode 100644 index 000000000..2fbba97e3 --- /dev/null +++ b/lib/manager/components/version/VersionComparisonDropdown.js @@ -0,0 +1,87 @@ +// @flow + +import React, {Component} from 'react' +import {MenuItem} from 'react-bootstrap' +import {connect} from 'react-redux' + +import * as versionsActions from '../../actions/versions' +import VersionSelectorDropdown, {DefaultItemFormatter} from './VersionSelectorDropdown' + +import type {Feed, FeedVersion} from '../../../types' +import type {AppState} from '../../../types/reducers' + +type Props = { + comparedVersionIndex?: number, + feedSource: Feed, + setComparedVersionIndex: typeof versionsActions.setComparedVersionIndex, + version: FeedVersion, + versions: Array +} + +/** + * Renders a dropdown selector for choosing a version with which to compare the + * active version. + */ +class VersionComparisonDropdown extends Component { + _onSelectComparedVersion = (index: number) => { + const {comparedVersionIndex, feedSource, setComparedVersionIndex} = this.props + if (index !== comparedVersionIndex) { + setComparedVersionIndex(feedSource, index) + } else { + setComparedVersionIndex(feedSource, null) + } + } + + render () { + const { + comparedVersionIndex, + versions, + version + } = this.props + let title = 'Compare versions' + let comparedFeedVersion + if (comparedVersionIndex !== null && comparedVersionIndex !== undefined) { + comparedFeedVersion = versions[comparedVersionIndex - 1] + title = `Comparing to version ${comparedVersionIndex}` + } + + // This custom formatter adds and hides the active version in the list to + // preserve version indexes. + const itemFormatter = (itemVersion: FeedVersion, activeVersion: ?FeedVersion) => ( + itemVersion === version + ? + : DefaultItemFormatter(itemVersion, activeVersion) + ) + + return ( + + ) + } +} + +const mapStateToProps = (state: AppState, ownProps: {}) => { + return {} +} + +const { + setComparedVersionIndex +} = versionsActions + +const mapDispatchToProps = { + setComparedVersionIndex +} + +export default connect(mapStateToProps, mapDispatchToProps)(VersionComparisonDropdown) diff --git a/lib/manager/containers/ActiveFeedVersionNavigator.js b/lib/manager/containers/ActiveFeedVersionNavigator.js index 1a9462922..663f3fca1 100644 --- a/lib/manager/containers/ActiveFeedVersionNavigator.js +++ b/lib/manager/containers/ActiveFeedVersionNavigator.js @@ -15,7 +15,6 @@ import { mergeVersions, publishFeedVersion, renameFeedVersion, - setComparedVersionIndex, setVersionIndex, uploadFeed } from '../actions/versions' @@ -110,7 +109,6 @@ const mapDispatchToProps = { publishFeedVersion, renameFeedVersion, runFetchFeed, - setComparedVersionIndex, setVersionIndex, uploadFeed } diff --git a/lib/manager/util/version.js b/lib/manager/util/version.js index be4219ecf..216edb0b3 100644 --- a/lib/manager/util/version.js +++ b/lib/manager/util/version.js @@ -180,6 +180,6 @@ export function formatDelta ( delta: number ): string { return delta === 0 - ? '=' + ? '—' : ((delta > 0 ? '+' : '') + numeral(delta).format('0a')) } From 893b7893a06067bf003d692d91024d76989ca164 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 10 Dec 2020 09:08:12 -0500 Subject: [PATCH 061/553] refactor(graphql-shapes): replace patterns query in GtfsMap w/ encoded polys --- i18n/english.yml | 2 +- lib/common/util/gtfs.js | 16 +++++++ lib/editor/actions/tripPattern.js | 17 +------- lib/editor/reducers/data.js | 14 ++---- lib/gtfs/actions/shapes.js | 10 ++--- lib/gtfs/components/GtfsMap.js | 43 ++++++------------- .../components/ShowAllRoutesOnMapFilter.js | 18 +++++--- lib/gtfs/util/graphql.js | 13 +++--- 8 files changed, 53 insertions(+), 80 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 536449c8f..2d3fccbc7 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -676,7 +676,7 @@ components: ShowAllRoutesOnMapFilter: fetching: Fetching showAllRoutesOnMap: Show all routes - tooManyShapeRecords: Too many shapes to display + tooManyShapeRecords: large shapes.txt may impact performance Sidebar: unknown: Unknown SnapshotItem: diff --git a/lib/common/util/gtfs.js b/lib/common/util/gtfs.js index 456d42223..dec517ea4 100644 --- a/lib/common/util/gtfs.js +++ b/lib/common/util/gtfs.js @@ -1,6 +1,9 @@ // @flow import moment from 'moment' +import {decode as decodePolyline} from 'polyline' + +type GraphQLShape = {polyline: string, shape_id: string} /** * @param {number} seconds Seconds after midnight @@ -36,3 +39,16 @@ export function secondsAfterMidnightToHHMM (seconds: ?(number | string)): string export function humanizeSeconds (seconds: number): string { return moment.duration(seconds, 'seconds').humanize() } + +/** + * Array map function to decode a GraphQL encoded shape polyline. + */ +export function decodeShapePolylines (shape: GraphQLShape) { + return { + id: shape.shape_id, + // Decode polyline and coords divide by ten (gtfs-lib + // simplification level requires this). + latLngs: decodePolyline(shape.polyline) + .map(coords => ([coords[0] / 10, coords[1] / 10])) + } +} diff --git a/lib/editor/actions/tripPattern.js b/lib/editor/actions/tripPattern.js index 2817ead54..3234fd522 100644 --- a/lib/editor/actions/tripPattern.js +++ b/lib/editor/actions/tripPattern.js @@ -9,6 +9,7 @@ import {createVoidPayloadAction, fetchGraphQL, secureFetch} from '../../common/a import {snakeCaseKeys} from '../../common/util/map-keys' import {generateUID} from '../../common/util/util' import {showEditorModal} from './editor' +import {shapes} from '../../gtfs/util/graphql' import {fetchGTFSEntities, receiveGTFSEntities} from '../../manager/actions/versions' import {fetchTripCounts} from './trip' import {getEditorNamespace} from '../util/gtfs' @@ -122,27 +123,13 @@ export function fetchTripPatterns (feedId: string) { return function (dispatch: dispatchFn, getState: getStateFn) { dispatch(fetchingTripPatterns()) const namespace = getEditorNamespace(feedId, getState()) - const query = ` -query shapesQuery ($namespace: String) { - feed(namespace: $namespace) { - feed_version - feed_info { - feed_id - } - shapes_as_polylines { - shape_id - polyline - } - } -} -` if (!namespace) { console.error('Cannot fetch GTFS for undefined or null namespace') dispatch(showEditorModal()) return } const variables = {namespace} - return dispatch(fetchGraphQL({query, variables})) + return dispatch(fetchGraphQL({query: shapes, variables})) .then(data => dispatch( receiveGTFSEntities({ namespace, diff --git a/lib/editor/reducers/data.js b/lib/editor/reducers/data.js index 0e5d2dd9c..758e7620a 100644 --- a/lib/editor/reducers/data.js +++ b/lib/editor/reducers/data.js @@ -2,11 +2,11 @@ import update from 'react-addons-update' import clone from 'lodash/cloneDeep' -import {decode as decodePolyline} from 'polyline' import SortDirection from 'react-virtualized/dist/commonjs/Table/SortDirection' -import {ENTITY} from '../constants' +import {decodeShapePolylines} from '../../common/util/gtfs' import {defaultSorter} from '../../common/util/util' +import {ENTITY} from '../constants' import {generateNullProps, getTableById, getKeyForId} from '../util/gtfs' import {getMapToGtfsStrategy, entityIsNew} from '../util/objects' import {assignDistancesToPatternStops, constructShapePoints} from '../util/map' @@ -246,15 +246,7 @@ const data = (state: DataState = defaultState, action: Action): DataState => { // Handle trip patterns to be drawn as overlay layer in editor return update(state, { tripPatterns: {$set: - data.feed.shapes_as_polylines.map(shape => { - return { - id: shape.shape_id, - // Decode polyline and coords divide by ten (gtfs-lib - // simplification level requires this). - latLngs: decodePolyline(shape.polyline) - .map(coords => ([coords[0] / 10, coords[1] / 10])) - } - }) + data.feed.shapes_as_polylines.map(decodeShapePolylines) } }) } diff --git a/lib/gtfs/actions/shapes.js b/lib/gtfs/actions/shapes.js index 0aedff3bf..0dec50877 100644 --- a/lib/gtfs/actions/shapes.js +++ b/lib/gtfs/actions/shapes.js @@ -3,6 +3,7 @@ import {createAction, type ActionType} from 'redux-actions' import {createVoidPayloadAction, fetchGraphQL} from '../../common/actions' +import {decodeShapePolylines} from '../../common/util/gtfs' import {shapes} from '../../gtfs/util/graphql' import {updateRoutesOnMapDisplay} from './filter' @@ -34,13 +35,8 @@ export function toggleShowAllRoutesOnMap (namespace: string) { dispatch(fetchingShapes()) return dispatch(fetchGraphQL({query: shapes, variables: {namespace}})) .then(data => { - const {patterns} = data.feed - const shapes = patterns.map(pattern => { - return pattern.shape.map(point => [ - point.shape_pt_lat, - point.shape_pt_lon - ]) - }) + const {shapes_as_polylines: encodedShapes} = data.feed + const shapes = encodedShapes.map(decodeShapePolylines) dispatch(receiveShapes(shapes)) }) } diff --git a/lib/gtfs/components/GtfsMap.js b/lib/gtfs/components/GtfsMap.js index 4940dd965..93b47c0ee 100644 --- a/lib/gtfs/components/GtfsMap.js +++ b/lib/gtfs/components/GtfsMap.js @@ -1,8 +1,8 @@ // @flow -import React, { Component } from 'react' +import React, { PureComponent } from 'react' import { shallowEqual } from 'react-pure-render' -import { latLngBounds } from 'leaflet' +import L, { latLngBounds } from 'leaflet' import { FeatureGroup, Map, Polyline, Rectangle, TileLayer } from 'react-leaflet' import * as filterActions from '../actions/filter' @@ -13,7 +13,7 @@ import PatternGeoJson from './PatternGeoJson' import StopMarker from './StopMarker' import type {Props as ContainerProps} from '../containers/ActiveGtfsMap' -import type {Bounds, Feed, LatLng, StopWithFeed} from '../../types' +import type {Bounds, Feed, StopWithFeed} from '../../types' import type {DateTimeFilter, MapFilter} from '../../types/reducers' type Props = ContainerProps & { @@ -38,28 +38,13 @@ type Props = ContainerProps & { updateMapState: typeof filterActions.updateMapState, } -type State = { - bounds: any, - lastClicked?: LatLng, - map: any, - searchFocus?: any -} - -const DEFAULT_BOUNDS = [[70, 130], [-70, -130]] +const CANVAS = L.canvas() -export default class GtfsMap extends Component { +export default class GtfsMap extends PureComponent { static defaultProps = { entities: [] } - componentWillMount () { - this.setState({ - bounds: this.props.bounds || DEFAULT_BOUNDS, - map: {}, - searchFocus: null - }) - } - componentDidMount () { this.resetMap(true) } @@ -90,7 +75,6 @@ export default class GtfsMap extends Component { entities, feeds, height, - searchFocus, stop, width } = this.props @@ -100,9 +84,6 @@ export default class GtfsMap extends Component { this._refreshGtfsElements(nextProps.feeds) } } - if (nextProps.searchFocus && nextProps.searchFocus !== searchFocus) { - this.setState({searchFocus: nextProps.searchFocus}) - } if (nextProps.stop && !shallowEqual(nextProps.stop, stop)) { // handle stop: panning on stop select // NOTE: pattern panTo is handled with layerAddHandler and searchFocus @@ -169,8 +150,7 @@ export default class GtfsMap extends Component { } layerAddHandler = (e: any) => { - const {stop, pattern} = this.props - const {searchFocus} = this.state + const {searchFocus, stop, pattern} = this.props // handle pattern panTo and popup open if (pattern && pattern.pattern_id === searchFocus) { // Wait to call open pop up to ensure that layer has fully materialized @@ -182,12 +162,10 @@ export default class GtfsMap extends Component { // Open popup for pattern if added via a selection from the search e.layer.openPopup && e.layer.openPopup() }, 100) - this.setState({searchFocus: null}) } if (stop && searchFocus === stop.stop_id) { // Open popup for stop if added via a selection from the search e.layer.openPopup && e.layer.openPopup() - this.setState({searchFocus: null}) } } @@ -250,6 +228,7 @@ export default class GtfsMap extends Component { {showBounds && versionBoundingBox && } @@ -330,9 +309,11 @@ export default class GtfsMap extends Component { shapes.data.map((shape, index) => + interactive={false} + key={shape.id} + positions={shape.latLngs} + renderer={CANVAS} + weight={2} /> )} ) diff --git a/lib/gtfs/components/ShowAllRoutesOnMapFilter.js b/lib/gtfs/components/ShowAllRoutesOnMapFilter.js index 58bd8f33d..25cf8b4b6 100644 --- a/lib/gtfs/components/ShowAllRoutesOnMapFilter.js +++ b/lib/gtfs/components/ShowAllRoutesOnMapFilter.js @@ -30,23 +30,27 @@ export default class ShowAllRoutesOnMapFilter extends Component { showAllRoutesOnMap, version } = this.props - // Disable if greater than one million records. We don't want to break - // Data Tools because of this shapes GraphQL fetch. This is a somewhat - // arbitrary limit. It may need to be adjusted... + // If there are over a million records, let the user know that UI + // performance might suffer (server should be fine). This is a somewhat + // arbitrary limit. NL has over 4M shape records. const tooManyShapeRecords = version.feedLoadResult.shapes.rowCount > 1000000 return ( {fetchStatus.fetching ? {this.messages('fetching')} - : tooManyShapeRecords - ? this.messages('tooManyShapeRecords') - : this.messages('showAllRoutesOnMap')} + : + {this.messages('showAllRoutesOnMap')} + {tooManyShapeRecords && !fetchStatus.fetched && + {' '}({this.messages('tooManyShapeRecords')}) + } + + } ) } diff --git a/lib/gtfs/util/graphql.js b/lib/gtfs/util/graphql.js index 47a5d528d..211d05fdb 100644 --- a/lib/gtfs/util/graphql.js +++ b/lib/gtfs/util/graphql.js @@ -194,14 +194,11 @@ query timetablesQuery( }` export const shapes = ` -query shapesQuery($namespace: String) { - feed (namespace: $namespace) { - patterns(limit: -1) { - shape(limit: -1) { - shape_pt_lat - shape_pt_lon - shape_pt_sequence - } +query shapesQuery ($namespace: String) { + feed(namespace: $namespace) { + shapes_as_polylines { + shape_id + polyline } } } From 56a30a9cf3549f5dcf57c78a489f1aa9bc0cc3b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Dec 2020 02:29:50 +0000 Subject: [PATCH 062/553] build(deps): bump ini from 1.3.5 to 1.3.7 Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 491ab99b6..35067f15f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6347,9 +6347,9 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== init-package-json@^1.10.3: version "1.10.3" From a01c96789445d9fb80e21edb89c9b80feb1d4ef8 Mon Sep 17 00:00:00 2001 From: Martijn van Laar Date: Mon, 4 Jan 2021 14:34:05 +0100 Subject: [PATCH 063/553] Add config var in env.yml --- configurations/default/env.yml.tmp | 1 + 1 file changed, 1 insertion(+) diff --git a/configurations/default/env.yml.tmp b/configurations/default/env.yml.tmp index a78cfeca0..344cd1527 100644 --- a/configurations/default/env.yml.tmp +++ b/configurations/default/env.yml.tmp @@ -7,5 +7,6 @@ MAPBOX_ATTRIBUTION: Date: Mon, 4 Jan 2021 14:43:20 +0100 Subject: [PATCH 064/553] Update valhalla.js to use config var This updates the valhalla.js file to use the config variable GRAPH_HOPPER_URL and has a fallback if it is not defined. --- lib/scenario-editor/utils/valhalla.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/scenario-editor/utils/valhalla.js b/lib/scenario-editor/utils/valhalla.js index ec48e770c..e106d9a14 100644 --- a/lib/scenario-editor/utils/valhalla.js +++ b/lib/scenario-editor/utils/valhalla.js @@ -195,6 +195,7 @@ export async function getSegment ( * Example URL: https://graphhopper.com/api/1/route?point=49.932707,11.588051&point=50.3404,11.64705&vehicle=car&debug=true&&type=json */ export function routeWithGraphHopper (points: Array): ?Promise { + var graphhopper_url if (points.length < 2) { console.warn('need at least two points to route with graphhopper', points) return null @@ -202,6 +203,13 @@ export function routeWithGraphHopper (points: Array): ?Promise): ?Promise (`point=${p.lat},${p.lng}`)).join('&') return fetch( - `https://graphhopper.com/api/1/route?${locations}&${qs.stringify(params)}` + `${graphhopper_url}route?${locations}&${qs.stringify(params)}` ).then(res => res.json()) } From 4f21a1e8d5f75ec3ce72de9f6f041f8560aa8590 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 6 Jan 2021 17:28:43 -0500 Subject: [PATCH 065/553] refactor(FeedVersionSpanChart): Add a 'today' indicator. --- .../version/FeedVersionSpanChart.js | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 625c4bb42..ebaa69fa1 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -11,7 +11,8 @@ type Props = { comparedVersion: FeedVersion } -const dateFormat = 'MMM. DD, YYYY' +const dateFormat = 'MMM. D, YYYY' +const todayDateFormat = 'MMM. D' const cellStyle = { border: 'none', @@ -48,6 +49,7 @@ export default class FeedVersionSpanChart extends Component { firstDate={firstDate} lastDate={lastDate} isServiceGap={false} + showToday versionStartDate={activeStartDate} versionEndDate={activeEndDate} /> @@ -63,6 +65,7 @@ export default class FeedVersionSpanChart extends Component { firstDate={firstDate} isServiceGap lastDate={lastDate} + showToday={false} versionStartDate={earliestEnd} versionEndDate={latestStart} /> @@ -76,6 +79,7 @@ export default class FeedVersionSpanChart extends Component { firstDate={firstDate} lastDate={lastDate} isServiceGap={false} + showToday={false} versionStartDate={comparedStartDate} versionEndDate={comparedEndDate} /> @@ -89,12 +93,16 @@ export default class FeedVersionSpanChart extends Component { // Width of feed span const WIDTH_PIXELS = 400 +// HACK: Set a fixed offset when positioning the 'today' tooltip, +// since we cannot easily get the width of the 'today' tooltip text. +const TODAY_OFFSET_PIXELS = 45 /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ firstDate, lastDate, isServiceGap = false, + showToday = false, versionStartDate, versionEndDate }) => { @@ -105,6 +113,12 @@ const FeedSpan = ({ const relativeLength = daysActive / totalDays const relativeOffset = versionOffset / totalDays const startLabel = versionStartDate.format(dateFormat) + + const today = moment() + const todayOffset = today.diff(firstDate, 'days') + // Show a 'today' arrow/bubble if today is not outside of the entire range. + const shouldShowToday = showToday && todayOffset >= 0 && todayOffset <= totalDays + // Date labels and validity span occupy a third of the width available. const baseWidth = WIDTH_PIXELS / 3 return ( @@ -133,6 +147,19 @@ const FeedSpan = ({ /> {isServiceGap ? null : endLabel} + + {shouldShowToday && ( + + {`Today - ${today.format(todayDateFormat)}`} + + )} ) From 6e5c2dc9dcac2ac1a520a93d0e29f92bf1be4676 Mon Sep 17 00:00:00 2001 From: Martijn van Laar Date: Thu, 7 Jan 2021 08:03:00 +0100 Subject: [PATCH 066/553] update changes to env.yml.tmp after review --- configurations/default/env.yml.tmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurations/default/env.yml.tmp b/configurations/default/env.yml.tmp index 344cd1527..311da9813 100644 --- a/configurations/default/env.yml.tmp +++ b/configurations/default/env.yml.tmp @@ -7,6 +7,6 @@ MAPBOX_ATTRIBUTION: Date: Thu, 7 Jan 2021 08:05:45 +0100 Subject: [PATCH 067/553] update valhalla.js after review --- lib/scenario-editor/utils/valhalla.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/scenario-editor/utils/valhalla.js b/lib/scenario-editor/utils/valhalla.js index e106d9a14..0370bdcee 100644 --- a/lib/scenario-editor/utils/valhalla.js +++ b/lib/scenario-editor/utils/valhalla.js @@ -203,13 +203,7 @@ export function routeWithGraphHopper (points: Array): ?Promise): ?Promise (`point=${p.lat},${p.lng}`)).join('&') return fetch( - `${graphhopper_url}route?${locations}&${qs.stringify(params)}` + `${GRAPH_HOPPER_URL}route?${locations}&${qs.stringify(params)}` ).then(res => res.json()) } From 5ee65f458664cac16747d758833dc161c26d95d5 Mon Sep 17 00:00:00 2001 From: Martijn van Laar Date: Thu, 7 Jan 2021 08:08:57 +0100 Subject: [PATCH 068/553] Update the grapphopper default url based on doc Based on the doc located here: https://github.com/graphhopper/graphhopper/blob/2.x/docs/web/api-doc.md --- configurations/default/env.yml.tmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurations/default/env.yml.tmp b/configurations/default/env.yml.tmp index 311da9813..730569b8b 100644 --- a/configurations/default/env.yml.tmp +++ b/configurations/default/env.yml.tmp @@ -7,6 +7,6 @@ MAPBOX_ATTRIBUTION: Date: Thu, 7 Jan 2021 19:09:42 +0100 Subject: [PATCH 069/553] add explination of the config url variable --- configurations/default/env.yml.tmp | 1 + 1 file changed, 1 insertion(+) diff --git a/configurations/default/env.yml.tmp b/configurations/default/env.yml.tmp index 730569b8b..d05c954af 100644 --- a/configurations/default/env.yml.tmp +++ b/configurations/default/env.yml.tmp @@ -7,6 +7,7 @@ MAPBOX_ATTRIBUTION: Date: Thu, 7 Jan 2021 19:12:08 +0100 Subject: [PATCH 070/553] Update valhalla to add info about the url variable --- lib/scenario-editor/utils/valhalla.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/scenario-editor/utils/valhalla.js b/lib/scenario-editor/utils/valhalla.js index 0370bdcee..a6842daac 100644 --- a/lib/scenario-editor/utils/valhalla.js +++ b/lib/scenario-editor/utils/valhalla.js @@ -203,6 +203,7 @@ export function routeWithGraphHopper (points: Array): ?Promise Date: Wed, 20 Jan 2021 15:11:12 -0500 Subject: [PATCH 071/553] refactor(FeedVersionSpanChart): Add date marker, have z-index working --- .../version/FeedVersionSpanChart.js | 288 ++++++++++++------ 1 file changed, 196 insertions(+), 92 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index ebaa69fa1..b0fc4ff6d 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -2,7 +2,7 @@ import moment from 'moment' import React, { Component } from 'react' -import { OverlayTrigger, Table, Tooltip } from 'react-bootstrap' +import { Col, Grid, OverlayTrigger, Row, Tooltip } from 'react-bootstrap' import type { FeedVersion } from '../../../types' @@ -14,10 +14,11 @@ type Props = { const dateFormat = 'MMM. D, YYYY' const todayDateFormat = 'MMM. D' -const cellStyle = { - border: 'none', - padding: '0 5px' -} +const BASE_HEIGHT_EM = 1.25 +const HEIGHT_EM = `${BASE_HEIGHT_EM}em` +const SPAN_MARGIN_PIXELS = 5 +const DATE_LABEL_ZINDEX = 9999 +const TODAY_LABEL_ZINDEX = 9998 /** * This component renders bars representing the date ranges for which the given feed versions @@ -40,53 +41,78 @@ export default class FeedVersionSpanChart extends Component { const latestStart = moment.max(activeStartDate, comparedStartDate) return ( -
    This version + Version {activeVersion.version} (selected)
    Gap in service + +
    Version {comparedVersionIndex} + Version {comparedVersion.version}
    - - - - - - {/* Highlight gap in service if one exists */} - {latestStart.diff(earliestEnd, 'days') > 0 && - - {/* Cell placeholder to prevent formatting issues */} - - - - } - - - +
    Version {activeVersion.version} (selected)
    + {/* Cell placeholder to prevent formatting issues */} + {latestStart.diff(earliestEnd, 'days') > 0 &&
    Gap in service
    } +
    Version {comparedVersion.version}
    + +
    + + + + + {latestStart.diff(earliestEnd, 'days') > 0 && - - - -
    Version {activeVersion.version} (selected) - -
    Gap in service - -
    Version {comparedVersion.version} + + +
    + } + + + + + + + + ) } } @@ -102,65 +128,143 @@ const FeedSpan = ({ firstDate, lastDate, isServiceGap = false, - showToday = false, + top, versionStartDate, versionEndDate }) => { const totalDays = lastDate.diff(firstDate, 'days') const versionOffset = versionStartDate.diff(firstDate, 'days') const daysActive = versionEndDate.diff(versionStartDate, 'days') - const endLabel = versionEndDate.format(dateFormat) const relativeLength = daysActive / totalDays const relativeOffset = versionOffset / totalDays + + // Date labels and validity span occupy a third of the width available. + const baseWidth = WIDTH_PIXELS / 3 + + return ( + + {isServiceGap && 'No service for'}{' '} + {daysActive} days + + }> + + + + + ) +} + +/** + * Renders a validity span START label (needs to be separate from the span itself for Z order). + */ +const FeedStartLabel = ({ + firstDate, + lastDate, + top, + versionStartDate +}) => { + const totalDays = lastDate.diff(firstDate, 'days') + const versionOffset = versionStartDate.diff(firstDate, 'days') + const relativeOffset = versionOffset / totalDays const startLabel = versionStartDate.format(dateFormat) + // Date labels and validity span occupy a third of the width available. + const baseWidth = WIDTH_PIXELS / 3 + + return ( + + {startLabel} + + ) +} + +/** + * Renders a validity span END label (needs to be separate from the span itself for Z order). + */ +const FeedEndLabel = ({ + firstDate, + lastDate, + top, + versionStartDate, + versionEndDate +}) => { + const totalDays = lastDate.diff(firstDate, 'days') + const versionOffset = versionStartDate.diff(firstDate, 'days') + const daysActive = versionEndDate.diff(versionStartDate, 'days') + const endLabel = versionEndDate.format(dateFormat) + const relativeLength = daysActive / totalDays + const relativeOffset = versionOffset / totalDays + + // Date labels and validity span occupy a third of the width available. + const baseWidth = WIDTH_PIXELS / 3 + + return ( + + {endLabel} + + ) +} + +/** Renders a marker on today's date (if one of the feeds being compared is valid). */ +const TodayMarker = ({ + firstDate, + lastDate, + versionStartDate, + versionEndDate +}) => { + const totalDays = lastDate.diff(firstDate, 'days') + const today = moment() const todayOffset = today.diff(firstDate, 'days') - // Show a 'today' arrow/bubble if today is not outside of the entire range. - const shouldShowToday = showToday && todayOffset >= 0 && todayOffset <= totalDays // Date labels and validity span occupy a third of the width available. const baseWidth = WIDTH_PIXELS / 3 return ( -
    -
    - - {isServiceGap ? null : startLabel} - - - {isServiceGap && 'No service for'}{' '} - {daysActive} days - - }> - - - {isServiceGap ? null : endLabel} - - {shouldShowToday && ( - - {`Today - ${today.format(todayDateFormat)}`} - - )} -
    -
    +
    ) } From 4c46b9a7b25131ad64fbba78a8bc763ca35ed305 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 21 Jan 2021 15:49:57 -0500 Subject: [PATCH 072/553] refactor(FeedVersionSpanChart): Add back tooltip for today marker. Refactor. --- .../version/FeedVersionSpanChart.js | 137 +++++++++--------- 1 file changed, 67 insertions(+), 70 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index b0fc4ff6d..7a4265113 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -11,14 +11,17 @@ type Props = { comparedVersion: FeedVersion } -const dateFormat = 'MMM. D, YYYY' -const todayDateFormat = 'MMM. D' +const DATE_FORMAT = 'MMM. D, YYYY' +const TODAY_DATE_FORMAT = 'MMM. D' const BASE_HEIGHT_EM = 1.25 const HEIGHT_EM = `${BASE_HEIGHT_EM}em` const SPAN_MARGIN_PIXELS = 5 +// Render the 'today' marker above the spans (they have default z-index), +// but underneath the date labels. +// This is also why we need to split up labels and spans during rendering. const DATE_LABEL_ZINDEX = 9999 -const TODAY_LABEL_ZINDEX = 9998 +const TODAY_MARKER_ZINDEX = 9998 /** * This component renders bars representing the date ranges for which the given feed versions @@ -40,39 +43,44 @@ export default class FeedVersionSpanChart extends Component { const earliestEnd = moment.min(activeEndDate, comparedEndDate) const latestStart = moment.max(activeStartDate, comparedStartDate) + const hasGap = latestStart.diff(earliestEnd, 'days') > 0 + + // Render the today marker if it is between first and last date. + const today = moment() + const totalDays = lastDate.diff(firstDate, 'days') + const todayOffset = today.diff(firstDate, 'days') + const showToday = todayOffset >= 0 && todayOffset < totalDays + + const activeChartProps = { + firstDate, + lastDate, + top: 0, + versionEndDate: activeEndDate, + versionStartDate: activeStartDate + } + const comparedChartProps = { + firstDate, + lastDate, + top: `${(hasGap ? 2 : 1) * BASE_HEIGHT_EM}em`, + versionEndDate: comparedEndDate, + versionStartDate: comparedStartDate + } + return (
    Version {activeVersion.version} (selected)
    {/* Cell placeholder to prevent formatting issues */} - {latestStart.diff(earliestEnd, 'days') > 0 &&
    Gap in service
    } + {hasGap &&
    Gap in service
    }
    Version {comparedVersion.version}
    - - - + + + - {latestStart.diff(earliestEnd, 'days') > 0 && + {hasGap && { /> } - - - - + + + + {showToday && + />}
    @@ -119,9 +108,6 @@ export default class FeedVersionSpanChart extends Component { // Width of feed span const WIDTH_PIXELS = 400 -// HACK: Set a fixed offset when positioning the 'today' tooltip, -// since we cannot easily get the width of the 'today' tooltip text. -const TODAY_OFFSET_PIXELS = 45 /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ @@ -187,14 +173,14 @@ const FeedStartLabel = ({ const totalDays = lastDate.diff(firstDate, 'days') const versionOffset = versionStartDate.diff(firstDate, 'days') const relativeOffset = versionOffset / totalDays - const startLabel = versionStartDate.format(dateFormat) + const startLabel = versionStartDate.format(DATE_FORMAT) // Date labels and validity span occupy a third of the width available. const baseWidth = WIDTH_PIXELS / 3 return ( { const totalDays = lastDate.diff(firstDate, 'days') @@ -255,16 +239,29 @@ const TodayMarker = ({ // Date labels and validity span occupy a third of the width available. const baseWidth = WIDTH_PIXELS / 3 + return ( -
    + + {`Today - ${today.format(TODAY_DATE_FORMAT)}`} + } + placement='top'> +
    + ) } From 59cf1ae85548469df283f892ae5cb8174a7dbf9e Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 21 Jan 2021 16:16:45 -0500 Subject: [PATCH 073/553] refactor(FeedVersionNavigator): Move compared ver. selector to this component. --- .../components/version/FeedVersionDetails.js | 7 ------- .../components/version/FeedVersionNavigator.js | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index cb3ce3854..f973497a8 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -18,7 +18,6 @@ import {getConfigProperty, isExtensionEnabled} from '../../../common/util/config import {BLOCKING_ERROR_TYPES} from '../../util/version' import VersionDateLabel from './VersionDateLabel' import VersionRetrievalBadge from './VersionRetrievalBadge' -import VersionComparisonDropdown from './VersionComparisonDropdown' import VersionSelectorDropdown from './VersionSelectorDropdown' import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' @@ -120,12 +119,6 @@ export default class FeedVersionDetails extends Component {

    - {/* Only show merge feeds button if the feed starts in the future. FIXME: uncomment out the below to prevent merges with non-future feeds. diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index c86ec914e..222895874 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -18,6 +18,7 @@ import * as gtfsPlusActions from '../../../gtfsplus/actions/gtfsplus' import * as deploymentActions from '../../../manager/actions/deployments' import DeploymentPreviewButton from '../DeploymentPreviewButton' import FeedVersionViewer from './FeedVersionViewer' +import VersionComparisonDropdown from './VersionComparisonDropdown' import VersionSelectorDropdown from './VersionSelectorDropdown' import type {Props as ContainerProps} from '../../containers/ActiveFeedVersionNavigator' @@ -228,6 +229,7 @@ export default class FeedVersionNavigator extends Component { } + {isModuleEnabled('deployment') && deploymentForVersion @@ -297,6 +299,19 @@ export default class FeedVersionNavigator extends Component { : null } + + {feedSource.feedVersions && + + + + + + } From 03b3652bbb4045bfecf5cd7b590c3fb5fff3ad2e Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 21 Jan 2021 17:17:16 -0500 Subject: [PATCH 074/553] refactor(FeedVersionSpanChart): Tighten up date label widths. --- .../version/FeedVersionSpanChart.js | 133 ++++++++---------- 1 file changed, 58 insertions(+), 75 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 7a4265113..3c22c609a 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -4,6 +4,7 @@ import moment from 'moment' import React, { Component } from 'react' import { Col, Grid, OverlayTrigger, Row, Tooltip } from 'react-bootstrap' +import VersionDateLabel from './VersionDateLabel' import type { FeedVersion } from '../../../types' type Props = { @@ -14,9 +15,12 @@ type Props = { const DATE_FORMAT = 'MMM. D, YYYY' const TODAY_DATE_FORMAT = 'MMM. D' -const BASE_HEIGHT_EM = 1.25 -const HEIGHT_EM = `${BASE_HEIGHT_EM}em` -const SPAN_MARGIN_PIXELS = 5 +// Width of feed span bar. +const BAR_WIDTH_PX = 150 +const DATE_WIDTH_PX = 100 +const HEIGHT_EM = 1.25 +const HEIGHT_PROP = `${HEIGHT_EM}em` +const SPAN_MARGIN_PX = 5 // Render the 'today' marker above the spans (they have default z-index), // but underneath the date labels. // This is also why we need to split up labels and spans during rendering. @@ -56,49 +60,45 @@ export default class FeedVersionSpanChart extends Component { lastDate, top: 0, versionEndDate: activeEndDate, + versionLabel: , versionStartDate: activeStartDate } const comparedChartProps = { firstDate, lastDate, - top: `${(hasGap ? 2 : 1) * BASE_HEIGHT_EM}em`, + top: (`${(hasGap ? 2 : 1) * HEIGHT_EM}em`), versionEndDate: comparedEndDate, + versionLabel: , versionStartDate: comparedStartDate } return ( - + -
    Version {activeVersion.version} (selected)
    - {/* Cell placeholder to prevent formatting issues */} - {hasGap &&
    Gap in service
    } -
    Version {comparedVersion.version}
    +
    Version {activeVersion.version} (selected)
    + {} + {hasGap && +
    Gap in service
    } +
    Version {comparedVersion.version}
    - + - {hasGap && - - } - - - - - - {showToday && } + + + + {showToday && }
    @@ -106,9 +106,6 @@ export default class FeedVersionSpanChart extends Component { } } -// Width of feed span -const WIDTH_PIXELS = 400 - /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ firstDate, @@ -124,27 +121,21 @@ const FeedSpan = ({ const relativeLength = daysActive / totalDays const relativeOffset = versionOffset / totalDays - // Date labels and validity span occupy a third of the width available. - const baseWidth = WIDTH_PIXELS / 3 - return ( - {isServiceGap && 'No service for'}{' '} - {daysActive} days - - }> + overlay={ + {isServiceGap && 'No service for'}{' '} + {daysActive} days + }> + width: `${relativeLength * BAR_WIDTH_PX}px` + }}> @@ -175,20 +165,17 @@ const FeedStartLabel = ({ const relativeOffset = versionOffset / totalDays const startLabel = versionStartDate.format(DATE_FORMAT) - // Date labels and validity span occupy a third of the width available. - const baseWidth = WIDTH_PIXELS / 3 - return ( - + {startLabel} ) @@ -201,8 +188,9 @@ const FeedEndLabel = ({ firstDate, lastDate, top, - versionStartDate, - versionEndDate + versionEndDate, + versionLabel, + versionStartDate }) => { const totalDays = lastDate.diff(firstDate, 'days') const versionOffset = versionStartDate.diff(firstDate, 'days') @@ -211,18 +199,16 @@ const FeedEndLabel = ({ const relativeLength = daysActive / totalDays const relativeOffset = versionOffset / totalDays - // Date labels and validity span occupy a third of the width available. - const baseWidth = WIDTH_PIXELS / 3 - return ( - - {endLabel} + + {endLabel} {versionLabel} ) } @@ -237,9 +223,6 @@ const TodayMarker = ({ const today = moment() const todayOffset = today.diff(firstDate, 'days') - // Date labels and validity span occupy a third of the width available. - const baseWidth = WIDTH_PIXELS / 3 - return ( Date: Thu, 21 Jan 2021 19:38:26 -0500 Subject: [PATCH 075/553] refactor(FeedVersionDetails): Move validity dates to this component. Tweak layout. --- .../components/version/FeedVersionDetails.js | 30 +++++----- .../version/FeedVersionSpanChart.js | 57 +++++++++++-------- .../components/version/FeedVersionTabs.js | 11 ---- 3 files changed, 48 insertions(+), 50 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index f973497a8..17eee46d3 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -1,7 +1,6 @@ // @flow import Icon from '@conveyal/woonerf/components/icon' -import moment from 'moment' import React, {Component} from 'react' import { Button, @@ -16,10 +15,9 @@ import bboxPoly from 'turf-bbox-polygon' import * as versionsActions from '../../actions/versions' import {getConfigProperty, isExtensionEnabled} from '../../../common/util/config' import {BLOCKING_ERROR_TYPES} from '../../util/version' -import VersionDateLabel from './VersionDateLabel' +import FeedVersionSpanChart from './FeedVersionSpanChart' import VersionRetrievalBadge from './VersionRetrievalBadge' import VersionSelectorDropdown from './VersionSelectorDropdown' - import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' import type {ManagerUserState} from '../../../types/reducers' @@ -34,8 +32,6 @@ type Props = { version: FeedVersion } -const dateFormat = 'MMM. DD, YYYY' - export default class FeedVersionDetails extends Component { getBoundsArea (bounds: Bounds): number { if (!bounds) return 0 @@ -87,6 +83,7 @@ export default class FeedVersionDetails extends Component { render () { const { + comparedVersion, comparedVersionIndex, feedSource, gtfsPlusValidation, @@ -163,20 +160,16 @@ export default class FeedVersionDetails extends Component { {' '} - Valid from {moment(summary.startDate).format(dateFormat)}{' '} - to {moment(summary.endDate).format(dateFormat)} + Feed validity dates - {' '} - {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && isExtensionEnabled('mtc') &&
    Cannot publish version because it has a{' '} {hasGtfsPlusBlockingIssue ? 'GTFS+ ' : ''} @@ -189,6 +182,15 @@ export default class FeedVersionDetails extends Component {
    }

    + + {comparedVersion && comparedVersionIndex && ( + + )} +

    {summary && summary.avgDailyRevenueTime ? diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 3c22c609a..188dec950 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -2,14 +2,15 @@ import moment from 'moment' import React, { Component } from 'react' -import { Col, Grid, OverlayTrigger, Row, Tooltip } from 'react-bootstrap' +import { OverlayTrigger, Tooltip } from 'react-bootstrap' import VersionDateLabel from './VersionDateLabel' import type { FeedVersion } from '../../../types' type Props = { activeVersion: FeedVersion, - comparedVersion: FeedVersion + comparedVersion: FeedVersion, + style: any } const DATE_FORMAT = 'MMM. D, YYYY' @@ -34,7 +35,7 @@ const TODAY_MARKER_ZINDEX = 9998 */ export default class FeedVersionSpanChart extends Component { render () { - const { activeVersion, comparedVersion } = this.props + const { activeVersion, comparedVersion, style } = this.props // Construct moment objects for the active/compared version start/end dates. const activeStartDate = moment(activeVersion.validationSummary.startDate) const activeEndDate = moment(activeVersion.validationSummary.endDate) @@ -71,22 +72,26 @@ export default class FeedVersionSpanChart extends Component { versionLabel: , versionStartDate: comparedStartDate } + const versionProps = { + height: HEIGHT_PROP, + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap' + } return ( - - - -

    Version {activeVersion.version} (selected)
    - {} - {hasGap && +
    +
    +
    Version {activeVersion.version} (selected)
    + {hasGap &&
    Gap in service
    } -
    Version {comparedVersion.version}
    - - - - - - {hasGap && +
    Version {comparedVersion.version}
    +
    +
    + + + + {hasGap && { versionStartDate={earliestEnd} versionEndDate={latestStart} />} - - - - {showToday && } - - - + + + + {showToday && } +
    +
    ) } } @@ -202,10 +206,13 @@ const FeedEndLabel = ({ return ( {endLabel} {versionLabel} @@ -237,7 +244,7 @@ const TodayMarker = ({ style={{ backgroundColor: 'yellow', border: '1px solid #bbb', - height: `${HEIGHT_EM * 3}em`, + bottom: 0, left: `${DATE_WIDTH_PX + todayOffset / totalDays * BAR_WIDTH_PX}px`, position: 'absolute', top: 0, diff --git a/lib/manager/components/version/FeedVersionTabs.js b/lib/manager/components/version/FeedVersionTabs.js index 5839fc185..99305938c 100644 --- a/lib/manager/components/version/FeedVersionTabs.js +++ b/lib/manager/components/version/FeedVersionTabs.js @@ -14,7 +14,6 @@ import Timetables from '../reporter/containers/Timetables' import ServicePerModeChart from '../validation/ServicePerModeChart' import TripsChart from '../validation/TripsChart' import FeedVersionAccessibility from './FeedVersionAccessibility' -import FeedVersionSpanChart from './FeedVersionSpanChart' import type {Element} from 'react' @@ -146,16 +145,6 @@ export default class FeedVersionTabs extends Component {

    {this.messages('daysActive')}

    - - - {comparedVersion && comparedVersionIndex && ( - - )} - -
    From 223d093b6057ddb011f8169abf989b7c454aae15 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 28 Jan 2021 17:49:30 -0500 Subject: [PATCH 076/553] feat(auto-deploy): Add OTP auto-deploy project setting corresponds to changes in ibi-group/datatools-server#361 --- i18n/english.yml | 15 +++ lib/common/util/permissions.js | 2 +- lib/manager/actions/projects.js | 9 +- lib/manager/components/DeploymentSettings.js | 118 ++++++++++++++----- lib/types/index.js | 1 + package.json | 2 +- yarn.lock | 10 +- 7 files changed, 113 insertions(+), 44 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 2d3fccbc7..21ec1197b 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -57,6 +57,19 @@ components: success: Success! warning: Warning! DeploymentSettings: + autoDeploy: + description: > + Once a pinned deployment has been configured and deployed to a + server (at least once), auto-deployment can be enabled so that whenever + a new version is processed for an associated feed source, a deployment + will be kicked off (assuming there are no critical errors with the new + version). + label: Enable auto-deploy + noPinnedDeployment: None selected + pinnedDeploymentHelp: > + Tip: Under the Deployments tab, click the thumbtack icon next to the + deployment you would like to target for auto-deployments. + title: Auto-deployment boundsPlaceholder: 'min_lon, min_lat, max_lon, max_lat' buildConfig: elevationBucket: @@ -69,6 +82,8 @@ components: stationTransfers: Sta. Transfers subwayAccessTime: Subway Access Time title: Build Config + clear: Clear + manageServers: Manage deployment servers osm: bounds: Custom Extract Bounds custom: Use Custom Extract Bounds diff --git a/lib/common/util/permissions.js b/lib/common/util/permissions.js index 969235f6c..9dd2d4d97 100644 --- a/lib/common/util/permissions.js +++ b/lib/common/util/permissions.js @@ -43,7 +43,7 @@ export function checkEntitiesForFeeds ( /** * Checks whether it is possible for a user in this application to analyze - * projet deployments + * project deployments */ export function deploymentsEnabledAndAccessAllowedForProject ( project: ?Project, diff --git a/lib/manager/actions/projects.js b/lib/manager/actions/projects.js index a62885cb3..d98fae081 100644 --- a/lib/manager/actions/projects.js +++ b/lib/manager/actions/projects.js @@ -4,7 +4,7 @@ import {createAction, type ActionType} from 'redux-actions' import {browserHistory} from 'react-router' import {createVoidPayloadAction, secureFetch} from '../../common/actions' -import {getConfigProperty} from '../../common/util/config' +import {getConfigProperty, isModuleEnabled} from '../../common/util/config' import {deploymentsEnabledAndAccessAllowedForProject} from '../../common/util/permissions' import {fetchProjectDeployments} from './deployments' import {fetchProjectFeeds} from './feeds' @@ -139,15 +139,16 @@ export function deleteProject (project: Project) { export function updateProject ( projectId: string, changes: {[string]: any}, - fetchFeeds: ?boolean = false + fetchFeedsAndDeployments: ?boolean = false ) { return function (dispatch: dispatchFn, getState: getStateFn) { dispatch(savingProject()) const url = `/api/manager/secure/project/${projectId}` return dispatch(secureFetch(url, 'put', changes)) .then((res) => { - if (fetchFeeds) { - return dispatch(fetchProjectWithFeeds(projectId)) + if (fetchFeedsAndDeployments) { + dispatch(fetchProjectWithFeeds(projectId)) + isModuleEnabled('deployment') && dispatch(fetchProjectDeployments(projectId)) } else { return dispatch(fetchProject(projectId)) } diff --git a/lib/manager/components/DeploymentSettings.js b/lib/manager/components/DeploymentSettings.js index 61be630f2..bf9be0c5f 100644 --- a/lib/manager/components/DeploymentSettings.js +++ b/lib/manager/components/DeploymentSettings.js @@ -1,9 +1,21 @@ // @flow import Icon from '@conveyal/woonerf/components/icon' -import objectPath from 'object-path' +// $FlowFixMe coalesce method is missing in flow type +import {coalesce, get, set} from 'object-path' import React, {Component} from 'react' -import {Row, Col, Button, Panel, Glyphicon, Radio, FormGroup, ControlLabel, FormControl} from 'react-bootstrap' +import { + Button, + Checkbox, + Col, + ControlLabel, + FormControl, + FormGroup, + Glyphicon, + Panel, + Radio, + Row +} from 'react-bootstrap' import update from 'react-addons-update' import {shallowEqual} from 'react-pure-render' import {withRouter} from 'react-router' @@ -25,6 +37,7 @@ type Props = { } type State = { + autoDeploy?: boolean, buildConfig: Object, routerConfig: Object, useCustomOsmBounds?: boolean @@ -34,27 +47,29 @@ class DeploymentSettings extends Component { messages = getComponentMessages('DeploymentSettings') state = { - buildConfig: objectPath.get(this.props, 'project.buildConfig') || {}, - routerConfig: objectPath.get(this.props, 'project.routerConfig') || {} + buildConfig: get(this.props, 'project.buildConfig') || {}, + routerConfig: get(this.props, 'project.routerConfig') || {} } componentWillReceiveProps (nextProps) { if (nextProps.project.lastUpdated !== this.props.project.lastUpdated) { // Reset state using project data if it is updated. this.setState({ - buildConfig: objectPath.get(nextProps, 'project.buildConfig') || {}, - routerConfig: objectPath.get(nextProps, 'project.routerConfig') || {} + buildConfig: get(nextProps, 'project.buildConfig') || {}, + routerConfig: get(nextProps, 'project.routerConfig') || {} }) } } componentDidMount () { - // FIXME: This is broken. Check for edits does not always return correct value. - // this.props.router.setRouteLeaveHook(this.props.route, () => { - // if (!this._noEdits()) { - // return 'You have unsaved information, are you sure you want to leave this page?' - // } - // }) + // $FlowFixMe react-router 3.x is not available in flow-typed. + const {routes, router} = this.props + // Check for unsaved edits and warn user if they attempt to navigate away. + router.setRouteLeaveHook(routes[0], () => { + if (!this._noEdits()) { + return 'You have unsaved information, are you sure you want to leave this page?' + } + }) } _clearBuildConfig = () => { @@ -72,7 +87,7 @@ class DeploymentSettings extends Component { if (item) { const stateUpdate = {} item.effects && item.effects.forEach(e => { - objectPath.set(stateUpdate, `${e.key}.$set`, e.value) + set(stateUpdate, `${e.key}.$set`, e.value) }) switch (item.type) { case 'checkbox': @@ -96,19 +111,19 @@ class DeploymentSettings extends Component { _onChangeCheckbox = (evt, stateUpdate = {}, index = null) => { const name = index !== null ? evt.target.name.replace('$index', `${index}`) : evt.target.name - objectPath.set(stateUpdate, `${name}.$set`, evt.target.checked) + set(stateUpdate, `${name}.$set`, evt.target.checked) this.setState(update(this.state, stateUpdate)) } _onChangeSplit = (evt, stateUpdate = {}, index = null) => { const name = index !== null ? evt.target.name.replace('$index', `${index}`) : evt.target.name - objectPath.set(stateUpdate, `${name}.$set`, evt.target.value.split(',')) + set(stateUpdate, `${name}.$set`, evt.target.value.split(',')) this.setState(update(this.state, stateUpdate)) } _onAddUpdater = () => { const stateUpdate = {} - objectPath.set(stateUpdate, + set(stateUpdate, `routerConfig.updaters.$${this.state.routerConfig.updaters ? 'push' : 'set'}`, [{type: '', url: '', frequencySec: 30, sourceType: '', defaultAgencyId: ''}] ) @@ -117,7 +132,7 @@ class DeploymentSettings extends Component { _onRemoveUpdater = (index) => { const stateUpdate = {} - objectPath.set(stateUpdate, `routerConfig.updaters.$splice`, [[index, 1]]) + set(stateUpdate, `routerConfig.updaters.$splice`, [[index, 1]]) this.setState(update(this.state, stateUpdate)) } @@ -125,19 +140,19 @@ class DeploymentSettings extends Component { const name = index !== null ? evt.target.name.replace('$index', `${index}`) : evt.target.name // If value is empty string or undefined, set to null in settings object. // Otherwise, certain fields (such as 'fares') would cause issues with OTP. - objectPath.set(stateUpdate, `${name}.$set`, evt.target.value || null) + set(stateUpdate, `${name}.$set`, evt.target.value || null) this.setState(update(this.state, stateUpdate)) } _onChangeNumber = (evt, stateUpdate = {}, index = null) => { const name = index !== null ? evt.target.name.replace('$index', `${index}`) : evt.target.name - objectPath.set(stateUpdate, `${name}.$set`, +evt.target.value) + set(stateUpdate, `${name}.$set`, +evt.target.value) this.setState(update(this.state, stateUpdate)) } _onSelectBool = (evt, stateUpdate = {}, index = null) => { const name = index !== null ? evt.target.name.replace('$index', `${index}`) : evt.target.name - objectPath.set(stateUpdate, `${name}.$set`, (evt.target.value === 'true')) + set(stateUpdate, `${name}.$set`, (evt.target.value === 'true')) this.setState(update(this.state, stateUpdate)) } @@ -149,7 +164,7 @@ class DeploymentSettings extends Component { // check for conditional render, e.g. elevationBucket is dependent on fetchElevationUS if (f.condition) { const {key, value} = f.condition - const val = objectPath.get(state, `${key}`) + const val = get(state, `${key}`) if (val !== value) return false } return true @@ -157,7 +172,7 @@ class DeploymentSettings extends Component { return ( { }) } - _onSave = (evt) => this.props.updateProject(this.props.project.id, this.state) + _onSave = (evt) => this.props.updateProject(this.props.project.id, this.state, true) + + _onToggleAutoDeploy = (evt) => { + console.log(evt.target.checked) + const stateUpdate = { autoDeploy: { $set: evt.target.checked } } + this.setState(update(this.state, stateUpdate)) + } _onToggleCustomBounds = (evt) => { const stateUpdate = { useCustomOsmBounds: { $set: (evt.target.value === 'true') } } @@ -189,6 +210,12 @@ class DeploymentSettings extends Component { } } + /** + * Get value for key from state or, if undefined, default to project property + * from props. + */ + _getValue = (key) => coalesce(this.state, [key], this.props.project[key]) + /** * Determine if deployment settings have been modified by checking that every * item in the state matches the original object found in the project object. @@ -198,22 +225,55 @@ class DeploymentSettings extends Component { .every(key => shallowEqual(this.state[key], this.props.project[key])) render () { - const updaters = objectPath.get(this.state, 'routerConfig.updaters') || [] + const updaters = get(this.state, 'routerConfig.updaters') || [] const {project, editDisabled} = this.props + const {pinnedDeploymentId} = project + const pinnedDeployment = pinnedDeploymentId && project.deployments && project.deployments.find(d => d.id === pinnedDeploymentId) return (
    + {/* Auto-deploy settings */} + + {' '} + {this.messages('autoDeploy.title')} + + }> +

    {this.messages('autoDeploy.description')}

    +

    + Pinned Deployment:{' '} + {pinnedDeployment + ? pinnedDeployment.name + : + {this.messages('autoDeploy.noPinnedDeployment')} + + } +

    + {!pinnedDeployment && + + {this.messages('autoDeploy.pinnedDeploymentHelp')} + + } + + {this.messages('autoDeploy.label')} + +
    {/* Build config settings */} {' '} {this.messages('buildConfig.title')} @@ -227,7 +287,7 @@ class DeploymentSettings extends Component { {' '} {this.messages('routerConfig.title')} @@ -278,14 +338,14 @@ class DeploymentSettings extends Component { {this.messages('osm.gtfs')} {this.messages('osm.custom')} diff --git a/lib/types/index.js b/lib/types/index.js index d90e92872..c9548bdd8 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -690,6 +690,7 @@ export type RouterConfig = { } export type Project = { + autoDeploy: boolean, autoFetchFeeds: boolean, autoFetchHour: number, autoFetchMinute: number, diff --git a/package.json b/package.json index 5ab1b4947..15c7374a9 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "lodash": "^4.17.10", "moment": "^2.11.2", "numeral": "2.0.4", - "object-path": "^0.11.1", + "object-path": "^0.11.5", "polyline": "^0.2.0", "prop-types": "^15.6.0", "qs": "^6.2.1", diff --git a/yarn.lock b/yarn.lock index 70d434802..47bafbaa8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9695,7 +9695,6 @@ npm@^6.14.8: cmd-shim "^3.0.3" columnify "~1.5.4" config-chain "^1.1.12" - debuglog "*" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" @@ -9710,7 +9709,6 @@ npm@^6.14.8: has-unicode "~2.0.1" hosted-git-info "^2.8.8" iferr "^1.0.2" - imurmurhash "*" infer-owner "^1.0.4" inflight "~1.0.6" inherits "^2.0.4" @@ -9729,14 +9727,8 @@ npm@^6.14.8: libnpx "^10.2.4" lock-verify "^2.1.0" lockfile "^1.0.4" - lodash._baseindexof "*" lodash._baseuniq "~4.6.0" - lodash._bindcallback "*" - lodash._cacheindexof "*" - lodash._createcache "*" - lodash._getnative "*" lodash.clonedeep "~4.5.0" - lodash.restparam "*" lodash.union "~4.6.0" lodash.uniq "~4.5.0" lodash.without "~4.4.0" @@ -9872,7 +9864,7 @@ object-keys@^1.0.11, object-keys@^1.0.12: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.1: +object-path@^0.11.5: version "0.11.5" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== From 26fd3f31cefc3d2993a2cdf9e903846ac944a66a Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 28 Jan 2021 17:56:43 -0500 Subject: [PATCH 077/553] refactor(DeploymentSettings.js): remove setRouteLeaveHook --- lib/manager/components/DeploymentSettings.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/manager/components/DeploymentSettings.js b/lib/manager/components/DeploymentSettings.js index bf9be0c5f..6b92507a6 100644 --- a/lib/manager/components/DeploymentSettings.js +++ b/lib/manager/components/DeploymentSettings.js @@ -61,17 +61,6 @@ class DeploymentSettings extends Component { } } - componentDidMount () { - // $FlowFixMe react-router 3.x is not available in flow-typed. - const {routes, router} = this.props - // Check for unsaved edits and warn user if they attempt to navigate away. - router.setRouteLeaveHook(routes[0], () => { - if (!this._noEdits()) { - return 'You have unsaved information, are you sure you want to leave this page?' - } - }) - } - _clearBuildConfig = () => { this.props.updateProject(this.props.project.id, {buildConfig: {}}) } From aae8b19b5a273537efa91ee9af76938f9871c1d0 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 29 Jan 2021 12:16:49 -0500 Subject: [PATCH 078/553] refactor(FeedVersionSpan): Remove title prop. --- lib/manager/components/version/FeedVersionSpanChart.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 188dec950..aa5b4b6e9 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -148,7 +148,6 @@ const FeedSpan = ({ bottom: '10%', width: '100%' }} - title={`${daysActive} days`} /> From 886aa99161744de0b9791756ce993fb0aca4277d Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 1 Feb 2021 22:16:00 -0800 Subject: [PATCH 079/553] refactor: add OTP 2 checkbox in deployment viewer --- lib/manager/components/DeploymentViewer.js | 13 +++++++++++++ lib/types/index.js | 1 + 2 files changed, 14 insertions(+) diff --git a/lib/manager/components/DeploymentViewer.js b/lib/manager/components/DeploymentViewer.js index d77c09a5c..c1735fe2f 100644 --- a/lib/manager/components/DeploymentViewer.js +++ b/lib/manager/components/DeploymentViewer.js @@ -209,6 +209,11 @@ export default class DeploymentViewer extends Component { _onSelectTarget = (target: string) => this.setState({target}) + _onToggleOtp2 = () => { + const {deployment, updateDeployment} = this.props + updateDeployment(deployment, { otp2: !deployment.otp2 }) + } + _onUpdateVersion = (option: ReactSelectOption) => { const key = this.props.deployment.r5 ? 'r5Version' : 'otpVersion' this._updateDeployment({[key]: option.value}) @@ -419,6 +424,14 @@ export default class DeploymentViewer extends Component { value={deployment.r5 ? deployment.r5Version : deployment.otpVersion} onChange={this._onUpdateVersion} options={options ? options.map(v => ({value: v, label: v})) : []} /> + {!deployment.r5 && + + OTP v2.x + + } Deploying to the{' '} diff --git a/lib/types/index.js b/lib/types/index.js index d90e92872..4d6b049ea 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -233,6 +233,7 @@ export type Deployment = { name: string, organizationId: ?string, osmExtractUrl: ?string, + otp2?: ?boolean, otpVersion: ?string, projectBounds: Bounds, projectId: string, From 3d07771ecd828ec8e5de754fcd92569556fa5a55 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 5 Feb 2021 09:38:22 -0500 Subject: [PATCH 080/553] refactor: address PR comments --- __tests__/test-utils/mock-data/manager.js | 1 + lib/manager/components/DeploymentSettings.js | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/__tests__/test-utils/mock-data/manager.js b/__tests__/test-utils/mock-data/manager.js index 5d282687c..2182ddb37 100644 --- a/__tests__/test-utils/mock-data/manager.js +++ b/__tests__/test-utils/mock-data/manager.js @@ -70,6 +70,7 @@ export const mockProject = { autoFetchFeeds: true, autoFetchHour: 0, autoFetchMinute: 0, + autoDeploy: false, bounds: null, buildConfig: { fares: null, diff --git a/lib/manager/components/DeploymentSettings.js b/lib/manager/components/DeploymentSettings.js index 6b92507a6..0a26ee165 100644 --- a/lib/manager/components/DeploymentSettings.js +++ b/lib/manager/components/DeploymentSettings.js @@ -173,7 +173,6 @@ class DeploymentSettings extends Component { _onSave = (evt) => this.props.updateProject(this.props.project.id, this.state, true) _onToggleAutoDeploy = (evt) => { - console.log(evt.target.checked) const stateUpdate = { autoDeploy: { $set: evt.target.checked } } this.setState(update(this.state, stateUpdate)) } @@ -216,8 +215,9 @@ class DeploymentSettings extends Component { render () { const updaters = get(this.state, 'routerConfig.updaters') || [] const {project, editDisabled} = this.props - const {pinnedDeploymentId} = project - const pinnedDeployment = pinnedDeploymentId && project.deployments && project.deployments.find(d => d.id === pinnedDeploymentId) + const {deployments, pinnedDeploymentId} = project + const pinnedDeployment = pinnedDeploymentId && deployments && + deployments.find(d => d.id === pinnedDeploymentId) return (
    From 31aff5480a8c133998645bd978b5f30cdc3f0b74 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Thu, 11 Feb 2021 00:14:00 -0800 Subject: [PATCH 081/553] feat: add ability to add custom files for deployments --- __tests__/test-utils/mock-data/manager.js | 3 +- .../__tests__/__snapshots__/projects.js.snap | 3 +- lib/manager/components/DeploymentViewer.js | 340 ++++++++++++++++-- .../__snapshots__/DeploymentsPanel.js.snap | 36 +- .../__snapshots__/FeedSourceTable.js.snap | 24 +- lib/style.css | 11 + lib/types/index.js | 13 +- 7 files changed, 349 insertions(+), 81 deletions(-) diff --git a/__tests__/test-utils/mock-data/manager.js b/__tests__/test-utils/mock-data/manager.js index 5d282687c..79a6ff097 100644 --- a/__tests__/test-utils/mock-data/manager.js +++ b/__tests__/test-utils/mock-data/manager.js @@ -57,10 +57,9 @@ export function makeMockDeployment ( otpVersion: null, projectId: project.id, projectBounds: {east: 0, west: 0, north: 0, south: 0}, - r5: false, - r5Version: null, routerId: null, skipOsmExtract: false, + tripPlannerVersion: 'OTP_1', user: null } } diff --git a/lib/manager/actions/__tests__/__snapshots__/projects.js.snap b/lib/manager/actions/__tests__/__snapshots__/projects.js.snap index 6cee153b7..7a1b8548e 100644 --- a/lib/manager/actions/__tests__/__snapshots__/projects.js.snap +++ b/lib/manager/actions/__tests__/__snapshots__/projects.js.snap @@ -116,10 +116,9 @@ Object { "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], diff --git a/lib/manager/components/DeploymentViewer.js b/lib/manager/components/DeploymentViewer.js index c1735fe2f..5afbd37a4 100644 --- a/lib/manager/components/DeploymentViewer.js +++ b/lib/manager/components/DeploymentViewer.js @@ -45,6 +45,7 @@ import DeploymentVersionsTable from './DeploymentVersionsTable' import type {Props as ContainerProps} from '../containers/ActiveDeploymentViewer' import type { + CustomFile, Deployment, ReactSelectOption, ServerJob, @@ -67,8 +68,8 @@ type Props = ContainerProps & { } type State = { + customFileEditIdx: null | number, otp: Array, - r5: Array, searchText: ?string, target: ?string } @@ -87,13 +88,18 @@ const SAMPLE_ROUTER_CONFIG = `{ } }` +const TRIP_PLANNER_VERSIONS = [ + { label: 'OTP 1.X', value: 'OTP_1' }, + { label: 'OTP 2.X', value: 'OTP_2' } +] + export default class DeploymentViewer extends Component { messages = getComponentMessages('DeploymentViewer') state = { + customFileEditIdx: null, + otp: [], searchText: null, - target: null, - r5: [], - otp: [] + target: null } componentDidMount () { @@ -128,7 +134,7 @@ export default class DeploymentViewer extends Component { * @param {string} text text response from s3 * @param {string} key state key under which to store options */ - _parseOptionsFromXml = (text: string, key: 'otp' | 'r5') => { + _parseOptionsFromXml = (text: string) => { const parser = new window.DOMParser() const doc = parser.parseFromString(text, 'application/xml') @@ -136,23 +142,30 @@ export default class DeploymentViewer extends Component { .map(item => item.querySelector('Key').childNodes[0].nodeValue) // get just key .filter(item => item !== 'index.html') // don't include the main page .map(item => item.replace(/.jar$/, '')) // and remove .jar - this.setState({[key]: all}) + this.setState({otp: all}) } - _loadAndParseOptionsFromXml = (url: string, key: 'otp' | 'r5') => { + _loadAndParseOptionsFromXml = (url: string) => { fetch(url) .then(res => res.text()) - .then(text => this._parseOptionsFromXml(text, key)) + .then(text => this._parseOptionsFromXml(text)) } /** * Load .jar options from OTP and R5 S3 buckets. */ _loadOptions = () => { - const r5Url = getConfigProperty('modules.deployment.r5_download_url') || 'https://r5-builds.s3.amazonaws.com' - this._loadAndParseOptionsFromXml(r5Url, 'r5') const otpUrl = getConfigProperty('modules.deployment.otp_download_url') || 'https://opentripplanner-builds.s3.amazonaws.com' - this._loadAndParseOptionsFromXml(otpUrl, 'otp') + this._loadAndParseOptionsFromXml(otpUrl) + } + + _onAddCustomFile = () => { + const { deployment } = this.props + const customFiles = deployment.customFiles + ? [...deployment.customFiles, {}] + : [{}] + this._updateDeployment({ customFiles }) + this.setState({ customFileEditIdx: customFiles.length - 1 }) } _onAddFeedSource = (feedSourceId: string) => { @@ -170,8 +183,6 @@ export default class DeploymentViewer extends Component { _onChangeName = (name: string) => this._updateDeployment({name}) - _onChangeR5 = () => this._updateDeployment({r5: !this.props.deployment.r5}) - _onChangeBuildGraphOnly = () => this._updateDeployment({buildGraphOnly: !this.props.deployment.buildGraphOnly}) _onChangeSkipOsmExtract = () => { @@ -190,6 +201,29 @@ export default class DeploymentViewer extends Component { _onCloseModal = () => this.setState({target: null}) + _onCancelEditingCustomFile = () => { + this.setState({ customFileEditIdx: null }) + } + + _onEditCustomFile = (idx: number) => { + this.setState({ customFileEditIdx: idx }) + } + + _onDeleteCustomFile = (idx: number) => { + const { deployment } = this.props + const customFiles = [...deployment.customFiles || []] + customFiles.splice(idx, 1) + this._updateDeployment({ customFiles }) + } + + _onSaveCustomFile = (idx: number, data: CustomFile) => { + const { deployment } = this.props + const customFiles = [...deployment.customFiles || []] + customFiles[idx] = data + this._updateDeployment({ customFiles }) + this.setState({ customFileEditIdx: null }) + } + _setOsmUrl = () => { const currentUrl = this.props.deployment.osmExtractUrl || '' const osmExtractUrl = window.prompt( @@ -209,14 +243,13 @@ export default class DeploymentViewer extends Component { _onSelectTarget = (target: string) => this.setState({target}) - _onToggleOtp2 = () => { + _onUpdateTripPlannerVersion = (option: ReactSelectOption) => { const {deployment, updateDeployment} = this.props - updateDeployment(deployment, { otp2: !deployment.otp2 }) + updateDeployment(deployment, { tripPlannerVersion: option.value }) } _onUpdateVersion = (option: ReactSelectOption) => { - const key = this.props.deployment.r5 ? 'r5Version' : 'otpVersion' - this._updateDeployment({[key]: option.value}) + this._updateDeployment({otpVersion: option.value}) } _updateDeployment = (props: {[string]: any}) => { @@ -407,31 +440,35 @@ export default class DeploymentViewer extends Component { renderConfigurationsPanel () { const { deployment, updateDeployment } = this.props - const options = deployment.r5 ? this.state.r5 : this.state.otp + const options = this.state.otp + const isOtp = deployment.tripPlannerVersion.startsWith('OTP_') return ( OTP Configuration}> - Use R5 Build graph only - {deployment.r5 ? 'R5' : 'OTP'} version + onChange={this._onChangeBuildGraphOnly} + > + Build graph only + + Trip Planner Version: ({value: v, label: v})) : []} + /> +
    + )}
    Deploying to the{' '} @@ -495,11 +532,44 @@ export default class DeploymentViewer extends Component { updateDeployment={updateDeployment} deployment={deployment} /> + {this.renderCustomFiles()}
    ) } + renderCustomFiles = () => { + const { deployment } = this.props + const { customFileEditIdx } = this.state + + return ( + +
    Custom Files
    + {deployment.customFiles && deployment.customFiles.map( + (customFile, idx) => ( + + ) + )} + +
    + ) + } + render () { const { deleteFeedVersion, @@ -678,3 +748,205 @@ class CustomConfig extends Component<{ ) } } + +class CustomFileEditor extends Component<{ + customFile: CustomFile, + customFileEditIdx: null | number, + idx: number, + onCancelEditing: () => void, + onDelete: (number) => void, + onEdit: (number) => void, + onSave: (number, CustomFile) => void +}, { + fileSource: 'raw' | 'uri', + model: CustomFile +}> { + constructor (props) { + super(props) + const { customFile } = props + this.state = { + fileSource: customFile.contents ? 'raw' : 'uri', + model: props.customFile + } + } + + _onChangeBuildUse = () => { + const { model } = this.state + this.setState({ + model: { + ...model, + useDuringBuild: !model.useDuringBuild + } + }) + } + + _onChangeContents = (evt: SyntheticInputEvent) => { + this.setState({ + model: { + ...this.state.model, + contents: evt.target.value + } + }) + } + + _onChangeFilename = (evt: SyntheticInputEvent) => { + this.setState({ + model: { + ...this.state.model, + filename: evt.target.value + } + }) + } + + _onChangeServeUse = () => { + const { model } = this.state + this.setState({ + model: { + ...model, + useDuringServe: !model.useDuringServe + } + }) + } + + _onChangeSource = (evt: SyntheticInputEvent) => { + const model = {...this.state.model} + // set variable to make flow happy + let newSource + if (evt.target.value === 'raw') { + model.uri = null + newSource = 'raw' + } else { + model.contents = null + newSource = 'uri' + } + this.setState({ + fileSource: newSource, + model + }) + } + + _onChangeUri = (evt: SyntheticInputEvent) => { + this.setState({ + model: { + ...this.state.model, + uri: evt.target.value + } + }) + } + + _onCancelEditing = () => { + const { customFile, onCancelEditing } = this.props + this.setState({ + fileSource: customFile.contents ? 'raw' : 'uri', + model: customFile + }) + onCancelEditing() + } + + _onDelete = () => { + const { idx, onDelete } = this.props + onDelete(idx) + } + + _onEdit = () => { + const { idx, onEdit } = this.props + onEdit(idx) + } + + _onSave = () => { + const { idx, onSave } = this.props + onSave(idx, this.state.model) + } + + render () { + const { + customFileEditIdx, + idx + } = this.props + const { + fileSource, + model: customFile + } = this.state + const isValid = customFile.contents || customFile.uri + const isEditing = idx === customFileEditIdx + const canEdit = customFileEditIdx === null + + return ( +
    + + {isEditing && ( + + )} + {isEditing && } + {canEdit && } + {canEdit && } + + + + Use during graph build + + + Use while running server + + + File source + + + + + {!isValid && Please set contents or uri!} + {fileSource === 'raw' && ( + + )} + {fileSource === 'uri' && ( + + + {!customFile.uri && ( + Enter either a HTTP(S) URL or AWS S3 URI + )} + + )} + +
    + ) + } +} diff --git a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap index e48ea83b0..fa0bd7a88 100644 --- a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap @@ -129,10 +129,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, Object { @@ -161,10 +160,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -352,10 +350,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, Object { @@ -384,10 +381,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -642,10 +638,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, Object { @@ -674,10 +669,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -1010,10 +1004,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, } } @@ -1133,10 +1126,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, Object { @@ -1165,10 +1157,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -1431,10 +1422,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, } } @@ -1554,10 +1544,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, Object { @@ -1586,10 +1575,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], diff --git a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap index 163f34121..dc08b312d 100644 --- a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap @@ -128,10 +128,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -411,10 +410,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -675,10 +673,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -870,10 +867,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -1083,10 +1079,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -2949,10 +2944,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -3206,10 +3200,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], @@ -3747,10 +3740,9 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds "west": 0, }, "projectId": "mock-project-with-deployments-id", - "r5": false, - "r5Version": null, "routerId": null, "skipOsmExtract": false, + "tripPlannerVersion": "OTP_1", "user": null, }, ], diff --git a/lib/style.css b/lib/style.css index efa2051f4..7702c1676 100644 --- a/lib/style.css +++ b/lib/style.css @@ -261,6 +261,17 @@ td.feed-source-info { margin-right: 5px; } +.custom-file { + border: 1px solid lightgray; + border-radius: 5px; + margin-bottom: 10px; + padding: 8px; +} + +.custom-file .btn-group { + margin-bottom: 8px; +} + /* Prevent text from being selectable */ .unselectable { -webkit-touch-callout: none; diff --git a/lib/types/index.js b/lib/types/index.js index 4d6b049ea..538430db8 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -211,12 +211,21 @@ export type DeploySummary = { status: JobStatus } +export type CustomFile = { + contents?: ?string, + filename: ?string, + uri?: ?string, + useDuringBuild: boolean, + useDuringServe: boolean +} + // TODO: Remove this eslint rule once https://github.com/babel/babel-eslint/pull/584 // is merged in. /* eslint-disable no-use-before-define */ export type Deployment = { buildGraphOnly?: boolean, customBuildConfig: ?string, + customFiles?: Array, customRouterConfig: ?string, dateCreated: number, deployJobSummaries: Array, @@ -233,14 +242,12 @@ export type Deployment = { name: string, organizationId: ?string, osmExtractUrl: ?string, - otp2?: ?boolean, otpVersion: ?string, projectBounds: Bounds, projectId: string, - r5: boolean, - r5Version: ?string, routerId: ?string, skipOsmExtract: boolean, + tripPlannerVersion: 'OTP_1' | 'OTP_2', user: ?any // TODO add more specific type } From 51172b5776fed461e022c270fd5a0aae63e8f04f Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 17:32:41 -0500 Subject: [PATCH 082/553] ci(GitHub Actions): replace travis CI with GH actions --- .github/workflows/node-ci.yml | 101 +++++++++++++++++++ .travis.yml | 56 ---------- scripts/check-if-e2e-should-run-on-travis.sh | 22 ++-- 3 files changed, 115 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/node-ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml new file mode 100644 index 000000000..c7b3f2b49 --- /dev/null +++ b/.github/workflows/node-ci.yml @@ -0,0 +1,101 @@ +name: Node.js CI + +on: [push, pull_request] + +jobs: + test-build-release: + + runs-on: ubuntu-latest + # Add postgres for end-to-end + services: + postgres: + image: postgres:10.8 + # Set postgres env variables according to test env.yml config + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: catalogue + ports: + - 5432:5432 + # Set health checks to wait until postgres has started + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - uses: actions/checkout@v2 + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + - name: Install npm/yarn packages using cache + uses: bahmutov/npm-install@v1 + # Inject slug vars, so that we can reference $GITHUB_HEAD_REF_SLUG for branch name + - name: Inject slug/short variables + uses: rlespinasse/github-slug-action@v3.x + - name: Check if End-to-end should run + run: ./scripts/check-if-e2e-should-run-on-travis.sh + - name: Lint code + run: yarn lint + - name: Lint messages + run: yarn lint-messages + - name: Run flow check + run: yarn flow + - name: Run tests with coverage + run: yarn cover-client + # Upload coverage results from unit tests and then delete coverage reports to + # avoid uploading the same coverage results twice. + - name: Upload coverage results from unit tests + run: bash <(curl -s https://codecov.io/bash) -c -F unit_tests + - name: Build with minification + run: yarn run build -- --minify + - name: Build docs + run: mkdocs build + - name: Start MongoDB + if: env.SHOULD_RUN_E2E == 'true' + uses: supercharge/mongodb-github-action@1.3.0 + with: + mongodb-version: 4.2 + - name: Add aws credentials for datatools-server + if: env.SHOULD_RUN_E2E == 'true' + run: mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=${AWS_ACCESS_KEY_ID}' 'aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}' 'region=us-east-1' > ~/.aws/config; else mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=foo' 'aws_secret_access_key=bar' 'region=us-east-1' > ~/.aws/config + - name: Run e2e tests + if: env.SHOULD_RUN_E2E == 'true' + run: + - mvn test + env: + AUTH0_API_CLIENT: ${{ secrets.AUTH0_API_CLIENT }} + AUTH0_API_SECRET: ${{ secrets.AUTH0_API_SECRET }} + AUTH0_CLIENT_ID: ${{ secrets.AUTH0_CLIENT_ID }} + AUTH0_DOMAIN: ${{ secrets.AUTH0_DOMAIN }} + AUTH0_SECRET: ${{ secrets.AUTH0_SECRET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_REGION: ${{ secrets.AWS_REGION }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + E2E_AUTH0_PASSWORD: ${{ secrets.E2E_AUTH0_PASSWORD }} + E2E_AUTH0_USERNAME: ${{ secrets.E2E_AUTH0_USERNAME }} + GRAPH_HOPPER_KEY: ${{ secrets.GRAPH_HOPPER_KEY }} + GTFS_DATABASE_PASSWORD: ${{ secrets.GTFS_DATABASE_PASSWORD }} + GTFS_DATABASE_URL: ${{ secrets.GTFS_DATABASE_URL }} + GTFS_DATABASE_USER: ${{ secrets.GTFS_DATABASE_USER }} + MAPBOX_ACCESS_TOKEN: ${{ secrets.MAPBOX_ACCESS_TOKEN }} + MONGO_DB_NAME: ${{ secrets.MONGO_DB_NAME }} + OSM_VEX: ${{ secrets.OSM_VEX }} + RUN_E2E: "true" + S3_BUCKET: ${{ secrets.S3_BUCKET }} + SPARKPOST_EMAIL: ${{ secrets.SPARKPOST_EMAIL }} + SPARKPOST_KEY: ${{ secrets.SPARKPOST_KEY }} + TRANSITFEEDS_KEY: ${{ secrets.TRANSITFEEDS_KEY }} + # At this point, the build is successful. + # Upload coverage results from e2e tests and then delete coverage reports to + # avoid uploading the same coverage results twice. + - name: Upload coverage results from e2e + if: env.SHOULD_RUN_E2E == 'true' + run: bash <(curl -s https://codecov.io/bash) -c -F end_to_end_tests + continue-on-error: true + - name: Semantic Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: yarn semantic-release diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index df71b1a1d..000000000 --- a/.travis.yml +++ /dev/null @@ -1,56 +0,0 @@ -# although this is a node.js project, specify the use of Java in order for OTP -# and datatools-server to run as expected on Java 8 specifically. Although not -# confirmed in any way, another thought with using a Java-specific image is that -# some things may be more optimized for Java thus making for more expedient and -# reliable execution of Java code. -dist: trusty # jdk 8 not available on xenial -language: java -java: - - oraclejdk8 -install: true -notifications: - email: false -services: - # needed for e2e tests to start datatools-server - - mongodb - - postgresql -addons: - postgresql: 9.6 -cache: - directories: - - $HOME/.cache/yarn - - $HOME/.cache/pip -before_install: - # install node 12 - - nvm install 12 - # install yarn - - curl -o- -L https://yarnpkg.com/install.sh | bash - - pip install --user mkdocs - - source ./scripts/check-if-e2e-should-run-on-travis.sh - # create database for e2e tests - - if [ "$SHOULD_RUN_E2E" = "true" ]; then psql -U postgres -c 'CREATE DATABASE catalogue;'; fi - # add aws credentials for datatools-server - - if [ "$SHOULD_RUN_E2E" = "true" ]; then mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=${AWS_ACCESS_KEY_ID}' 'aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}' 'region=us-east-1' > ~/.aws/config; else mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=foo' 'aws_secret_access_key=bar' 'region=us-east-1' > ~/.aws/config; fi -script: - - yarn - - yarn run lint - - yarn run lint-messages - - yarn run flow - - yarn run cover-client - # upload coverage results from unit tests and then delete coverage reports to - # avoid uploading the same coverage results twice - - bash <(curl -s https://codecov.io/bash) -c -F unit_tests - - if [ "$SHOULD_RUN_E2E" = "true" ]; then yarn run cover-end-to-end; fi - # upload coverage results from e2e tests and then delete coverage reports to - # avoid uploading the same coverage results twice - - if [ "$SHOULD_RUN_E2E" = "true" ]; then bash <(curl -s https://codecov.io/bash) -c -F end_to_end_tests; fi - - yarn run build -- --minify - - mkdocs build - -# If sudo is disabled, CI runs on container based infrastructure (allows caching &c.) -sudo: false - -# Push results to codecov.io -after_success: - # only deploy the release to github as the package is not needed on npm - - yarn run semantic-release diff --git a/scripts/check-if-e2e-should-run-on-travis.sh b/scripts/check-if-e2e-should-run-on-travis.sh index d5d4cb578..077b46db9 100644 --- a/scripts/check-if-e2e-should-run-on-travis.sh +++ b/scripts/check-if-e2e-should-run-on-travis.sh @@ -1,14 +1,20 @@ # Since the e2e tests take a while to run and it could present an inconvenience # to be making sure the e2e tests work on every single PR, only run the e2e -# tests on Travis for PRs to master or on commits directly to dev or master -if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then - if [[ "$TRAVIS_BRANCH" = "master" ]]; then - export SHOULD_RUN_E2E=true; - echo 'Will run E2E tests because this is a PR to master' - fi +# tests on CI for PRs to master or on commits directly to dev or master +if [[ "$GITHUB_BASE_REF_SLUG" = "master" ]]; then + echo "SHOULD_RUN_E2E=true" >> $GITHUB_ENV && export SHOULD_RUN_E2E=true + echo 'Will run E2E tests because this is a PR to master' else - if [[ "$TRAVIS_REPO_SLUG" = "ibi-group/datatools-ui" ]] && [[ "$TRAVIS_BRANCH" = "master" || "$TRAVIS_BRANCH" = "dev" ]]; then - export SHOULD_RUN_E2E=true; + if [[ "$GITHUB_REPOSITORY" = "ibi-group/datatools-server" ]] && [[ "$GITHUB_REF_SLUG" = "master" || "$GITHUB_REF_SLUG" = "dev" || "$GITHUB_REF_SLUG" = "github-actions" ]]; then + echo "SHOULD_RUN_E2E=true" >> $GITHUB_ENV && export SHOULD_RUN_E2E=true echo 'Will run E2E tests because this is a commit to master or dev' fi fi + +if [[ "$SHOULD_RUN_E2E" != "true" ]]; then + echo 'Skipping E2E tests...' +fi + +# FIXME: Re-enable e2e for conditions above. +echo "SHOULD_RUN_E2E=false" >> $GITHUB_ENV && export SHOULD_RUN_E2E=true +echo 'Overriding E2E. Temporarily forcing to be false...' From 76c0d6232d6389626b3a7ab82490d41c85373ab8 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 17:33:51 -0500 Subject: [PATCH 083/553] ci(gh-actions): use correct e2e command --- .github/workflows/node-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index c7b3f2b49..451de695f 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -63,7 +63,7 @@ jobs: - name: Run e2e tests if: env.SHOULD_RUN_E2E == 'true' run: - - mvn test + - yarn cover-end-to-end env: AUTH0_API_CLIENT: ${{ secrets.AUTH0_API_CLIENT }} AUTH0_API_SECRET: ${{ secrets.AUTH0_API_SECRET }} From ac74a2d575875be214d771328257677bfcb7d048 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 17:37:31 -0500 Subject: [PATCH 084/553] refactor(gh-actions): fix syntax error --- .github/workflows/node-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 451de695f..8a46d83a8 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -62,8 +62,7 @@ jobs: run: mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=${AWS_ACCESS_KEY_ID}' 'aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}' 'region=us-east-1' > ~/.aws/config; else mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=foo' 'aws_secret_access_key=bar' 'region=us-east-1' > ~/.aws/config - name: Run e2e tests if: env.SHOULD_RUN_E2E == 'true' - run: - - yarn cover-end-to-end + run: yarn cover-end-to-end env: AUTH0_API_CLIENT: ${{ secrets.AUTH0_API_CLIENT }} AUTH0_API_SECRET: ${{ secrets.AUTH0_API_SECRET }} From b5beebb61fb1708541f926b68abc746544b89220 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 17:41:52 -0500 Subject: [PATCH 085/553] ci(e2e-check): rename file, fix permissioins --- ...e-should-run-on-travis.sh => check-if-e2e-should-run-on-ci.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{check-if-e2e-should-run-on-travis.sh => check-if-e2e-should-run-on-ci.sh} (100%) mode change 100644 => 100755 diff --git a/scripts/check-if-e2e-should-run-on-travis.sh b/scripts/check-if-e2e-should-run-on-ci.sh old mode 100644 new mode 100755 similarity index 100% rename from scripts/check-if-e2e-should-run-on-travis.sh rename to scripts/check-if-e2e-should-run-on-ci.sh From a58eb2fd6a561c92496e263437bc5e47600d9700 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 17:45:36 -0500 Subject: [PATCH 086/553] ci(gh-actions): fix e2e check script name --- .github/workflows/node-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 8a46d83a8..78ea5c3f8 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -35,7 +35,7 @@ jobs: - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v3.x - name: Check if End-to-end should run - run: ./scripts/check-if-e2e-should-run-on-travis.sh + run: ./scripts/check-if-e2e-should-run-on-ci.sh - name: Lint code run: yarn lint - name: Lint messages From baaa879c1858fa207c9390e09fc994e4a6b1d268 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 17:53:08 -0500 Subject: [PATCH 087/553] ci(gh-actions): install mkdocs --- .github/workflows/node-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 78ea5c3f8..c4963836f 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -25,6 +25,8 @@ jobs: --health-retries 5 steps: - uses: actions/checkout@v2 + - name: Install mkdocs + run: pip install --user mkdocs - name: Use Node.js 12.x uses: actions/setup-node@v1 with: From ba1460e2b7711b79aca11d1293e932c224eaa209 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 18:12:58 -0500 Subject: [PATCH 088/553] ci(gh-actions): setup python environment --- .github/workflows/node-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index c4963836f..b22a436d6 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -25,6 +25,8 @@ jobs: --health-retries 5 steps: - uses: actions/checkout@v2 + # Set up Python so that mkdocs command can be run. + - uses: actions/setup-python@v2 - name: Install mkdocs run: pip install --user mkdocs - name: Use Node.js 12.x From 712d6321a0580909e423da90d0219da8132e3033 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 11 Feb 2021 18:21:10 -0500 Subject: [PATCH 089/553] ci(gh-actions): fix pip install of mkdocs --- .github/workflows/node-ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index b22a436d6..057fde7ef 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -27,8 +27,11 @@ jobs: - uses: actions/checkout@v2 # Set up Python so that mkdocs command can be run. - uses: actions/setup-python@v2 - - name: Install mkdocs - run: pip install --user mkdocs + - name: Install mkdocs with pip + uses: actions/pip-action@v1 + with: + packages: mkdocs + extra: --user - name: Use Node.js 12.x uses: actions/setup-node@v1 with: From 6130dfda089670ae703ae8552876265d0ff67bd0 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 12 Feb 2021 09:10:19 -0500 Subject: [PATCH 090/553] ci(gh-actions): update pip install --- .github/workflows/node-ci.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 057fde7ef..50cddf3fa 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -25,13 +25,20 @@ jobs: --health-retries 5 steps: - uses: actions/checkout@v2 - # Set up Python so that mkdocs command can be run. - - uses: actions/setup-python@v2 - - name: Install mkdocs with pip - uses: actions/pip-action@v1 + - name: Set up Python + uses: actions/setup-python@v2 + - name: Cache pip + uses: actions/cache@v2 with: - packages: mkdocs - extra: --user + # This path is specific to Ubuntu + path: ~/.cache/pip + # Look to see if there is a cache hit for the corresponding requirements file + key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + ${{ runner.os }}- + - name: Install mkdocs + run: pip install mkdocs - name: Use Node.js 12.x uses: actions/setup-node@v1 with: From 8ef099ed6605f5abbcdecd9b3156e620f4ea92ad Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 17 Feb 2021 10:02:02 -0500 Subject: [PATCH 091/553] refactor(DeploymentsPanel): move auto-deploy settings to main panel --- i18n/english.yml | 34 +++-- lib/manager/components/DeploymentSettings.js | 45 ------ lib/manager/components/DeploymentsPanel.js | 153 +++++++++++++------ lib/manager/components/ProjectViewer.js | 112 ++++++++------ 4 files changed, 197 insertions(+), 147 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 21ec1197b..38ed82c55 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -57,19 +57,6 @@ components: success: Success! warning: Warning! DeploymentSettings: - autoDeploy: - description: > - Once a pinned deployment has been configured and deployed to a - server (at least once), auto-deployment can be enabled so that whenever - a new version is processed for an associated feed source, a deployment - will be kicked off (assuming there are no critical errors with the new - version). - label: Enable auto-deploy - noPinnedDeployment: None selected - pinnedDeploymentHelp: > - Tip: Under the Deployments tab, click the thumbtack icon next to the - deployment you would like to target for auto-deployments. - title: Auto-deployment boundsPlaceholder: 'min_lon, min_lat, max_lon, max_lat' buildConfig: elevationBucket: @@ -153,8 +140,29 @@ components: name: Name title: Deployments DeploymentsPanel: + autoDeploy: + help: > + Whenever a new version is processed, a deployment will automatically be + kicked off (assuming there are no critical errors). + label: Enable auto-deploy? + noPinnedDeployment: None selected + pinnedDeploymentHelp: > + Tip: Under the Deployments tab, click the thumbtack icon next to the + deployment you would like to target for auto-deployments. + title: Auto-deployment + configuration: + body: > + Deployments can use project-level configurations (e.g., for build or + router config files) or be configured individually. + editSettings: Edit deployment settings + manageServers: Manage deployment servers + title: Configuring deployments delete: Remove deployment new: New Deployment + pinnedDeployment: + help: Pin a deployment (and deploy to a server at least once) to enable auto-deployment. + label: Pinned deployment + placeholder: Select a deployment to pin search: Search for deployments table: creationDate: Created diff --git a/lib/manager/components/DeploymentSettings.js b/lib/manager/components/DeploymentSettings.js index 0a26ee165..501bf7de4 100644 --- a/lib/manager/components/DeploymentSettings.js +++ b/lib/manager/components/DeploymentSettings.js @@ -37,7 +37,6 @@ type Props = { } type State = { - autoDeploy?: boolean, buildConfig: Object, routerConfig: Object, useCustomOsmBounds?: boolean @@ -172,11 +171,6 @@ class DeploymentSettings extends Component { _onSave = (evt) => this.props.updateProject(this.props.project.id, this.state, true) - _onToggleAutoDeploy = (evt) => { - const stateUpdate = { autoDeploy: { $set: evt.target.checked } } - this.setState(update(this.state, stateUpdate)) - } - _onToggleCustomBounds = (evt) => { const stateUpdate = { useCustomOsmBounds: { $set: (evt.target.value === 'true') } } this.setState(update(this.state, stateUpdate)) @@ -215,47 +209,8 @@ class DeploymentSettings extends Component { render () { const updaters = get(this.state, 'routerConfig.updaters') || [] const {project, editDisabled} = this.props - const {deployments, pinnedDeploymentId} = project - const pinnedDeployment = pinnedDeploymentId && deployments && - deployments.find(d => d.id === pinnedDeploymentId) return (
    - - - - {/* Auto-deploy settings */} - - {' '} - {this.messages('autoDeploy.title')} - - }> -

    {this.messages('autoDeploy.description')}

    -

    - Pinned Deployment:{' '} - {pinnedDeployment - ? pinnedDeployment.name - : - {this.messages('autoDeploy.noPinnedDeployment')} - - } -

    - {!pinnedDeployment && - - {this.messages('autoDeploy.pinnedDeploymentHelp')} - - } - - {this.messages('autoDeploy.label')} - -
    {/* Build config settings */} diff --git a/lib/manager/components/DeploymentsPanel.js b/lib/manager/components/DeploymentsPanel.js index ce4b8bc53..a1de5b5f4 100644 --- a/lib/manager/components/DeploymentsPanel.js +++ b/lib/manager/components/DeploymentsPanel.js @@ -4,16 +4,21 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import { LinkContainer } from 'react-router-bootstrap' import { - Row, - Label as BsLabel, - Col, Button, ButtonGroup, - Table, - FormControl, + Checkbox, + Col, + ControlLabel, Glyphicon, - Panel + HelpBlock, + FormControl, + FormGroup, + Label as BsLabel, + Panel, + Row, + Table } from 'react-bootstrap' +import Select from 'react-select' import * as deploymentActions from '../actions/deployments' import * as feedsActions from '../actions/feeds' @@ -27,7 +32,7 @@ import {formatTimestamp, fromNow} from '../../common/util/date-time' import {getServerDeployedTo} from '../util/deployment' import type {Props as ContainerProps} from '../containers/DeploymentsPanel' -import type {Deployment, Project} from '../../types' +import type {Deployment, Project, ReactSelectOption} from '../../types' type Props = ContainerProps & { createDeployment: typeof deploymentActions.createDeployment, @@ -40,6 +45,50 @@ type Props = ContainerProps & { } export default class DeploymentsPanel extends Component { + messages = getComponentMessages('DeploymentsPanel') + + _onChangePinned = (option: ReactSelectOption) => { + const { + fetchProjectDeployments, + fetchProjectFeeds, + project, + updateProject + } = this.props + + updateProject( + project.id, + { pinnedDeploymentId: option ? option.value : null } + // $FlowFixMe action is wrapped in dispatch, so it can do promise stuff + ).then( + () => { + fetchProjectDeployments(project.id) + // needed in case user switches back to feeds tab + fetchProjectFeeds(project.id) + } + ) + } + + _onToggleAutoDeploy = (evt: SyntheticInputEvent) => { + const { + fetchProjectDeployments, + fetchProjectFeeds, + project, + updateProject + } = this.props + + updateProject( + project.id, + { autoDeploy: evt.target.checked } + // $FlowFixMe action is wrapped in dispatch, so it can do promise stuff + ).then( + () => { + fetchProjectDeployments(project.id) + // needed in case user switches back to feeds tab + fetchProjectFeeds(project.id) + } + ) + } + _onDeleteDeployment = (deployment: Deployment) => { this.refs.confirmModal.open({ title: 'Delete Deployment?', @@ -62,8 +111,10 @@ export default class DeploymentsPanel extends Component { updateDeployment, updateProject } = this.props - const deployment = project.deployments && - project.deployments.find(d => d.id && d.id === deploymentId) + const deployments = project.deployments || [] + const deployment = deployments && + deployments.find(d => d.id && d.id === deploymentId) + // Deployment is selected and found in list. if (deployment) { return ( { feedSources={project.feedSources} /> ) } - if (deploymentId && !project.deployments) { + // Deployment is selected, but deployments have not finished loading. + if (deploymentId && !deployments) { return } return ( @@ -90,16 +142,53 @@ export default class DeploymentsPanel extends Component { updateProject={updateProject} /> - Deploying feeds to OTP}> -

    A collection of feeds can be deployed to OpenTripPlanner (OTP) instances that have been defined in the organization settings.

    + + {this.messages('autoDeploy.title')} + + }> + + + {' '} + {this.messages('pinnedDeployment.label')} + + ({label: d.name, value: d.id}))} + options={sortedDeployments.map(d => ({label: d.name, value: d.id}))} placeholder={this.messages('pinnedDeployment.placeholder')} value={project.pinnedDeploymentId} /> - - {this.messages('pinnedDeployment.help')} - + {this.messages('pinnedDeployment.help')} { {this.messages('autoDeploy.help')} {this.messages('configuration.title')} +

    {this.messages('config.title')}

    }> -

    - {this.messages('configuration.body')} -

    +

    {this.messages('config.body')}

    @@ -201,17 +152,13 @@ export default class DeploymentsPanel extends Component { type ListProps = { createDeployment: typeof deploymentActions.createDeployment, deleteDeployment: Deployment => void, - fetchProjectDeployments: typeof deploymentActions.fetchProjectDeployments, - fetchProjectFeeds: typeof feedsActions.fetchProjectFeeds, + deployments: Array, project: Project, saveDeployment: typeof deploymentActions.saveDeployment, - updateDeployment: typeof deploymentActions.updateDeployment, - updateProject: typeof projectsActions.updateProject + updateDeployment: typeof deploymentActions.updateDeployment } -type State = { - searchText?: string -} +type State = {searchText?: string} class DeploymentsList extends Component { messages = getComponentMessages('DeploymentsList') @@ -223,37 +170,19 @@ class DeploymentsList extends Component { _onClickNewDeployment = () => this.props.createDeployment(this.props.project.id) render () { - const {project} = this.props - const {deployments} = project + const { + deleteDeployment, + deployments, + project, + saveDeployment, + updateDeployment + } = this.props const {searchText} = this.state - const {pinnedDeploymentId} = project + // Filter deployments by search text. const visibleDeployments: Array = deployments - ? deployments - // Filter deployments by search text. - .filter(deployment => - deployment.name - .toLowerCase() - .indexOf((searchText || '').toLowerCase()) !== -1 - ) - .sort((a, b) => { - // If creating deployment, pin to top. - if (!a.name) return -1 - if (!b.name) return 1 - // Ensure pinned deployment is first element in list. - if (b.id === pinnedDeploymentId) return 1 - if (a.id === pinnedDeploymentId) return -1 - // Otherwise, sort by most recent last deployed date and then most recent - // created date (ensuring deployments never deployed show up at end of - // list). - // TODO: Refactor to allow for sorting on multiple fields? This may be - // overkill for deployments. - const aValue = a.lastDeployed || a.dateCreated - const bValue = b.lastDeployed || b.dateCreated - if (b.lastDeployed && !a.lastDeployed) return 1 - else if (a.lastDeployed && !b.lastDeployed) return -1 - return bValue - aValue - }) - : [] + .filter(({name}) => + name.toLowerCase().indexOf((searchText || '').toLowerCase()) !== -1 + ) return ( { - + ) diff --git a/lib/manager/containers/DeploymentsPanel.js b/lib/manager/containers/DeploymentsPanel.js index 9411b87ac..4e4bdae5b 100644 --- a/lib/manager/containers/DeploymentsPanel.js +++ b/lib/manager/containers/DeploymentsPanel.js @@ -3,10 +3,8 @@ import {connect} from 'react-redux' import {updateProject} from '../actions/projects' -import {fetchProjectFeeds} from '../actions/feeds' import { createDeployment, - fetchProjectDeployments, saveDeployment, deleteDeployment, updateDeployment @@ -27,8 +25,6 @@ const mapStateToProps = (state: AppState, ownProps: Props) => ({}) const mapDispatchToProps = { createDeployment, deleteDeployment, - fetchProjectDeployments, - fetchProjectFeeds, saveDeployment, updateDeployment, updateProject diff --git a/lib/manager/util/deployment.js b/lib/manager/util/deployment.js index 5dd73b7a9..aabb9a9d4 100644 --- a/lib/manager/util/deployment.js +++ b/lib/manager/util/deployment.js @@ -244,3 +244,25 @@ export function getActiveInstanceCount (instances?: Array) { ? instances.filter(instance => instance.state.name === 'running').length : 0 } + +/** + * Sort function for list of deployments. + */ +export function deploymentsComparator (a: Deployment, b: Deployment, pinnedDeploymentId: ?string) { + // If creating deployment, pin to top. + if (!a.name) return -1 + if (!b.name) return 1 + // Ensure pinned deployment is first element in list. + if (b.id === pinnedDeploymentId) return 1 + if (a.id === pinnedDeploymentId) return -1 + // Otherwise, sort by most recent last deployed date and then most recent + // created date (ensuring deployments never deployed show up at end of + // list). + // TODO: Refactor to allow for sorting on multiple fields? This may be + // overkill for deployments. + const aValue = a.lastDeployed || a.dateCreated + const bValue = b.lastDeployed || b.dateCreated + if (b.lastDeployed && !a.lastDeployed) return 1 + else if (a.lastDeployed && !b.lastDeployed) return -1 + return bValue - aValue +} From 9b0ee1a9c08c636aaf8d318f134d5d2ebb592aae Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 17 Feb 2021 16:17:49 -0500 Subject: [PATCH 093/553] refactor(deployment): move deployment files into subdir --- .../CurrentDeploymentPanel.js | 10 +++---- .../DeploymentConfirmModal.js | 12 ++++---- .../DeploymentPreviewButton.js | 2 +- .../{ => deployment}/DeploymentSettings.js | 14 +++++----- .../DeploymentVersionsTable.js | 12 ++++---- .../{ => deployment}/DeploymentViewer.js | 28 +++++++++---------- .../{ => deployment}/DeploymentsPanel.js | 24 ++++++++-------- 7 files changed, 51 insertions(+), 51 deletions(-) rename lib/manager/components/{ => deployment}/CurrentDeploymentPanel.js (96%) rename lib/manager/components/{ => deployment}/DeploymentConfirmModal.js (95%) rename lib/manager/components/{ => deployment}/DeploymentPreviewButton.js (98%) rename lib/manager/components/{ => deployment}/DeploymentSettings.js (96%) rename lib/manager/components/{ => deployment}/DeploymentVersionsTable.js (94%) rename lib/manager/components/{ => deployment}/DeploymentViewer.js (97%) rename lib/manager/components/{ => deployment}/DeploymentsPanel.js (92%) diff --git a/lib/manager/components/CurrentDeploymentPanel.js b/lib/manager/components/deployment/CurrentDeploymentPanel.js similarity index 96% rename from lib/manager/components/CurrentDeploymentPanel.js rename to lib/manager/components/deployment/CurrentDeploymentPanel.js index 474144784..3f4f9bd47 100644 --- a/lib/manager/components/CurrentDeploymentPanel.js +++ b/lib/manager/components/deployment/CurrentDeploymentPanel.js @@ -9,11 +9,11 @@ import { Label as BsLabel } from 'react-bootstrap' -import * as deploymentActions from '../actions/deployments' -import { formatTimestamp } from '../../common/util/date-time' -import { getActiveInstanceCount, getServerForId } from '../util/deployment' +import * as deploymentActions from '../../actions/deployments' +import { formatTimestamp } from '../../../common/util/date-time' +import { getActiveInstanceCount, getServerForId } from '../../util/deployment' import DeploymentPreviewButton from './DeploymentPreviewButton' -import EC2InstanceCard from '../../common/components/EC2InstanceCard' +import EC2InstanceCard from '../../../common/components/EC2InstanceCard' import type { Deployment, @@ -22,7 +22,7 @@ import type { OtpServer, Project, ServerJob -} from '../../types' +} from '../../../types' type Props = { deployJobs: Array, diff --git a/lib/manager/components/DeploymentConfirmModal.js b/lib/manager/components/deployment/DeploymentConfirmModal.js similarity index 95% rename from lib/manager/components/DeploymentConfirmModal.js rename to lib/manager/components/deployment/DeploymentConfirmModal.js index 6b273ef99..c873f073a 100644 --- a/lib/manager/components/DeploymentConfirmModal.js +++ b/lib/manager/components/deployment/DeploymentConfirmModal.js @@ -4,15 +4,15 @@ import React, {Component, type Node} from 'react' import {Alert as BootstrapAlert, Button, Glyphicon, Modal} from 'react-bootstrap' import {Map, TileLayer, Rectangle} from 'react-leaflet' -import * as deploymentActions from '../actions/deployments' -import {getComponentMessages} from '../../common/util/config' -import {defaultTileLayerProps} from '../../common/util/maps' -import {getServerForId} from '../util/deployment' -import {getFeedNames, versionHasExpired} from '../util/version' +import * as deploymentActions from '../../actions/deployments' +import {getComponentMessages} from '../../../common/util/config' +import {defaultTileLayerProps} from '../../../common/util/maps' +import {getServerForId} from '../../util/deployment' +import {getFeedNames, versionHasExpired} from '../../util/version' import polygon from 'turf-polygon' import area from '@turf/area' -import type {Deployment, Project, SummarizedFeedVersion} from '../../types' +import type {Deployment, Project, SummarizedFeedVersion} from '../../../types' type Props = { deployToTarget: typeof deploymentActions.deployToTarget, diff --git a/lib/manager/components/DeploymentPreviewButton.js b/lib/manager/components/deployment/DeploymentPreviewButton.js similarity index 98% rename from lib/manager/components/DeploymentPreviewButton.js rename to lib/manager/components/deployment/DeploymentPreviewButton.js index 0e62ce2f7..a21a11f09 100644 --- a/lib/manager/components/DeploymentPreviewButton.js +++ b/lib/manager/components/deployment/DeploymentPreviewButton.js @@ -4,7 +4,7 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import {Button, Tooltip, OverlayTrigger} from 'react-bootstrap' -import type {Deployment, Project} from '../../types' +import type {Deployment, Project} from '../../../types' type Props = { deployment: Deployment, diff --git a/lib/manager/components/DeploymentSettings.js b/lib/manager/components/deployment/DeploymentSettings.js similarity index 96% rename from lib/manager/components/DeploymentSettings.js rename to lib/manager/components/deployment/DeploymentSettings.js index 61be630f2..e711ae041 100644 --- a/lib/manager/components/DeploymentSettings.js +++ b/lib/manager/components/deployment/DeploymentSettings.js @@ -9,14 +9,14 @@ import {shallowEqual} from 'react-pure-render' import {withRouter} from 'react-router' import {LinkContainer} from 'react-router-bootstrap' -import FormInput from '../../common/components/FormInput' -import {getComponentMessages} from '../../common/util/config' -import CollapsiblePanel from './CollapsiblePanel' -import {parseBounds} from '../util' -import {FIELDS, SERVER_FIELDS, UPDATER_FIELDS} from '../util/deployment' +import FormInput from '../../../common/components/FormInput' +import {getComponentMessages} from '../../../common/util/config' +import CollapsiblePanel from '../CollapsiblePanel' +import {parseBounds} from '../../util' +import {FIELDS, SERVER_FIELDS, UPDATER_FIELDS} from '../../util/deployment' -import {updateProject} from '../actions/projects' -import type {Project} from '../../types' +import {updateProject} from '../../actions/projects' +import type {Project} from '../../../types' type Props = { editDisabled: boolean, diff --git a/lib/manager/components/DeploymentVersionsTable.js b/lib/manager/components/deployment/DeploymentVersionsTable.js similarity index 94% rename from lib/manager/components/DeploymentVersionsTable.js rename to lib/manager/components/deployment/DeploymentVersionsTable.js index 581b199c3..2ebb0d87a 100644 --- a/lib/manager/components/DeploymentVersionsTable.js +++ b/lib/manager/components/deployment/DeploymentVersionsTable.js @@ -4,13 +4,13 @@ import React, {Component} from 'react' import {Table, Button, Badge, Glyphicon, ButtonToolbar} from 'react-bootstrap' import { Link } from 'react-router' -import * as deploymentActions from '../actions/deployments' -import {getComponentMessages} from '../../common/util/config' -import {formatTimestamp, fromNow} from '../../common/util/date-time' -import {versionHasExpired, versionHasNotBegun} from '../util/version' +import * as deploymentActions from '../../actions/deployments' +import {getComponentMessages} from '../../../common/util/config' +import {formatTimestamp, fromNow} from '../../../common/util/date-time' +import {versionHasExpired, versionHasNotBegun} from '../../util/version' -import type {Deployment, Feed, Project, SummarizedFeedVersion} from '../../types' -import type {ManagerUserState} from '../../types/reducers' +import type {Deployment, Feed, Project, SummarizedFeedVersion} from '../../../types' +import type {ManagerUserState} from '../../../types/reducers' type Props = { deleteFeedVersion: typeof deploymentActions.deleteFeedVersion, diff --git a/lib/manager/components/DeploymentViewer.js b/lib/manager/components/deployment/DeploymentViewer.js similarity index 97% rename from lib/manager/components/DeploymentViewer.js rename to lib/manager/components/deployment/DeploymentViewer.js index 5afbd37a4..b6f06cefd 100644 --- a/lib/manager/components/DeploymentViewer.js +++ b/lib/manager/components/deployment/DeploymentViewer.js @@ -28,30 +28,30 @@ import Select from 'react-select' import fetch from 'isomorphic-fetch' import validator from 'validator' -import * as deploymentActions from '../actions/deployments' -import Loading from '../../common/components/Loading' -import EditableTextField from '../../common/components/EditableTextField' -import Title from '../../common/components/Title' -import WatchButton from '../../common/containers/WatchButton' -import {getComponentMessages, getConfigProperty} from '../../common/util/config' -import {formatTimestamp, fromNow} from '../../common/util/date-time' -import {isValidJSONC} from '../../common/util/json' -import {defaultTileLayerProps} from '../../common/util/maps' -import { versionsSorter } from '../../common/util/util' -import {getServerDeployedTo} from '../util/deployment' +import * as deploymentActions from '../../actions/deployments' +import Loading from '../../../common/components/Loading' +import EditableTextField from '../../../common/components/EditableTextField' +import Title from '../../../common/components/Title' +import WatchButton from '../../../common/containers/WatchButton' +import {getComponentMessages, getConfigProperty} from '../../../common/util/config' +import {formatTimestamp, fromNow} from '../../../common/util/date-time' +import {isValidJSONC} from '../../../common/util/json' +import {defaultTileLayerProps} from '../../../common/util/maps' +import { versionsSorter } from '../../../common/util/util' +import {getServerDeployedTo} from '../../util/deployment' import CurrentDeploymentPanel from './CurrentDeploymentPanel' import DeploymentConfirmModal from './DeploymentConfirmModal' import DeploymentVersionsTable from './DeploymentVersionsTable' -import type {Props as ContainerProps} from '../containers/ActiveDeploymentViewer' +import type {Props as ContainerProps} from '../../containers/ActiveDeploymentViewer' import type { CustomFile, Deployment, ReactSelectOption, ServerJob, SummarizedFeedVersion -} from '../../types' -import type {ManagerUserState} from '../../types/reducers' +} from '../../../types' +import type {ManagerUserState} from '../../../types/reducers' type Props = ContainerProps & { addFeedVersion: typeof deploymentActions.addFeedVersion, diff --git a/lib/manager/components/DeploymentsPanel.js b/lib/manager/components/deployment/DeploymentsPanel.js similarity index 92% rename from lib/manager/components/DeploymentsPanel.js rename to lib/manager/components/deployment/DeploymentsPanel.js index ce4b8bc53..a3486862a 100644 --- a/lib/manager/components/DeploymentsPanel.js +++ b/lib/manager/components/deployment/DeploymentsPanel.js @@ -15,19 +15,19 @@ import { Panel } from 'react-bootstrap' -import * as deploymentActions from '../actions/deployments' -import * as feedsActions from '../actions/feeds' -import * as projectsActions from '../actions/projects' -import ActiveDeploymentViewer from '../containers/ActiveDeploymentViewer' -import ConfirmModal from '../../common/components/ConfirmModal' -import EditableTextField from '../../common/components/EditableTextField' -import Loading from '../../common/components/Loading' -import {getComponentMessages} from '../../common/util/config' -import {formatTimestamp, fromNow} from '../../common/util/date-time' -import {getServerDeployedTo} from '../util/deployment' +import * as deploymentActions from '../../actions/deployments' +import * as feedsActions from '../../actions/feeds' +import * as projectsActions from '../../actions/projects' +import ActiveDeploymentViewer from '../../containers/ActiveDeploymentViewer' +import ConfirmModal from '../../../common/components/ConfirmModal' +import EditableTextField from '../../../common/components/EditableTextField' +import Loading from '../../../common/components/Loading' +import {getComponentMessages} from '../../../common/util/config' +import {formatTimestamp, fromNow} from '../../../common/util/date-time' +import {getServerDeployedTo} from '../../util/deployment' -import type {Props as ContainerProps} from '../containers/DeploymentsPanel' -import type {Deployment, Project} from '../../types' +import type {Props as ContainerProps} from '../../containers/DeploymentsPanel' +import type {Deployment, Project} from '../../../types' type Props = ContainerProps & { createDeployment: typeof deploymentActions.createDeployment, From f44179f90b400ebc2797a982553999c68872826a Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 17 Feb 2021 16:19:45 -0500 Subject: [PATCH 094/553] refactor(deployment): fix broken imports --- lib/manager/components/ProjectSettings.js | 2 +- lib/manager/components/version/FeedVersionNavigator.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/manager/components/ProjectSettings.js b/lib/manager/components/ProjectSettings.js index 7862fa453..b810a9578 100644 --- a/lib/manager/components/ProjectSettings.js +++ b/lib/manager/components/ProjectSettings.js @@ -6,7 +6,7 @@ import {LinkContainer} from 'react-router-bootstrap' import {deleteProject, updateProject} from '../actions/projects' import {getComponentMessages, isModuleEnabled} from '../../common/util/config' -import DeploymentSettings from './DeploymentSettings' +import DeploymentSettings from './deployment/DeploymentSettings' import ProjectSettingsForm from './ProjectSettingsForm' import type {Project} from '../../types' diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 5342d1ea8..a05c960b7 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -16,7 +16,7 @@ import {isValidZipFile} from '../../../common/util/util' import * as snapshotActions from '../../../editor/actions/snapshots' import * as gtfsPlusActions from '../../../gtfsplus/actions/gtfsplus' import * as deploymentActions from '../../../manager/actions/deployments' -import DeploymentPreviewButton from '../DeploymentPreviewButton' +import DeploymentPreviewButton from '../deployment/DeploymentPreviewButton' import FeedVersionViewer from './FeedVersionViewer' import VersionSelectorDropdown from './VersionSelectorDropdown' From c578dcdd7766c6a1455944995813e2b3a27f4353 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 17 Feb 2021 17:42:31 -0500 Subject: [PATCH 095/553] refactor(DeploymentViewer): break out components, refactor custom file toolbar --- .../components/deployment/CustomConfig.js | 124 ++++ .../components/deployment/CustomFileEditor.js | 256 ++++++++ .../DeploymentConfigurationsPanel.js | 280 +++++++++ .../components/deployment/DeploymentViewer.js | 569 +----------------- 4 files changed, 666 insertions(+), 563 deletions(-) create mode 100644 lib/manager/components/deployment/CustomConfig.js create mode 100644 lib/manager/components/deployment/CustomFileEditor.js create mode 100644 lib/manager/components/deployment/DeploymentConfigurationsPanel.js diff --git a/lib/manager/components/deployment/CustomConfig.js b/lib/manager/components/deployment/CustomConfig.js new file mode 100644 index 000000000..b7ad588e9 --- /dev/null +++ b/lib/manager/components/deployment/CustomConfig.js @@ -0,0 +1,124 @@ +// @flow + +import Icon from '@conveyal/woonerf/components/icon' +import React, {Component} from 'react' +import { + Button, + FormControl, + FormGroup, + HelpBlock, + Radio +} from 'react-bootstrap' +import { LinkContainer } from 'react-router-bootstrap' + +import * as deploymentActions from '../../actions/deployments' +import {isValidJSONC} from '../../../common/util/json' + +import type { + Deployment +} from '../../../types' + +const SAMPLE_BUILD_CONFIG = `{ + "subwayAccessTime": 2.5 +}` + +const SAMPLE_ROUTER_CONFIG = `{ + "routingDefaults": { + "walkSpeed": 2.0, + "stairsReluctance": 4.0, + "carDropoffTime": 240 + } +}` + +export default class CustomConfig extends Component<{ + deployment: Deployment, + label: string, + name: string, + updateDeployment: typeof deploymentActions.updateDeployment +}, {[string]: any}> { + state = {} + + _toggleCustomConfig = (evt: SyntheticInputEvent) => { + const {deployment, updateDeployment} = this.props + const {name} = evt.target + const value = deployment[name] + ? null + : name === 'customBuildConfig' + ? SAMPLE_BUILD_CONFIG + : SAMPLE_ROUTER_CONFIG + updateDeployment(deployment, {[name]: value}) + } + + _onChangeConfig = (evt: SyntheticInputEvent) => + this.setState({[this.props.name]: evt.target.value}) + + _onSaveConfig = () => { + const {deployment, name, updateDeployment} = this.props + const value = this.state[name] + if (!isValidJSONC(value)) return window.alert('Must provide valid JSON string.') + else { + updateDeployment(deployment, {[name]: value}) + this.setState({[name]: undefined}) + } + } + + render () { + const {deployment, name, label} = this.props + const useCustom = deployment[name] !== null + const value = this.state[name] || deployment[name] + const validJSON = isValidJSONC(value) + return ( +
    +
    {label} configuration
    + + + Project default + + + Custom + + +

    + {useCustom + ? `Use custom JSON defined below for ${label} configuration.` + : `Use the ${label} configuration defined in the project deployment settings.` + } + {' '} + {useCustom + ? + : + + + } + +

    + {useCustom && + + + {!validJSON && Must provide valid JSON string.} + + } +
    + ) + } +} diff --git a/lib/manager/components/deployment/CustomFileEditor.js b/lib/manager/components/deployment/CustomFileEditor.js new file mode 100644 index 000000000..a7ca365e9 --- /dev/null +++ b/lib/manager/components/deployment/CustomFileEditor.js @@ -0,0 +1,256 @@ +// @flow + +import React, {Component} from 'react' +import { + Button, + ButtonToolbar, + Checkbox, + ControlLabel, + FormControl, + FormGroup, + HelpBlock +} from 'react-bootstrap' + +import type { + CustomFile +} from '../../../types' + +type Props = { + customFile: CustomFile, + customFileEditIdx: null | number, + idx: number, + onCancelEditing: () => void, + onDelete: (number) => void, + onEdit: (number) => void, + onSave: (number, CustomFile) => void +} + +export default class CustomFileEditor extends Component { + constructor (props: Props) { + super(props) + const { customFile } = props + this.state = { + fileSource: customFile.contents ? 'raw' : 'uri', + model: props.customFile + } + } + + _canEdit = () => this.props.customFileEditIdx === null + + _isEditing= () => this.props.idx === this.props.customFileEditIdx + + _isValid = () => { + const {model: customFile} = this.state + return customFile.contents || customFile.uri + } + + _onChangeBuildUse = () => { + const { model } = this.state + this.setState({ + model: { + ...model, + useDuringBuild: !model.useDuringBuild + } + }) + } + + _onChangeContents = (evt: SyntheticInputEvent) => { + this.setState({ + model: { + ...this.state.model, + contents: evt.target.value + } + }) + } + + _onChangeFilename = (evt: SyntheticInputEvent) => { + this.setState({ + model: { + ...this.state.model, + filename: evt.target.value + } + }) + } + + _onChangeServeUse = () => { + const { model } = this.state + this.setState({ + model: { + ...model, + useDuringServe: !model.useDuringServe + } + }) + } + + _onChangeSource = (evt: SyntheticInputEvent) => { + const model = {...this.state.model} + // set variable to make flow happy + let newSource + if (evt.target.value === 'raw') { + model.uri = null + newSource = 'raw' + } else { + model.contents = null + newSource = 'uri' + } + this.setState({ + fileSource: newSource, + model + }) + } + + _onChangeUri = (evt: SyntheticInputEvent) => { + this.setState({ + model: { + ...this.state.model, + uri: evt.target.value + } + }) + } + + _onCancelEditing = () => { + const { customFile, onCancelEditing } = this.props + this.setState({ + fileSource: customFile.contents ? 'raw' : 'uri', + model: customFile + }) + onCancelEditing() + } + + _onDelete = () => { + const { idx, onDelete } = this.props + onDelete(idx) + } + + _onEdit = () => { + const { idx, onEdit } = this.props + onEdit(idx) + } + + _onSave = () => { + const { idx, onSave } = this.props + onSave(idx, this.state.model) + } + + _renderToolbar = () => { + const isEditing = this._isEditing() + const canEdit = this._canEdit() + const either = !isEditing && !canEdit + return ( + + + {isEditing && + + } + + + ) + } + + render () { + const { + fileSource, + model: customFile + } = this.state + const isValid = this._isValid() + const isEditing = this._isEditing() + return ( +
    + {this._renderToolbar()} +
    + {isEditing + ? + : + Filename:{' '} + + {/* FIXME: what should the behavior be here if missing */} + {customFile.filename || '[defaults to URI]'} + + + } +
    + + Use during graph build + + + Use while running server + + + File source + + + + + {!isValid && Please set contents or uri!} + {fileSource === 'raw' && ( + + )} + {fileSource === 'uri' && ( + + + {!customFile.uri && ( + Enter either a HTTP(S) URL or AWS S3 URI + )} + + )} + +
    + ) + } +} diff --git a/lib/manager/components/deployment/DeploymentConfigurationsPanel.js b/lib/manager/components/deployment/DeploymentConfigurationsPanel.js new file mode 100644 index 000000000..dddbb1dd8 --- /dev/null +++ b/lib/manager/components/deployment/DeploymentConfigurationsPanel.js @@ -0,0 +1,280 @@ +// @flow + +import Icon from '@conveyal/woonerf/components/icon' +import fetch from 'isomorphic-fetch' +import React, {Component} from 'react' +import { + Checkbox, + ControlLabel, + ListGroup, + ListGroupItem, + Button, + Panel, + Glyphicon +} from 'react-bootstrap' +import Select from 'react-select' +import validator from 'validator' + +import * as deploymentActions from '../../actions/deployments' +import {getConfigProperty} from '../../../common/util/config' +import CustomConfig from './CustomConfig' +import CustomFileEditor from './CustomFileEditor' + +import type { + CustomFile, + Deployment, + ReactSelectOption +} from '../../../types' + +const TRIP_PLANNER_VERSIONS = [ + { label: 'OTP 1.X', value: 'OTP_1' }, + { label: 'OTP 2.X', value: 'OTP_2' } +] + +export default class DeploymentConfigurationsPanel extends Component<{ + deployment: Deployment, + updateDeployment: typeof deploymentActions.updateDeployment +}, { + customFileEditIdx: null | number, + otp: Array, +}> { + state = { + customFileEditIdx: null, + otp: [] + } + componentDidMount () { + // Fetch the available OTP versions from S3. + this._loadOptions() + } + + /** + * Parse .jar options from an S3 text XML response. + * @param {string} text text response from s3 + * @param {string} key state key under which to store options + */ + _parseOptionsFromXml = (text: string) => { + const parser = new window.DOMParser() + const doc = parser.parseFromString(text, 'application/xml') + + const all = Array.from(doc.querySelectorAll('Contents')) + .map(item => item.querySelector('Key').childNodes[0].nodeValue) // get just key + .filter(item => item !== 'index.html') // don't include the main page + .map(item => item.replace(/.jar$/, '')) // and remove .jar + this.setState({otp: all}) + } + + _loadAndParseOptionsFromXml = (url: string) => { + fetch(url) + .then(res => res.text()) + .then(text => this._parseOptionsFromXml(text)) + } + + /** + * Load .jar options from OTP and R5 S3 buckets. + */ + _loadOptions = () => { + const otpUrl = getConfigProperty('modules.deployment.otp_download_url') || 'https://opentripplanner-builds.s3.amazonaws.com' + this._loadAndParseOptionsFromXml(otpUrl) + } + + _onAddCustomFile = () => { + const { deployment } = this.props + const customFiles = deployment.customFiles + ? [...deployment.customFiles, {}] + : [{}] + this._updateDeployment({ customFiles }) + this.setState({ customFileEditIdx: customFiles.length - 1 }) + } + + _onChangeBuildGraphOnly = () => this._updateDeployment({buildGraphOnly: !this.props.deployment.buildGraphOnly}) + + _onChangeSkipOsmExtract = () => { + const {skipOsmExtract} = this.props.deployment + if (!skipOsmExtract) { + // If changing from including OSM to skipping OSM, verify that this is + // intentional. + if (!window.confirm('Are you sure you want to exclude an OSM extract from the graph build? This will prevent the use of the OSM street network in routing results.')) { + return + } + } + this._updateDeployment({skipOsmExtract: !skipOsmExtract}) + } + + _onCancelEditingCustomFile = () => { + this.setState({ customFileEditIdx: null }) + } + + _onEditCustomFile = (idx: number) => { + this.setState({ customFileEditIdx: idx }) + } + + _onDeleteCustomFile = (idx: number) => { + const { deployment } = this.props + const customFiles = [...deployment.customFiles || []] + customFiles.splice(idx, 1) + this._updateDeployment({ customFiles }) + this.setState({ customFileEditIdx: null }) + } + + _onSaveCustomFile = (idx: number, data: CustomFile) => { + const { deployment } = this.props + const customFiles = [...deployment.customFiles || []] + customFiles[idx] = data + this._updateDeployment({ customFiles }) + this.setState({ customFileEditIdx: null }) + } + + _setOsmUrl = () => { + const currentUrl = this.props.deployment.osmExtractUrl || '' + const osmExtractUrl = window.prompt( + 'Please provide a public URL from which to download an OSM extract (.pbf).', + currentUrl + ) + if (osmExtractUrl) { + if (!validator.isURL(osmExtractUrl)) { + window.alert(`URL ${osmExtractUrl} is invalid!`) + return + } + this._updateDeployment({osmExtractUrl}) + } + } + + _clearOsmUrl = () => this._updateDeployment({osmExtractUrl: null}) + + _onUpdateTripPlannerVersion = (option: ReactSelectOption) => { + const {deployment, updateDeployment} = this.props + updateDeployment(deployment, { tripPlannerVersion: option.value }) + } + + _onUpdateVersion = (option: ReactSelectOption) => { + this._updateDeployment({otpVersion: option.value}) + } + + _updateDeployment = (props: {[string]: any}) => { + const {deployment, updateDeployment} = this.props + updateDeployment(deployment, props) + } + + render () { + const { deployment, updateDeployment } = this.props + const { customFileEditIdx, otp: options } = this.state + const isOtp = deployment.tripPlannerVersion.startsWith('OTP_') + + return ( + OTP Configuration}> + + + + Build graph only + + Trip Planner Version: + ({value: v, label: v})) : []} + /> +
    + )} + + + Deploying to the{' '} + {deployment.routerId || 'default'}{' '} + OpenTripPlanner router. + + + OpenStreetMap Settings + + Build graph with OSM extract + + {/* Hide URL/auto-extract if skipping OSM extract. */} + {deployment.skipOsmExtract + ? null + : deployment.osmExtractUrl + ?
    + + URL: + + + {deployment.osmExtractUrl} + + + +
    + :
    + Auto-extract OSM (N. America only) + +
    + } +
    + + + + + + + +
    Custom Files
    + {deployment.customFiles && deployment.customFiles.map( + (customFile, idx) => ( + + ) + )} + +
    + + + ) + } +} diff --git a/lib/manager/components/deployment/DeploymentViewer.js b/lib/manager/components/deployment/DeploymentViewer.js index b6f06cefd..5c89f2d25 100644 --- a/lib/manager/components/deployment/DeploymentViewer.js +++ b/lib/manager/components/deployment/DeploymentViewer.js @@ -4,12 +4,8 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' import { LinkContainer } from 'react-router-bootstrap' import { - Checkbox, - ControlLabel, - Radio, FormGroup, InputGroup, - HelpBlock, ListGroup, ListGroupItem, Row, @@ -24,9 +20,6 @@ import { MenuItem } from 'react-bootstrap' import {Map, TileLayer, Rectangle} from 'react-leaflet' -import Select from 'react-select' -import fetch from 'isomorphic-fetch' -import validator from 'validator' import * as deploymentActions from '../../actions/deployments' import Loading from '../../../common/components/Loading' @@ -35,19 +28,16 @@ import Title from '../../../common/components/Title' import WatchButton from '../../../common/containers/WatchButton' import {getComponentMessages, getConfigProperty} from '../../../common/util/config' import {formatTimestamp, fromNow} from '../../../common/util/date-time' -import {isValidJSONC} from '../../../common/util/json' import {defaultTileLayerProps} from '../../../common/util/maps' import { versionsSorter } from '../../../common/util/util' import {getServerDeployedTo} from '../../util/deployment' import CurrentDeploymentPanel from './CurrentDeploymentPanel' +import DeploymentConfigurationsPanel from './DeploymentConfigurationsPanel' import DeploymentConfirmModal from './DeploymentConfirmModal' import DeploymentVersionsTable from './DeploymentVersionsTable' import type {Props as ContainerProps} from '../../containers/ActiveDeploymentViewer' import type { - CustomFile, - Deployment, - ReactSelectOption, ServerJob, SummarizedFeedVersion } from '../../../types' @@ -68,35 +58,15 @@ type Props = ContainerProps & { } type State = { - customFileEditIdx: null | number, - otp: Array, searchText: ?string, target: ?string } const BOUNDS_LIMIT = 10 // Limit for the decimal degrees span -const SAMPLE_BUILD_CONFIG = `{ - "subwayAccessTime": 2.5 -}` - -const SAMPLE_ROUTER_CONFIG = `{ - "routingDefaults": { - "walkSpeed": 2.0, - "stairsReluctance": 4.0, - "carDropoffTime": 240 - } -}` - -const TRIP_PLANNER_VERSIONS = [ - { label: 'OTP 1.X', value: 'OTP_1' }, - { label: 'OTP 2.X', value: 'OTP_2' } -] - export default class DeploymentViewer extends Component { messages = getComponentMessages('DeploymentViewer') state = { - customFileEditIdx: null, otp: [], searchText: null, target: null @@ -104,8 +74,6 @@ export default class DeploymentViewer extends Component { componentDidMount () { this.resetMap() - // Fetch the available OTP and R5 build versions from S3. - this._loadOptions() } /** @@ -129,45 +97,6 @@ export default class DeploymentViewer extends Component { return [[north, east], [south, west]] } - /** - * Parse .jar options from an S3 text XML response. - * @param {string} text text response from s3 - * @param {string} key state key under which to store options - */ - _parseOptionsFromXml = (text: string) => { - const parser = new window.DOMParser() - const doc = parser.parseFromString(text, 'application/xml') - - const all = Array.from(doc.querySelectorAll('Contents')) - .map(item => item.querySelector('Key').childNodes[0].nodeValue) // get just key - .filter(item => item !== 'index.html') // don't include the main page - .map(item => item.replace(/.jar$/, '')) // and remove .jar - this.setState({otp: all}) - } - - _loadAndParseOptionsFromXml = (url: string) => { - fetch(url) - .then(res => res.text()) - .then(text => this._parseOptionsFromXml(text)) - } - - /** - * Load .jar options from OTP and R5 S3 buckets. - */ - _loadOptions = () => { - const otpUrl = getConfigProperty('modules.deployment.otp_download_url') || 'https://opentripplanner-builds.s3.amazonaws.com' - this._loadAndParseOptionsFromXml(otpUrl) - } - - _onAddCustomFile = () => { - const { deployment } = this.props - const customFiles = deployment.customFiles - ? [...deployment.customFiles, {}] - : [{}] - this._updateDeployment({ customFiles }) - this.setState({ customFileEditIdx: customFiles.length - 1 }) - } - _onAddFeedSource = (feedSourceId: string) => { const feed = this.props.feedSources.find(fs => fs.id === feedSourceId) const id = feed && feed.latestVersionId @@ -183,75 +112,12 @@ export default class DeploymentViewer extends Component { _onChangeName = (name: string) => this._updateDeployment({name}) - _onChangeBuildGraphOnly = () => this._updateDeployment({buildGraphOnly: !this.props.deployment.buildGraphOnly}) - - _onChangeSkipOsmExtract = () => { - const {skipOsmExtract} = this.props.deployment - if (!skipOsmExtract) { - // If changing from including OSM to skipping OSM, verify that this is - // intentional. - if (!window.confirm('Are you sure you want to exclude an OSM extract from the graph build? This will prevent the use of the OSM street network in routing results.')) { - return - } - } - this._updateDeployment({skipOsmExtract: !skipOsmExtract}) - } - _onClickDownload = () => this.props.downloadDeployment(this.props.deployment) _onCloseModal = () => this.setState({target: null}) - _onCancelEditingCustomFile = () => { - this.setState({ customFileEditIdx: null }) - } - - _onEditCustomFile = (idx: number) => { - this.setState({ customFileEditIdx: idx }) - } - - _onDeleteCustomFile = (idx: number) => { - const { deployment } = this.props - const customFiles = [...deployment.customFiles || []] - customFiles.splice(idx, 1) - this._updateDeployment({ customFiles }) - } - - _onSaveCustomFile = (idx: number, data: CustomFile) => { - const { deployment } = this.props - const customFiles = [...deployment.customFiles || []] - customFiles[idx] = data - this._updateDeployment({ customFiles }) - this.setState({ customFileEditIdx: null }) - } - - _setOsmUrl = () => { - const currentUrl = this.props.deployment.osmExtractUrl || '' - const osmExtractUrl = window.prompt( - 'Please provide a public URL from which to download an OSM extract (.pbf).', - currentUrl - ) - if (osmExtractUrl) { - if (!validator.isURL(osmExtractUrl)) { - window.alert(`URL ${osmExtractUrl} is invalid!`) - return - } - this._updateDeployment({osmExtractUrl}) - } - } - - _clearOsmUrl = () => this._updateDeployment({osmExtractUrl: null}) - _onSelectTarget = (target: string) => this.setState({target}) - _onUpdateTripPlannerVersion = (option: ReactSelectOption) => { - const {deployment, updateDeployment} = this.props - updateDeployment(deployment, { tripPlannerVersion: option.value }) - } - - _onUpdateVersion = (option: ReactSelectOption) => { - this._updateDeployment({otpVersion: option.value}) - } - _updateDeployment = (props: {[string]: any}) => { const {deployment, updateDeployment} = this.props updateDeployment(deployment, props) @@ -438,138 +304,6 @@ export default class DeploymentViewer extends Component { ) } - renderConfigurationsPanel () { - const { deployment, updateDeployment } = this.props - const options = this.state.otp - const isOtp = deployment.tripPlannerVersion.startsWith('OTP_') - - return ( - OTP Configuration}> - - - - Build graph only - - Trip Planner Version: - ({value: v, label: v})) : []} - /> -
    - )} - - - Deploying to the{' '} - {deployment.routerId || 'default'}{' '} - OpenTripPlanner router. - - - OpenStreetMap Settings - - Build graph with OSM extract - - {/* Hide URL/auto-extract if skipping OSM extract. */} - {deployment.skipOsmExtract - ? null - : deployment.osmExtractUrl - ?
    - - URL: - - - {deployment.osmExtractUrl} - - - -
    - :
    - Auto-extract OSM (N. America only) - -
    - } -
    - - - - - - - {this.renderCustomFiles()} - - - ) - } - - renderCustomFiles = () => { - const { deployment } = this.props - const { customFileEditIdx } = this.state - - return ( - -
    Custom Files
    - {deployment.customFiles && deployment.customFiles.map( - (customFile, idx) => ( - - ) - )} - -
    - ) - } - render () { const { deleteFeedVersion, @@ -578,6 +312,7 @@ export default class DeploymentViewer extends Component { deployToTarget, feedSources, project, + updateDeployment, updateVersionForFeedSource, user } = this.props @@ -648,305 +383,13 @@ export default class DeploymentViewer extends Component { server={serverDeployedTo} terminateEC2InstanceForDeployment={this.props.terminateEC2InstanceForDeployment} /> {/* Configurations panel */} - {this.renderConfigurationsPanel()} +
    ) } } - -class CustomConfig extends Component<{ - deployment: Deployment, - label: string, - name: string, - updateDeployment: typeof deploymentActions.updateDeployment -}, {[string]: any}> { - state = {} - - _toggleCustomConfig = (evt: SyntheticInputEvent) => { - const {deployment, updateDeployment} = this.props - const {name} = evt.target - const value = deployment[name] - ? null - : name === 'customBuildConfig' - ? SAMPLE_BUILD_CONFIG - : SAMPLE_ROUTER_CONFIG - updateDeployment(deployment, {[name]: value}) - } - - _onChangeConfig = (evt: SyntheticInputEvent) => - this.setState({[this.props.name]: evt.target.value}) - - _onSaveConfig = () => { - const {deployment, name, updateDeployment} = this.props - const value = this.state[name] - if (!isValidJSONC(value)) return window.alert('Must provide valid JSON string.') - else { - updateDeployment(deployment, {[name]: value}) - this.setState({[name]: undefined}) - } - } - - render () { - const {deployment, name, label} = this.props - const useCustom = deployment[name] !== null - const value = this.state[name] || deployment[name] - const validJSON = isValidJSONC(value) - return ( -
    -
    {label} configuration
    - - - Project default - - - Custom - - -

    - {useCustom - ? `Use custom JSON defined below for ${label} configuration.` - : `Use the ${label} configuration defined in the project deployment settings.` - } - {' '} - {useCustom - ? - : - - - } - -

    - {useCustom && - - - {!validJSON && Must provide valid JSON string.} - - } -
    - ) - } -} - -class CustomFileEditor extends Component<{ - customFile: CustomFile, - customFileEditIdx: null | number, - idx: number, - onCancelEditing: () => void, - onDelete: (number) => void, - onEdit: (number) => void, - onSave: (number, CustomFile) => void -}, { - fileSource: 'raw' | 'uri', - model: CustomFile -}> { - constructor (props) { - super(props) - const { customFile } = props - this.state = { - fileSource: customFile.contents ? 'raw' : 'uri', - model: props.customFile - } - } - - _onChangeBuildUse = () => { - const { model } = this.state - this.setState({ - model: { - ...model, - useDuringBuild: !model.useDuringBuild - } - }) - } - - _onChangeContents = (evt: SyntheticInputEvent) => { - this.setState({ - model: { - ...this.state.model, - contents: evt.target.value - } - }) - } - - _onChangeFilename = (evt: SyntheticInputEvent) => { - this.setState({ - model: { - ...this.state.model, - filename: evt.target.value - } - }) - } - - _onChangeServeUse = () => { - const { model } = this.state - this.setState({ - model: { - ...model, - useDuringServe: !model.useDuringServe - } - }) - } - - _onChangeSource = (evt: SyntheticInputEvent) => { - const model = {...this.state.model} - // set variable to make flow happy - let newSource - if (evt.target.value === 'raw') { - model.uri = null - newSource = 'raw' - } else { - model.contents = null - newSource = 'uri' - } - this.setState({ - fileSource: newSource, - model - }) - } - - _onChangeUri = (evt: SyntheticInputEvent) => { - this.setState({ - model: { - ...this.state.model, - uri: evt.target.value - } - }) - } - - _onCancelEditing = () => { - const { customFile, onCancelEditing } = this.props - this.setState({ - fileSource: customFile.contents ? 'raw' : 'uri', - model: customFile - }) - onCancelEditing() - } - - _onDelete = () => { - const { idx, onDelete } = this.props - onDelete(idx) - } - - _onEdit = () => { - const { idx, onEdit } = this.props - onEdit(idx) - } - - _onSave = () => { - const { idx, onSave } = this.props - onSave(idx, this.state.model) - } - - render () { - const { - customFileEditIdx, - idx - } = this.props - const { - fileSource, - model: customFile - } = this.state - const isValid = customFile.contents || customFile.uri - const isEditing = idx === customFileEditIdx - const canEdit = customFileEditIdx === null - - return ( -
    - - {isEditing && ( - - )} - {isEditing && } - {canEdit && } - {canEdit && } - - - - Use during graph build - - - Use while running server - - - File source - - - - - {!isValid && Please set contents or uri!} - {fileSource === 'raw' && ( - - )} - {fileSource === 'uri' && ( - - - {!customFile.uri && ( - Enter either a HTTP(S) URL or AWS S3 URI - )} - - )} - -
    - ) - } -} From 75fecec584a3f15d9d2d159ae54ac06f839f6830 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 18 Feb 2021 09:12:04 -0500 Subject: [PATCH 096/553] refactor(DeploymentsPanel): fix imports --- lib/manager/containers/ActiveDeploymentViewer.js | 2 +- lib/manager/containers/DeploymentsPanel.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/manager/containers/ActiveDeploymentViewer.js b/lib/manager/containers/ActiveDeploymentViewer.js index ed0cda0b8..b9e497386 100644 --- a/lib/manager/containers/ActiveDeploymentViewer.js +++ b/lib/manager/containers/ActiveDeploymentViewer.js @@ -13,7 +13,7 @@ import { updateDeployment, updateVersionForFeedSource } from '../actions/deployments' -import DeploymentViewer from '../components/DeploymentViewer' +import DeploymentViewer from '../components/deployment/DeploymentViewer' import type {Deployment, Feed, Project} from '../../types' import type {AppState} from '../../types/reducers' diff --git a/lib/manager/containers/DeploymentsPanel.js b/lib/manager/containers/DeploymentsPanel.js index 9411b87ac..c3e99fbf1 100644 --- a/lib/manager/containers/DeploymentsPanel.js +++ b/lib/manager/containers/DeploymentsPanel.js @@ -11,7 +11,7 @@ import { deleteDeployment, updateDeployment } from '../actions/deployments' -import DeploymentsPanel from '../components/DeploymentsPanel' +import DeploymentsPanel from '../components/deployment/DeploymentsPanel' import type {Project} from '../../types' import type {AppState} from '../../types/reducers' From 005936664289bac5100d49d201d855be897a7623 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 18 Feb 2021 09:15:56 -0500 Subject: [PATCH 097/553] refactor(e2e): temporarily force e2e to true --- scripts/check-if-e2e-should-run-on-ci.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/check-if-e2e-should-run-on-ci.sh b/scripts/check-if-e2e-should-run-on-ci.sh index 077b46db9..437f8844d 100755 --- a/scripts/check-if-e2e-should-run-on-ci.sh +++ b/scripts/check-if-e2e-should-run-on-ci.sh @@ -16,5 +16,5 @@ if [[ "$SHOULD_RUN_E2E" != "true" ]]; then fi # FIXME: Re-enable e2e for conditions above. -echo "SHOULD_RUN_E2E=false" >> $GITHUB_ENV && export SHOULD_RUN_E2E=true -echo 'Overriding E2E. Temporarily forcing to be false...' +echo "SHOULD_RUN_E2E=true" >> $GITHUB_ENV && export SHOULD_RUN_E2E=true +echo 'Overriding E2E. Temporarily forcing to be true...' From 7fa5df2fc5dd98f85f3463cb42ad0d168bbbac4d Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 18 Feb 2021 09:39:40 -0500 Subject: [PATCH 098/553] ci(gh-actions): fix aws credentials script --- .github/workflows/node-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 50cddf3fa..3a678b0e8 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -73,7 +73,7 @@ jobs: mongodb-version: 4.2 - name: Add aws credentials for datatools-server if: env.SHOULD_RUN_E2E == 'true' - run: mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=${AWS_ACCESS_KEY_ID}' 'aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}' 'region=us-east-1' > ~/.aws/config; else mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=foo' 'aws_secret_access_key=bar' 'region=us-east-1' > ~/.aws/config + run: mkdir ~/.aws && printf '%s\n' '[default]' 'aws_access_key_id=${AWS_ACCESS_KEY_ID}' 'aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}' 'region=us-east-1' > ~/.aws/config - name: Run e2e tests if: env.SHOULD_RUN_E2E == 'true' run: yarn cover-end-to-end From 4f4ecb2c0828b1dfaf261aa447558a79913465e6 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 18 Feb 2021 09:57:33 -0500 Subject: [PATCH 099/553] ci(gh-actions): override e2e to be false --- scripts/check-if-e2e-should-run-on-ci.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/check-if-e2e-should-run-on-ci.sh b/scripts/check-if-e2e-should-run-on-ci.sh index 437f8844d..51eeb7d09 100755 --- a/scripts/check-if-e2e-should-run-on-ci.sh +++ b/scripts/check-if-e2e-should-run-on-ci.sh @@ -16,5 +16,6 @@ if [[ "$SHOULD_RUN_E2E" != "true" ]]; then fi # FIXME: Re-enable e2e for conditions above. -echo "SHOULD_RUN_E2E=true" >> $GITHUB_ENV && export SHOULD_RUN_E2E=true -echo 'Overriding E2E. Temporarily forcing to be true...' +OVERRIDE=false +echo "SHOULD_RUN_E2E=${OVERRIDE}" >> $GITHUB_ENV && export SHOULD_RUN_E2E=${OVERRIDE} +echo "Overriding E2E. Temporarily forcing to be ${OVERRIDE}..." From 34bbb8b64877752915faa4ead53c8e675f63b87c Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 19 Feb 2021 10:16:30 -0500 Subject: [PATCH 100/553] refactor: fix broken snapshots/flow --- .../__tests__/__snapshots__/projects.js.snap | 1 + lib/manager/components/DeploymentSettings.js | 2 - .../__snapshots__/ActiveProjectViewer.js.snap | 7 + .../__snapshots__/DeploymentsPanel.js.snap | 701 ++++++++++++++---- .../__snapshots__/FeedSourceTable.js.snap | 8 + yarn.lock | 522 ++----------- 6 files changed, 624 insertions(+), 617 deletions(-) diff --git a/lib/manager/actions/__tests__/__snapshots__/projects.js.snap b/lib/manager/actions/__tests__/__snapshots__/projects.js.snap index 6cee153b7..8385fd715 100644 --- a/lib/manager/actions/__tests__/__snapshots__/projects.js.snap +++ b/lib/manager/actions/__tests__/__snapshots__/projects.js.snap @@ -5,6 +5,7 @@ Object { "active": null, "all": Array [ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, diff --git a/lib/manager/components/DeploymentSettings.js b/lib/manager/components/DeploymentSettings.js index 501bf7de4..42ab973d9 100644 --- a/lib/manager/components/DeploymentSettings.js +++ b/lib/manager/components/DeploymentSettings.js @@ -6,7 +6,6 @@ import {coalesce, get, set} from 'object-path' import React, {Component} from 'react' import { Button, - Checkbox, Col, ControlLabel, FormControl, @@ -19,7 +18,6 @@ import { import update from 'react-addons-update' import {shallowEqual} from 'react-pure-render' import {withRouter} from 'react-router' -import {LinkContainer} from 'react-router-bootstrap' import FormInput from '../../common/components/FormInput' import {getComponentMessages} from '../../common/util/config' diff --git a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap index b7839776c..abfb7dd32 100644 --- a/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/ActiveProjectViewer.js.snap @@ -49,6 +49,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr onProjectViewerMount={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -1911,6 +1912,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -1953,6 +1955,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -2068,6 +2071,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -2114,6 +2118,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -2177,6 +2182,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr } project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -3854,6 +3860,7 @@ exports[`lib > manager > ActiveProjectViewer should render with newly created pr feedSources={Array []} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, diff --git a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap index e48ea83b0..4192cc93d 100644 --- a/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/DeploymentsPanel.js.snap @@ -18,6 +18,7 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym expanded={true} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -237,10 +238,9 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym createDeployment={[Function]} deleteDeployment={[Function]} expanded={true} - fetchProjectDeployments={[Function]} - fetchProjectFeeds={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -519,18 +519,158 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym
    manager > DeploymentsPanel should render with the list of deploym } saveDeployment={[Function]} updateDeployment={[Function]} - updateProject={[Function]} > manager > DeploymentsPanel should render with the list of deploym manager > DeploymentsPanel should render with the list of deploym "user": null, } } - fetchProjectDeployments={[Function]} - fetchProjectFeeds={[Function]} key="mock-deployment-id-0" project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -1237,23 +1374,38 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym } saveDeployment={[Function]} updateDeployment={[Function]} - updateProject={[Function]} > + + +
    manager > DeploymentsPanel should render with the list of deploym - 2 months ago @@ -1324,9 +1475,7 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym - - 1 - + 1 manager > DeploymentsPanel should render with the list of deploym - -
    - - - - -
    -
    + + + + manager > DeploymentsPanel should render with the list of deploym "user": null, } } - fetchProjectDeployments={[Function]} - fetchProjectFeeds={[Function]} key="mock-deployment-id-1" project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -1658,23 +1769,31 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym } saveDeployment={[Function]} updateDeployment={[Function]} - updateProject={[Function]} >
    manager > DeploymentsPanel should render with the list of deploym - 2 months ago @@ -1745,9 +1863,7 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym - - 0 - + 0 manager > DeploymentsPanel should render with the list of deploym - -
    - - - - -
    -
    + + + + @@ -1833,10 +1913,11 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym
    manager > DeploymentsPanel should render with the list of deploym defaultExpanded={false} header={

    - Deploying feeds to OTP + + + Auto-deployment

    } > @@ -1857,7 +1942,324 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym

    - Deploying feeds to OTP + + + + + Auto-deployment +

    +
    +
    + +
    + + + + +
    +
    + +
    + + mock-deployment + +
    +
    +
    +
    + + + + Pin a deployment (and deploy to a server at least once) to enable auto-deployment. + + +
    +
    + +
    + +
    +
    + + + Whenever a new version is processed, a deployment will automatically be kicked off (assuming there are no critical errors). + + + +
    +
    + + + + + Configuring deployments + + } + > +
    +
    +

    + + + + + Configuring deployments

    manager > DeploymentsPanel should render with the list of deploym

    - A collection of feeds can be deployed to OpenTripPlanner (OTP) instances that have been defined in the organization settings. + Deployments can use project-level configurations (e.g., for build or router config files) or be configured individually. +

    manager > DeploymentsPanel should render with the list of deploym className="fa fa-cog fa-fw " /> - Edit deployment settings + + Edit deployment settings @@ -1931,7 +2335,8 @@ exports[`lib > manager > DeploymentsPanel should render with the list of deploym className="fa fa-server fa-fw " /> - Manage deployment servers + + Manage deployment servers diff --git a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap index 163f34121..78c2e61df 100644 --- a/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap +++ b/lib/manager/containers/__tests__/__snapshots__/FeedSourceTable.js.snap @@ -17,6 +17,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -300,6 +301,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -564,6 +566,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -759,6 +762,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds onNewFeedSourceClick={[Function]} project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -972,6 +976,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds } project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -2838,6 +2843,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds key="mock-feed-with-version-id" project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -3095,6 +3101,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds } project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, @@ -3636,6 +3643,7 @@ exports[`lib > manager > FeedSourceTable should render with a project with feeds } project={ Object { + "autoDeploy": false, "autoFetchFeeds": true, "autoFetchHour": 0, "autoFetchMinute": 0, diff --git a/yarn.lock b/yarn.lock index 47bafbaa8..c58b225f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -729,21 +729,7 @@ core-js "^2.6.5" regenerator-runtime "^0.13.2" -"@babel/runtime@^7.1.2": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" - integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/runtime@^7.4.2": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.4.tgz#dc2e34982eb236803aa27a07fea6857af1b9171d" - integrity sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.4.5": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== @@ -1399,12 +1385,7 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== -"@types/node@*": - version "11.13.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" - integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== - -"@types/node@>= 8": +"@types/node@*", "@types/node@>= 8": version "14.14.8" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.8.tgz#2127bd81949a95c8b7d3240f3254352d72563aec" integrity sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA== @@ -2285,18 +2266,7 @@ before-after-hook@^2.1.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== -bin-links@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" - integrity sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg== - dependencies: - bluebird "^3.5.0" - cmd-shim "^2.0.2" - gentle-fs "^2.0.0" - graceful-fs "^4.1.11" - write-file-atomic "^2.3.0" - -bin-links@^1.1.8: +bin-links@^1.1.2, bin-links@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228" integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ== @@ -2327,12 +2297,7 @@ bl@^3.0.0: dependencies: readable-stream "^3.0.1" -bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3: - version "3.5.4" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" - integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== - -bluebird@^3.5.5: +bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -2842,16 +2807,7 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase-keys@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.0.1.tgz#a0d1a03cab5499a7ddcc62b23b4874399ca1dfaf" - integrity sha512-Pet+fVo99HMVy183qJuyTiQECQlb0dCXg89qhixcud88j4BSns+gzhSrjRT0ustEYSWJqKMO42arm1cS1VG5FA== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase-keys@^6.2.2: +camelcase-keys@^6.0.0, camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== @@ -3012,12 +2968,7 @@ chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.2: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" - integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== - -chownr@^1.1.2, chownr@^1.1.4: +chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -3280,17 +3231,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.11.0, commander@^2.19.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== - -commander@^2.9.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - -commander@~2.20.3: +commander@^2.11.0, commander@^2.19.0, commander@^2.9.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3336,12 +3277,7 @@ component-classes@^1.2.5: dependencies: component-indexof "0.0.3" -component-emitter@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - -component-emitter@^1.2.1: +component-emitter@^1.2.0, component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -3490,20 +3426,7 @@ conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.1: is-subset "^0.1.1" modify-values "^1.0.0" -conventional-commits-parser@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz#fe1c49753df3f98edb2285a5e485e11ffa7f2e4c" - integrity sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.0" - lodash "^4.2.1" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - trim-off-newlines "^1.0.0" - -conventional-commits-parser@^3.0.7: +conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7: version "3.2.0" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz#9e261b139ca4b7b29bcebbc54460da36894004ca" integrity sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ== @@ -3574,7 +3497,7 @@ core-js-pure@3.1.4: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== -core-js@2, core-js@^2.6.5: +core-js@2, core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== @@ -3584,11 +3507,6 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" - integrity sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== - core-js@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07" @@ -4066,7 +3984,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -4662,7 +4580,7 @@ errorify@^0.3.1: resolved "https://registry.yarnpkg.com/errorify/-/errorify-0.3.1.tgz#53e0aaeeb18adc3e55f9f1eb4e2d95929f41b79b" integrity sha1-U+Cq7rGK3D5V+fHrTi2Vkp9Bt5s= -es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.7.0, es-abstract@^1.9.0: +es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0, es-abstract@^1.9.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== @@ -4674,17 +4592,6 @@ es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.4. is-regex "^1.0.4" object-keys "^1.0.12" -es-abstract@^1.5.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - 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" @@ -4717,16 +4624,11 @@ es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-promise@^4.0.3, es6-promise@^4.2.8: +es6-promise@^4.0.3, es6-promise@^4.1.1, es6-promise@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== -es6-promise@^4.1.1: - version "4.2.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" - integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== - es6-promise@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" @@ -5786,21 +5688,7 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== -gentle-fs@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" - integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew== - dependencies: - aproba "^1.1.2" - fs-vacuum "^1.2.10" - graceful-fs "^4.1.11" - iferr "^0.1.5" - mkdirp "^0.5.1" - path-is-inside "^1.0.2" - read-cmd-shim "^1.0.1" - slide "^1.1.6" - -gentle-fs@^2.3.0, gentle-fs@^2.3.1: +gentle-fs@^2.0.0, gentle-fs@^2.3.0, gentle-fs@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1" integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q== @@ -5986,19 +5874,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.6: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -6081,17 +5957,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" - integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== - -graceful-fs@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== - -graceful-fs@^4.2.2, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== @@ -6272,14 +6138,7 @@ hoist-non-react-statics@^2.1.0, hoist-non-react-statics@^2.3.1: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e" - integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw== - dependencies: - react-is "^16.3.2" - -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== @@ -6517,12 +6376,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.2, ignore@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" - integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== - -ignore@^5.1.4: +ignore@^5.0.2, ignore@^5.1.2, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -6545,15 +6399,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-fresh@^3.1.0: +import-fresh@^3.0.0, import-fresh@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== @@ -6581,7 +6427,7 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -7691,15 +7537,7 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.x: - 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" - -js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.1: +js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7934,12 +7772,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -8232,15 +8065,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lock-verify@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.1.0.tgz#fff4c918b8db9497af0c5fa7f6d71555de3ceb47" - integrity sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg== - dependencies: - npm-package-arg "^6.1.0" - semver "^5.4.1" - -lock-verify@^2.1.0: +lock-verify@^2.0.2, lock-verify@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1" integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww== @@ -8261,11 +8086,6 @@ lodash-es@^4.2.1: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.14.tgz#12a95a963cc5955683cee3b74e85458954f37ecc" integrity sha512-7zchRrGa8UZXjD/4ivUWP1867jDkhzTG2c/uj739utSd7O/pFFdxspCemIFKEEjErbcqRzn8nKnGsi7mvTgRPA== -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -8274,29 +8094,12 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: +lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= @@ -8415,11 +8218,6 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -8969,20 +8767,13 @@ mime-db@~1.37.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== dependencies: mime-db "1.40.0" -mime-types@~2.1.18: - version "2.1.21" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== - dependencies: - mime-db "~1.37.0" - mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -8993,17 +8784,7 @@ mime@1.6.0, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" - integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== - -mime@^2.4.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -mime@^2.4.3: +mime@^2.0.3, mime@^2.4.0, mime@^2.4.3: version "2.4.6" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== @@ -9081,12 +8862,12 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -9096,15 +8877,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^2.8.6: +minipass@^2.2.1, minipass@^2.3.5, minipass@^2.8.6: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -9143,14 +8916,14 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -mkdirp@^0.5.5: +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -9223,12 +8996,12 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1, ms@^2.0.0: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -9432,15 +9205,7 @@ nopt@3.x: dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -nopt@^4.0.3: +nopt@^4.0.1, nopt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== @@ -9544,17 +9309,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" - integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== - dependencies: - hosted-git-info "^2.6.0" - osenv "^0.1.5" - semver "^5.5.0" - validate-npm-package-name "^3.0.0" - -npm-package-arg@^6.1.1: +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0, npm-package-arg@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== @@ -9564,23 +9319,7 @@ npm-package-arg@^6.1.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-packlist@^1.1.6: - version "1.4.4" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-packlist@^1.4.8: +npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -10254,12 +9993,7 @@ pad-right@^0.2.2: dependencies: repeat-string "^1.5.2" -pako@~1.0.2: - version "1.0.7" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" - integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== - -pako@~1.0.5: +pako@~1.0.2, pako@~1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== @@ -10411,12 +10145,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-key@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" - integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== - -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -11806,21 +11535,11 @@ react-input-autosize@^2.1.2: dependencies: prop-types "^15.5.8" -react-is@^16.3.2, react-is@^16.6.0: - version "16.6.3" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" - integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA== - -react-is@^16.7.0: +react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: version "16.11.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== -react-is@^16.8.1, react-is@^16.8.4: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== - react-leaflet@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/react-leaflet/-/react-leaflet-1.1.0.tgz#0ec55ff030fae8c90e6e00a48163dcbccbadb4d8" @@ -11868,20 +11587,7 @@ react-pure-render@^1.0.2: resolved "https://registry.yarnpkg.com/react-pure-render/-/react-pure-render-1.0.2.tgz#9d8a928c7f2c37513c2d064e57b3e3c356e9fabb" integrity sha1-nYqSjH8sN1E8LQZOV7Pjw1bp+rs= -react-redux@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" - integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg== - dependencies: - "@babel/runtime" "^7.1.2" - hoist-non-react-statics "^3.1.0" - invariant "^2.2.4" - loose-envify "^1.1.0" - prop-types "^15.6.1" - react-is "^16.6.0" - react-lifecycles-compat "^3.0.0" - -react-redux@^5.0.7: +react-redux@^5.0.3, react-redux@^5.0.7: version "5.1.2" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57" integrity sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q== @@ -12018,14 +11724,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-cmd-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" - integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= - dependencies: - graceful-fs "^4.1.2" - -read-cmd-shim@^1.0.5: +read-cmd-shim@^1.0.1, read-cmd-shim@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA== @@ -12053,19 +11752,7 @@ read-only-stream@^2.0.0: dependencies: readable-stream "^2.0.2" -"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" - integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== - dependencies: - glob "^7.1.1" - json-parse-better-errors "^1.0.1" - normalize-package-data "^2.0.0" - slash "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" - -read-package-json@^2.1.1: +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== @@ -12182,16 +11869,7 @@ read@1, read@^1.0.4, read@~1.0.1, read@~1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@3, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -12210,15 +11888,6 @@ readable-stream@3, readable-stream@^3.6.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" - integrity sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@~1.1.10: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -12241,17 +11910,7 @@ readable-stream@~2.0.0, readable-stream@~2.0.6: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" - integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdir-scoped-modules@^1.1.0: +readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== @@ -12317,18 +11976,7 @@ reduce-reducers@^0.4.3: resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" integrity sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw== -redux-actions@^2.2.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.4.tgz#e1d9d7d987d274071b0134b707365d3e25ba3b26" - integrity sha512-Gho+gnsvyR5h0pApoMdHLYssVEu4I0DNqyC91u43Xy/BvLrEddEMtukLF8oL3WXUy7DjxqKOKZHKmpKyN6hxlQ== - dependencies: - invariant "^2.2.4" - just-curry-it "^3.1.0" - loose-envify "^1.4.0" - reduce-reducers "^0.4.3" - to-camel-case "^1.0.0" - -redux-actions@^2.6.1: +redux-actions@^2.2.1, redux-actions@^2.6.1: version "2.6.5" resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.5.tgz#bdca548768ee99832a63910c276def85e821a27e" integrity sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw== @@ -12652,21 +12300,7 @@ resolve@1.1.7, resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.10.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== - dependencies: - path-parse "^1.0.6" - -resolve@^1.17.0: +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -12730,21 +12364,14 @@ right-pad@^1.0.1: resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" integrity sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA= -rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2.6.3: 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" -rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@^2.7.1: +rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -12815,12 +12442,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-buffer@^5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -13639,12 +13261,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-package@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" - integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g== - -stringify-package@^1.0.1: +stringify-package@^1.0.0, stringify-package@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== @@ -13880,20 +13497,7 @@ tar-stream@~1.1.0: readable-stream "~1.0.33" xtend "^4.0.0" -tar@^4: - version "4.4.10" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" - integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.5" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: +tar@^4, tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -14730,12 +14334,12 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.3.2, uuid@^3.1.0, uuid@^3.3.2: +uuid@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@^3.3.3: +uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -14972,14 +14576,7 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -worker-farm@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== - dependencies: - errno "~0.1.7" - -worker-farm@^1.7.0: +worker-farm@^1.6.0, worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== @@ -15026,16 +14623,7 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" - integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^2.4.3: +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== From fa37087451d8bb89474e82d4c0992cbd05fbb994 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 22 Feb 2021 23:16:02 -0800 Subject: [PATCH 101/553] refactor: add more custom file validation --- .../components/deployment/CustomFileEditor.js | 101 +++++++++++++----- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/lib/manager/components/deployment/CustomFileEditor.js b/lib/manager/components/deployment/CustomFileEditor.js index a7ca365e9..3676063cc 100644 --- a/lib/manager/components/deployment/CustomFileEditor.js +++ b/lib/manager/components/deployment/CustomFileEditor.js @@ -40,11 +40,37 @@ export default class CustomFileEditor extends Component this.props.customFileEditIdx === null - _isEditing= () => this.props.idx === this.props.customFileEditIdx + /** + * Makes sure that the filename is valid. The filename is optional when a uri + * is provided, but is required when entering raw input. + */ + _fileNameValid = (): boolean => { + const {fileSource, model: customFile} = this.state + return (fileSource === 'uri' && !!customFile.uri) || + (!!customFile.contents && !!customFile.filename) + } + + /** + * Makes sure that a uri or some raw input has been added + */ + _hasContents = (): boolean => { + const {model: customFile} = this.state + return !!customFile.contents || !!customFile.uri + } - _isValid = () => { + /** + * Makes sure that the file is used during either graph building, serving or + * both. + */ + _hasSomeUsage = (): boolean => { const {model: customFile} = this.state - return customFile.contents || customFile.uri + return customFile.useDuringBuild || customFile.useDuringServe + } + + _isEditing= () => this.props.idx === this.props.customFileEditIdx + + _isValidOverall = (): boolean => { + return this._fileNameValid() && this._hasSomeUsage() && this._hasContents() } _onChangeBuildUse = () => { @@ -151,7 +177,7 @@ export default class CustomFileEditor extends Component Save @@ -175,43 +201,60 @@ export default class CustomFileEditor extends Component {this._renderToolbar()}
    {isEditing - ? + ? + + {!filenameValid && ( + + Filename must be set when providing raw input! + + )} + : Filename:{' '} - {/* FIXME: what should the behavior be here if missing */} - {customFile.filename || '[defaults to URI]'} + {fileSource === 'raw' + ? customFile.filename + : customFile.filename || '[defaults to filename at end of URI]'} }
    - - Use during graph build - - - Use while running server - - + + + Use during graph build + + + Use while running server + + {!hasSomeUsage && ( + + File must be used during either graph build or running the server (or both)! + + )} + + File source From raw input - {!isValid && Please set contents or uri!} + {!hasContents && Please set contents or uri!} {fileSource === 'raw' && ( Date: Tue, 23 Feb 2021 16:37:59 -0500 Subject: [PATCH 102/553] ci: override e2e = true --- scripts/check-if-e2e-should-run-on-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check-if-e2e-should-run-on-ci.sh b/scripts/check-if-e2e-should-run-on-ci.sh index 51eeb7d09..83e14d0e3 100755 --- a/scripts/check-if-e2e-should-run-on-ci.sh +++ b/scripts/check-if-e2e-should-run-on-ci.sh @@ -16,6 +16,6 @@ if [[ "$SHOULD_RUN_E2E" != "true" ]]; then fi # FIXME: Re-enable e2e for conditions above. -OVERRIDE=false +OVERRIDE=true echo "SHOULD_RUN_E2E=${OVERRIDE}" >> $GITHUB_ENV && export SHOULD_RUN_E2E=${OVERRIDE} echo "Overriding E2E. Temporarily forcing to be ${OVERRIDE}..." From bbc99157a69e13251150dcbf8179f160234979f2 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 24 Feb 2021 08:29:23 -0500 Subject: [PATCH 103/553] ci: change e2e travis env variables to github --- __tests__/test-utils/setup-e2e.js | 4 ++-- __tests__/test-utils/teardown-e2e.js | 14 +++++++++----- __tests__/test-utils/utils.js | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/__tests__/test-utils/setup-e2e.js b/__tests__/test-utils/setup-e2e.js index e64107e2b..51552bd60 100644 --- a/__tests__/test-utils/setup-e2e.js +++ b/__tests__/test-utils/setup-e2e.js @@ -52,7 +52,7 @@ async function startBackendServer () { } const serverFolder = path.join( - process.env.TRAVIS_BUILD_DIR, + process.env.GITHUB_WORKSPACE, '..', 'datatools-server' ) @@ -200,7 +200,7 @@ async function startClientServer () { // set the working directories for datatools-ui const datatoolsUiDir = path.join( - process.env.TRAVIS_BUILD_DIR, + process.env.GITHUB_WORKSPACE, '..', 'datatools-ui' ) diff --git a/__tests__/test-utils/teardown-e2e.js b/__tests__/test-utils/teardown-e2e.js index 51e0c1f7a..e13937c61 100644 --- a/__tests__/test-utils/teardown-e2e.js +++ b/__tests__/test-utils/teardown-e2e.js @@ -19,10 +19,10 @@ const { const slackConfigured = process.env.SLACK_TOKEN && process.env.SLACK_CHANNEL const msTeamsConfigured = process.env.MS_TEAMS_WEBHOOK_URL const logsZipfile = 'logs.zip' -const repo = process.env.TRAVIS_BUILD_DIR - ? process.env.TRAVIS_BUILD_DIR.split(path.sep).pop() +const repo = process.env.GITHUB_WORKSPACE + ? process.env.GITHUB_WORKSPACE.split(path.sep).pop() : '' -const buildNum = process.env.TRAVIS_BUILD_NUMBER +const buildNum = process.env.GITHUB_RUN_ID const uploadedLogsFilename = `${repo}-build-${buildNum}-e2e-logs.zip` const {LOGS_S3_BUCKET} = process.env @@ -115,6 +115,10 @@ function shutdownOtp () { return killDetachedProcess('otp') } +function getBuildUrl () { + return `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}` +} + function makeUploadFailureHandler (handlerErrorMsg) { return (err) => { console.error(handlerErrorMsg) @@ -160,7 +164,7 @@ async function uploadToMicrosoftTeams () { targets: [ { os: 'default', - uri: process.env.TRAVIS_BUILD_WEB_URL + uri: getBuildUrl() } ] }] @@ -228,7 +232,7 @@ async function uploadToSlack () { file: fs.createReadStream(logsZipfile), filename: uploadedLogsFilename, filetype: 'zip', - initial_comment: `View build logs here: ${process.env.TRAVIS_BUILD_WEB_URL}` + initial_comment: `View build logs here: ${getBuildUrl()}` }) } catch (e) { console.error('failed to upload logs to slack!') diff --git a/__tests__/test-utils/utils.js b/__tests__/test-utils/utils.js index cbea341c4..e7ca9774f 100644 --- a/__tests__/test-utils/utils.js +++ b/__tests__/test-utils/utils.js @@ -8,7 +8,7 @@ const request = require('request') const collectingCoverage = process.env.COLLECT_COVERAGE const isCi = !!process.env.CI -const isUiRepo = process.env.TRAVIS_REPO_SLUG === 'ibi-group/datatools-ui' +const isUiRepo = process.env.GITHUB_REPOSITORY === 'ibi-group/datatools-ui' const testFolderPath = 'e2e-test-results' /** From 6f2cbae7c59fbbe27db168ffed1b58c00484a801 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 24 Feb 2021 08:43:25 -0500 Subject: [PATCH 104/553] ci: fix remaining github env variables --- __tests__/test-utils/setup-e2e.js | 4 ++-- __tests__/test-utils/teardown-e2e.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/__tests__/test-utils/setup-e2e.js b/__tests__/test-utils/setup-e2e.js index 51552bd60..518d871b5 100644 --- a/__tests__/test-utils/setup-e2e.js +++ b/__tests__/test-utils/setup-e2e.js @@ -47,7 +47,7 @@ async function startBackendServer () { 'TRANSITFEEDS_KEY' ]) } catch (e) { - console.error(`At least one required env var is missin: ${e}`) + console.error(`At least one required env var is missing: ${e}`) throw e } @@ -194,7 +194,7 @@ async function startClientServer () { 'TRANSITFEEDS_KEY' ]) } catch (e) { - console.error(`At least one required env var is missin: ${e}`) + console.error(`At least one required env var is missing: ${e}`) throw e } diff --git a/__tests__/test-utils/teardown-e2e.js b/__tests__/test-utils/teardown-e2e.js index e13937c61..f5f2f1871 100644 --- a/__tests__/test-utils/teardown-e2e.js +++ b/__tests__/test-utils/teardown-e2e.js @@ -183,7 +183,7 @@ async function uploadToMicrosoftTeams () { } let fetchResponse - const commit = process.env.TRAVIS_COMMIT + const commit = process.env.GITHUB_SHA const baseRepoUrl = `https://github.com/ibi-group/datatools-${isUiRepo ? 'ui' : 'server'}` const commitUrl = `${baseRepoUrl}/commit/${commit}` try { @@ -196,7 +196,7 @@ async function uploadToMicrosoftTeams () { '@type': 'MessageCard', themeColor: '0072C6', title: `${repo} e2e test ${testResults.success ? 'passed. ✅' : 'failed. ❌'}`, - text: `📁 **branch:** ${process.env.TRAVIS_BRANCH}\n + text: `📁 **branch:** ${process.env.GITHUB_REF_SLUG}\n 📄 **commit:** [${commit.slice(0, 6)}](${commitUrl})\n 📊 **result:** ${testResults.numPassedTests} / ${testResults.numTotalTests} tests passed\n `, From eb648f905b88cf6aef53aeea46895b19f3cad901 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 2 Mar 2021 10:58:35 -0500 Subject: [PATCH 105/553] fix(manager/actions/status): Navigate to latest feed ver. after processing complete. --- lib/manager/actions/status.js | 12 ++++++++++++ lib/manager/actions/versions.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/manager/actions/status.js b/lib/manager/actions/status.js index e53eec23e..87fe75a45 100644 --- a/lib/manager/actions/status.js +++ b/lib/manager/actions/status.js @@ -1,6 +1,7 @@ // @flow import moment from 'moment' +import { browserHistory } from 'react-router' import { createAction, type ActionType } from 'redux-actions' import { createVoidPayloadAction, secureFetch } from '../../common/actions' @@ -259,6 +260,17 @@ export function handleFinishedJob (job: ServerJob) { } } break + case 'PROCESS_FEED': + // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. + // It is the same path (without version number) as the link shown for this job status. + // (If user is not looking at this feed, don't navigate away from their current page.) + if (job.feedSourceId) { + const newVersionPath = `/feed/${job.feedSourceId}` + if (browserHistory.getCurrentLocation().pathname.startsWith(newVersionPath)) { + browserHistory.push(newVersionPath) + } + } + break default: console.warn(`No completion step defined for job type ${job.type}`) break diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index ccfe12835..ad29d8ac1 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -162,7 +162,7 @@ export function publishFeedVersion (feedVersion: FeedVersion) { } /** - * Merges two feed versions according to the strategy defined within the + * Merges two feed versions according to the strategy defined by the mergeType parameter. */ export function mergeVersions (targetVersionId: string, versionId: string, mergeType: 'SERVICE_PERIOD' | 'REGIONAL') { return function (dispatch: dispatchFn, getState: getStateFn) { From d3b6ed1f5e72c4168c6f4b3a19b87d703dfed7e4 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 2 Mar 2021 12:49:42 -0500 Subject: [PATCH 106/553] refactor(VersionComparisonDropdown): Add option to exit comparison mode. --- .../version/VersionComparisonDropdown.js | 15 ++++++++++----- .../components/version/VersionSelectorDropdown.js | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/manager/components/version/VersionComparisonDropdown.js b/lib/manager/components/version/VersionComparisonDropdown.js index 2fbba97e3..6dafb3216 100644 --- a/lib/manager/components/version/VersionComparisonDropdown.js +++ b/lib/manager/components/version/VersionComparisonDropdown.js @@ -59,6 +59,15 @@ class VersionComparisonDropdown extends Component { id: 'prevVersionSelector', onSelect: this._onSelectComparedVersion }} + extraOptions={comparedFeedVersion + ? [ + { + onClick: null, + text: 'Exit compare mode' + } + ] + : null + } header={versions.length < 2 ? 'Load another version to enable comparison' : 'Select a version to compare with' @@ -76,12 +85,8 @@ const mapStateToProps = (state: AppState, ownProps: {}) => { return {} } -const { - setComparedVersionIndex -} = versionsActions - const mapDispatchToProps = { - setComparedVersionIndex + setComparedVersionIndex: versionsActions.setComparedVersionIndex } export default connect(mapStateToProps, mapDispatchToProps)(VersionComparisonDropdown) diff --git a/lib/manager/components/version/VersionSelectorDropdown.js b/lib/manager/components/version/VersionSelectorDropdown.js index 5de272237..6e1d5328a 100644 --- a/lib/manager/components/version/VersionSelectorDropdown.js +++ b/lib/manager/components/version/VersionSelectorDropdown.js @@ -10,6 +10,7 @@ import type { FeedVersion } from '../../../types' type Props = { dropdownProps: any, + extraOptions: ?Array, header?: string, itemFormatter: (FeedVersion, ?FeedVersion) => React.Node, title: React.Node, @@ -40,6 +41,7 @@ export const DefaultItemFormatter = (version: FeedVersion, activeVersion: ?FeedV export default function VersionSelectorDropdown (props: Props) { const { dropdownProps, + extraOptions, header, itemFormatter, title, @@ -61,6 +63,11 @@ export default function VersionSelectorDropdown (props: Props) { {versionsSorted.length > 0 ? versionsSorted.map((v, i) => itemFormatter(v, version)) : No versions available} + + {extraOptions && } + {extraOptions && extraOptions.map((option, i) => ( + {option.text} + ))} ) From 87c91df27478e860e58a6a01c93003ed1fa59ca3 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 2 Mar 2021 15:32:47 -0500 Subject: [PATCH 107/553] refactor(FeedVersionDetails): Display date validity chart for non-comparing mode. --- .../components/version/FeedVersionDetails.js | 41 ++++++++++------- .../version/FeedVersionSpanChart.js | 44 +++++++++++++++++++ .../version/VersionSelectorDropdown.js | 2 +- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index 17eee46d3..5f7b22abf 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -15,7 +15,7 @@ import bboxPoly from 'turf-bbox-polygon' import * as versionsActions from '../../actions/versions' import {getConfigProperty, isExtensionEnabled} from '../../../common/util/config' import {BLOCKING_ERROR_TYPES} from '../../util/version' -import FeedVersionSpanChart from './FeedVersionSpanChart' +import FeedVersionSpanChart, { FeedVersionSpanChartInner } from './FeedVersionSpanChart' import VersionRetrievalBadge from './VersionRetrievalBadge' import VersionSelectorDropdown from './VersionSelectorDropdown' import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' @@ -114,8 +114,8 @@ export default class FeedVersionDetails extends Component { : 'Merge with version' return ( -

    - +
    + {/* Only show merge feeds button if the feed starts in the future. FIXME: uncomment out the below to prevent merges with non-future feeds. @@ -158,10 +158,6 @@ export default class FeedVersionDetails extends Component { } - - {' '} - Feed validity dates - {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && isExtensionEnabled('mtc') &&
    { .)
    } +
    + +

    + + {' '} + Feed validity dates +

    - {comparedVersion && comparedVersionIndex && ( - - )} + {(comparedVersion && comparedVersionIndex) + ? ( + + ) + : ( + + ) + } -

    +

    {summary && summary.avgDailyRevenueTime ? diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index aa5b4b6e9..70d46d402 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -12,6 +12,11 @@ type Props = { comparedVersion: FeedVersion, style: any } +type ActiveOnlyProps = { + activeVersion: FeedVersion, + style: any +} + const DATE_FORMAT = 'MMM. D, YYYY' const TODAY_DATE_FORMAT = 'MMM. D' @@ -110,6 +115,45 @@ export default class FeedVersionSpanChart extends Component { } } +/** + * This component renders bars representing the date ranges for which the given feed versions + * are valid (e.g., Jan 1 - March 27) and lets the user visualize overlaps or gaps in the validity periods + * of the active and compared feed versions. + */ +export class FeedVersionSpanChartInner extends Component { + render () { + const { activeVersion } = this.props + // Construct moment objects for the active/compared version start/end dates. + const firstDate = moment(activeVersion.validationSummary.startDate) + const lastDate = moment(activeVersion.validationSummary.endDate) + + // Render the today marker if it is between first and last date. + const today = moment() + const totalDays = lastDate.diff(firstDate, 'days') + const todayOffset = today.diff(firstDate, 'days') + const showToday = todayOffset >= 0 && todayOffset < totalDays + + const activeChartProps = { + firstDate, + lastDate, + top: 0, + versionEndDate: lastDate, + versionLabel: , + versionStartDate: firstDate + } + + return ( +

    + + + + {showToday && } +
    + ) + } +} + + /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ firstDate, diff --git a/lib/manager/components/version/VersionSelectorDropdown.js b/lib/manager/components/version/VersionSelectorDropdown.js index 6e1d5328a..dacbd1796 100644 --- a/lib/manager/components/version/VersionSelectorDropdown.js +++ b/lib/manager/components/version/VersionSelectorDropdown.js @@ -10,7 +10,7 @@ import type { FeedVersion } from '../../../types' type Props = { dropdownProps: any, - extraOptions: ?Array, + extraOptions?: ?Array, header?: string, itemFormatter: (FeedVersion, ?FeedVersion) => React.Node, title: React.Node, From edc1a1191de0a1595dd439ac8fe809d39c66ff76 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 2 Mar 2021 18:35:46 -0500 Subject: [PATCH 108/553] refactor(FeedVersionDetails): Tweak layout --- .../components/version/FeedVersionDetails.js | 151 ++++++++---------- .../version/FeedVersionSpanChart.js | 89 +++-------- 2 files changed, 95 insertions(+), 145 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index 5f7b22abf..ec703cd06 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -15,7 +15,7 @@ import bboxPoly from 'turf-bbox-polygon' import * as versionsActions from '../../actions/versions' import {getConfigProperty, isExtensionEnabled} from '../../../common/util/config' import {BLOCKING_ERROR_TYPES} from '../../util/version' -import FeedVersionSpanChart, { FeedVersionSpanChartInner } from './FeedVersionSpanChart' +import FeedVersionSpanChart from './FeedVersionSpanChart' import VersionRetrievalBadge from './VersionRetrievalBadge' import VersionSelectorDropdown from './VersionSelectorDropdown' import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' @@ -114,94 +114,83 @@ export default class FeedVersionDetails extends Component { : 'Merge with version' return ( -
    - - {/* - Only show merge feeds button if the feed starts in the future. - FIXME: uncomment out the below to prevent merges with non-future feeds. - moment(summary.startDate).isAfter(moment().startOf('day')) && - */} - {isExtensionEnabled('mtc') && - {mergeButtonLabel}} - itemFormatter={this._mergeItemFormatter} - version={version} - versions={feedSource.feedVersions} - /> - } - {isExtensionEnabled('mtc') && - - } - - {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && - isExtensionEnabled('mtc') && -
    - Cannot publish version because it has a{' '} - {hasGtfsPlusBlockingIssue ? 'GTFS+ ' : ''} - blocking issue. - (See{' '} - - {hasGtfsPlusBlockingIssue ? 'GTFS+' : 'validation'} issues - .) -
    - } -
    - -

    +

    {' '} Feed validity dates

    - - {(comparedVersion && comparedVersionIndex) - ? ( - - ) - : ( - + {/* + Only show merge feeds button if the feed starts in the future. + FIXME: uncomment out the below to prevent merges with non-future feeds. + moment(summary.startDate).isAfter(moment().startOf('day')) && + */} + {isExtensionEnabled('mtc') && + {mergeButtonLabel}} + itemFormatter={this._mergeItemFormatter} + version={version} + versions={feedSource.feedVersions} /> - ) + } + {isExtensionEnabled('mtc') && + + } +
    + {(hasBlockingIssue || hasGtfsPlusBlockingIssue) && + isExtensionEnabled('mtc') && +
    + Cannot publish version because it has a{' '} + {hasGtfsPlusBlockingIssue ? 'GTFS+ ' : ''} + blocking issue. + (See{' '} + + {hasGtfsPlusBlockingIssue ? 'GTFS+' : 'validation'} issues + .) +
    } + +

    {summary && summary.avgDailyRevenueTime ? diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 70d46d402..5eb4e4f00 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -9,15 +9,10 @@ import type { FeedVersion } from '../../../types' type Props = { activeVersion: FeedVersion, - comparedVersion: FeedVersion, - style: any -} -type ActiveOnlyProps = { - activeVersion: FeedVersion, + comparedVersion?: ?FeedVersion, style: any } - const DATE_FORMAT = 'MMM. D, YYYY' const TODAY_DATE_FORMAT = 'MMM. D' @@ -40,7 +35,9 @@ const TODAY_MARKER_ZINDEX = 9998 */ export default class FeedVersionSpanChart extends Component { render () { - const { activeVersion, comparedVersion, style } = this.props + const { activeVersion, comparedVersion: comparedVersionProp, style } = this.props + const comparedVersion = comparedVersionProp ? comparedVersionProp : activeVersion + // Construct moment objects for the active/compared version start/end dates. const activeStartDate = moment(activeVersion.validationSummary.startDate) const activeEndDate = moment(activeVersion.validationSummary.endDate) @@ -86,17 +83,24 @@ export default class FeedVersionSpanChart extends Component { return (

    -
    -
    Version {activeVersion.version} (selected)
    - {hasGap && -
    Gap in service
    } -
    Version {comparedVersion.version}
    -
    -
    + {comparedVersionProp && ( +
    +
    Version {activeVersion.version} (selected)
    + {hasGap && +
    Gap in service
    } +
    Version {comparedVersion.version}
    +
    + )} +
    + {/* Components below are all rendered as direct children of this div to accommodate + drawing the "today" line marker above the FeedSpan, while keeping it + under the FeedStartLabel and FeedEndLabel contents. + FIXME[React 16+]: Extract FeedStartLabel, FeedEndLabel, FeedSpan into <>... markup. + */} - {hasGap && + {comparedVersionProp && hasGap && { versionStartDate={earliestEnd} versionEndDate={latestStart} />} - - - + {comparedVersionProp && } + {comparedVersionProp && } + {comparedVersionProp && } {showToday && }
    @@ -115,45 +119,6 @@ export default class FeedVersionSpanChart extends Component { } } -/** - * This component renders bars representing the date ranges for which the given feed versions - * are valid (e.g., Jan 1 - March 27) and lets the user visualize overlaps or gaps in the validity periods - * of the active and compared feed versions. - */ -export class FeedVersionSpanChartInner extends Component { - render () { - const { activeVersion } = this.props - // Construct moment objects for the active/compared version start/end dates. - const firstDate = moment(activeVersion.validationSummary.startDate) - const lastDate = moment(activeVersion.validationSummary.endDate) - - // Render the today marker if it is between first and last date. - const today = moment() - const totalDays = lastDate.diff(firstDate, 'days') - const todayOffset = today.diff(firstDate, 'days') - const showToday = todayOffset >= 0 && todayOffset < totalDays - - const activeChartProps = { - firstDate, - lastDate, - top: 0, - versionEndDate: lastDate, - versionLabel: , - versionStartDate: firstDate - } - - return ( -
    - - - - {showToday && } -
    - ) - } -} - - /** Renders the validity span of one feed using the given props. */ const FeedSpan = ({ firstDate, @@ -216,7 +181,6 @@ const FeedStartLabel = ({
    Date: Tue, 2 Mar 2021 18:36:25 -0500 Subject: [PATCH 109/553] refactor(gtfs/reducers): Do not activate compare view by default. --- lib/gtfs/reducers/filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gtfs/reducers/filter.js b/lib/gtfs/reducers/filter.js index ea56269ee..7d6a89952 100644 --- a/lib/gtfs/reducers/filter.js +++ b/lib/gtfs/reducers/filter.js @@ -51,7 +51,7 @@ const gtfsFilter = (state: FilterState = defaultState, action: Action): FilterSt }) case 'SET_ACTIVE_FEEDVERSION': return update(state, { - comparedVersion: {$set: action.payload ? action.payload.previousVersionId : null}, + comparedVersion: {$set: null}, showAllRoutesOnMap: {$set: false}, patternFilter: {$set: null}, routeFilter: {$set: null}, From ae230d68aa4b3b1b97d137f9ba63f5a036996e8f Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:48:02 -0500 Subject: [PATCH 110/553] refactor(manager/actions/feeds): Tweak redirect and move to fetchFeedSource. --- lib/manager/actions/feeds.js | 8 ++++++++ lib/manager/actions/status.js | 11 ----------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/manager/actions/feeds.js b/lib/manager/actions/feeds.js index db0b401de..375850c86 100644 --- a/lib/manager/actions/feeds.js +++ b/lib/manager/actions/feeds.js @@ -141,6 +141,14 @@ export function fetchFeedSource (feedSourceId: string) { dispatch(fetchRelatedTables(feedSource)) return feedSource }) + .then(() => { + // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. + // (If user is not looking at this feed, don't navigate away from their current page.) + const newVersionPath = `/feed/${feedSourceId}` + if (browserHistory.getCurrentLocation().pathname.startsWith(`${newVersionPath}/version/`)) { + browserHistory.push(newVersionPath) + } + }) } } diff --git a/lib/manager/actions/status.js b/lib/manager/actions/status.js index 87fe75a45..8a37bb610 100644 --- a/lib/manager/actions/status.js +++ b/lib/manager/actions/status.js @@ -260,17 +260,6 @@ export function handleFinishedJob (job: ServerJob) { } } break - case 'PROCESS_FEED': - // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. - // It is the same path (without version number) as the link shown for this job status. - // (If user is not looking at this feed, don't navigate away from their current page.) - if (job.feedSourceId) { - const newVersionPath = `/feed/${job.feedSourceId}` - if (browserHistory.getCurrentLocation().pathname.startsWith(newVersionPath)) { - browserHistory.push(newVersionPath) - } - } - break default: console.warn(`No completion step defined for job type ${job.type}`) break From 00e5d75c37bc987ec5abefee1ee6a638421a0589 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 3 Mar 2021 11:29:10 -0500 Subject: [PATCH 111/553] Revert "refactor(manager/actions/feeds): Tweak redirect and move to fetchFeedSource." This reverts commit ae230d68aa4b3b1b97d137f9ba63f5a036996e8f. --- lib/manager/actions/feeds.js | 8 -------- lib/manager/actions/status.js | 11 +++++++++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/manager/actions/feeds.js b/lib/manager/actions/feeds.js index 375850c86..db0b401de 100644 --- a/lib/manager/actions/feeds.js +++ b/lib/manager/actions/feeds.js @@ -141,14 +141,6 @@ export function fetchFeedSource (feedSourceId: string) { dispatch(fetchRelatedTables(feedSource)) return feedSource }) - .then(() => { - // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. - // (If user is not looking at this feed, don't navigate away from their current page.) - const newVersionPath = `/feed/${feedSourceId}` - if (browserHistory.getCurrentLocation().pathname.startsWith(`${newVersionPath}/version/`)) { - browserHistory.push(newVersionPath) - } - }) } } diff --git a/lib/manager/actions/status.js b/lib/manager/actions/status.js index 8a37bb610..87fe75a45 100644 --- a/lib/manager/actions/status.js +++ b/lib/manager/actions/status.js @@ -260,6 +260,17 @@ export function handleFinishedJob (job: ServerJob) { } } break + case 'PROCESS_FEED': + // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. + // It is the same path (without version number) as the link shown for this job status. + // (If user is not looking at this feed, don't navigate away from their current page.) + if (job.feedSourceId) { + const newVersionPath = `/feed/${job.feedSourceId}` + if (browserHistory.getCurrentLocation().pathname.startsWith(newVersionPath)) { + browserHistory.push(newVersionPath) + } + } + break default: console.warn(`No completion step defined for job type ${job.type}`) break From e523505e7713ae582879443a8c57a0bafd70cf00 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 3 Mar 2021 11:44:54 -0500 Subject: [PATCH 112/553] refactor(manager/actions/status): Move redirect to under VALIDATE_FEED. --- lib/manager/actions/status.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/manager/actions/status.js b/lib/manager/actions/status.js index 87fe75a45..f51ae531b 100644 --- a/lib/manager/actions/status.js +++ b/lib/manager/actions/status.js @@ -12,7 +12,7 @@ import { fetchFeedSource } from './feeds' import { fetchProjectWithFeeds } from './projects' import { downloadSnapshotViaCredentials } from '../../editor/actions/snapshots' -import type {DataToolsConfig, MergeFeedsResult, ServerJob} from '../../types' +import type {DataToolsConfig, Feed, MergeFeedsResult, ServerJob} from '../../types' import type {dispatchFn, getStateFn} from '../../types/reducers' type ErrorMessage = { @@ -191,6 +191,15 @@ export function handleFinishedJob (job: ServerJob) { return } dispatch(fetchFeedSource(job.feedSourceId)) + .then((feedSource: Feed) => { + // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. + // (If user is not looking at this feed, don't navigate away from their current page.) + const newVersionPath = `/feed/${feedSource.id}` + if (browserHistory.getCurrentLocation().pathname.startsWith(`${newVersionPath}/version/`)) { + browserHistory.push(newVersionPath) + } + }) + if (isExtensionEnabled('mtc')) { const firstDate = job.validationResult && job.validationResult.firstCalendarDate const now = moment().startOf('day') @@ -260,17 +269,6 @@ export function handleFinishedJob (job: ServerJob) { } } break - case 'PROCESS_FEED': - // If viewing a particular feed, navigate to a new feed version as soon as it becomes available. - // It is the same path (without version number) as the link shown for this job status. - // (If user is not looking at this feed, don't navigate away from their current page.) - if (job.feedSourceId) { - const newVersionPath = `/feed/${job.feedSourceId}` - if (browserHistory.getCurrentLocation().pathname.startsWith(newVersionPath)) { - browserHistory.push(newVersionPath) - } - } - break default: console.warn(`No completion step defined for job type ${job.type}`) break From 03695eda1153b68d93751b1f0d27738edc2b41b1 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 8 Mar 2021 17:55:00 -0500 Subject: [PATCH 113/553] refactor: Remove comparedVersionIndex prop. --- .../components/version/FeedVersionDetails.js | 2 -- .../components/version/FeedVersionNavigator.js | 9 ++++----- .../components/version/FeedVersionTabs.js | 8 +++----- .../components/version/FeedVersionViewer.js | 12 ++++-------- .../version/VersionComparisonDropdown.js | 18 +++++++++--------- .../containers/ActiveFeedVersionNavigator.js | 6 ++---- 6 files changed, 22 insertions(+), 33 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index ec703cd06..3be4d4b21 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -23,7 +23,6 @@ import type {ManagerUserState} from '../../../types/reducers' type Props = { comparedVersion: ?FeedVersion, - comparedVersionIndex: ?number, feedSource: Feed, gtfsPlusValidation: GtfsPlusValidation, mergeVersions: typeof versionsActions.mergeVersions, @@ -84,7 +83,6 @@ export default class FeedVersionDetails extends Component { render () { const { comparedVersion, - comparedVersionIndex, feedSource, gtfsPlusValidation, user, diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 222895874..090c03f87 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -26,7 +26,7 @@ import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types' import type {GtfsState, ManagerUserState} from '../../../types/reducers' type Props = ContainerProps & { - comparedVersionIndex: number, + comparedVersion?: FeedVersion, createDeploymentFromFeedSource: typeof deploymentActions.createDeploymentFromFeedSource, deleteFeedVersion: typeof versionsActions.deleteFeedVersion, downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken, @@ -141,7 +141,7 @@ export default class FeedVersionNavigator extends Component { fontWeight: 'bold' } const { - comparedVersionIndex, + comparedVersion, deleteDisabled, deleteFeedVersion, disabled, @@ -304,7 +304,7 @@ export default class FeedVersionNavigator extends Component { { void, @@ -73,7 +72,6 @@ export default class FeedVersionTabs extends Component { const { // FIXME: prop drilling. comparedVersion, - comparedVersionIndex, feedVersionIndex, isochroneBand, onChangeIsochroneBand, @@ -115,7 +113,7 @@ export default class FeedVersionTabs extends Component { {numeral(value).format('0a')} - {comparedVersion && comparedVersionIndex && + {comparedVersion && // Apply a zero-width to superscript so that `value` // above always appears centered. { }} > diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 6584931e2..3921edfc1 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -33,8 +33,7 @@ import type {Feed, FeedVersion, GtfsPlusValidation, Note, Project} from '../../. import type {GtfsState, ManagerUserState} from '../../../types/reducers' export type Props = { - comparedVersion: ?FeedVersion, - comparedVersionIndex: ?number, + comparedVersion?: FeedVersion, deleteDisabled: ?boolean, deleteFeedVersion: typeof versionsActions.deleteFeedVersion, downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken, @@ -70,7 +69,6 @@ export default class FeedVersionViewer extends Component { render () { const { comparedVersion, - comparedVersionIndex, feedSource, feedVersionIndex, listView, @@ -110,7 +108,6 @@ export default class FeedVersionViewer extends Component { @@ -146,7 +143,6 @@ export default class FeedVersionViewer extends Component { type SelectorProps = { comparedVersion: ?FeedVersion, - comparedVersionIndex: ?number, feedVersionIndex: number, gtfsPlusValidation: GtfsPlusValidation, version: FeedVersion, @@ -155,7 +151,7 @@ type SelectorProps = { class VersionSectionSelector extends Component { _renderIssuesLabel = () => { - const { version, comparedVersion, comparedVersionIndex } = this.props + const { version, comparedVersion } = this.props const { validationResult, validationSummary, feedLoadResult } = version const tableFatalExceptions = getTableFatalExceptions(version) @@ -180,11 +176,11 @@ class VersionSectionSelector extends Component { : validationSummary.errorCount let diffLabel - if (comparedVersion && comparedVersionIndex) { + if (comparedVersion) { const diff = validationSummary.errorCount - comparedVersion.validationSummary.errorCount diffLabel = ( diff --git a/lib/manager/components/version/VersionComparisonDropdown.js b/lib/manager/components/version/VersionComparisonDropdown.js index 6dafb3216..5fd3e31e0 100644 --- a/lib/manager/components/version/VersionComparisonDropdown.js +++ b/lib/manager/components/version/VersionComparisonDropdown.js @@ -11,7 +11,7 @@ import type {Feed, FeedVersion} from '../../../types' import type {AppState} from '../../../types/reducers' type Props = { - comparedVersionIndex?: number, + comparedVersion?: FeedVersion, feedSource: Feed, setComparedVersionIndex: typeof versionsActions.setComparedVersionIndex, version: FeedVersion, @@ -23,8 +23,10 @@ type Props = { * active version. */ class VersionComparisonDropdown extends Component { + //Fix this--- _onSelectComparedVersion = (index: number) => { - const {comparedVersionIndex, feedSource, setComparedVersionIndex} = this.props + const {comparedVersion, feedSource, setComparedVersionIndex} = this.props + const comparedVersionIndex = comparedVersion ? comparedVersion.version : -1 if (index !== comparedVersionIndex) { setComparedVersionIndex(feedSource, index) } else { @@ -34,15 +36,13 @@ class VersionComparisonDropdown extends Component { render () { const { - comparedVersionIndex, + comparedVersion, versions, version } = this.props let title = 'Compare versions' - let comparedFeedVersion - if (comparedVersionIndex !== null && comparedVersionIndex !== undefined) { - comparedFeedVersion = versions[comparedVersionIndex - 1] - title = `Comparing to version ${comparedVersionIndex}` + if (comparedVersion) { + title = `Comparing to version ${comparedVersion.version}` } // This custom formatter adds and hides the active version in the list to @@ -59,7 +59,7 @@ class VersionComparisonDropdown extends Component { id: 'prevVersionSelector', onSelect: this._onSelectComparedVersion }} - extraOptions={comparedFeedVersion + extraOptions={comparedVersion ? [ { onClick: null, @@ -74,7 +74,7 @@ class VersionComparisonDropdown extends Component { } itemFormatter={itemFormatter} title={title} - version={comparedFeedVersion} + version={comparedVersion} versions={versions} /> ) diff --git a/lib/manager/containers/ActiveFeedVersionNavigator.js b/lib/manager/containers/ActiveFeedVersionNavigator.js index 663f3fca1..981ab121c 100644 --- a/lib/manager/containers/ActiveFeedVersionNavigator.js +++ b/lib/manager/containers/ActiveFeedVersionNavigator.js @@ -39,7 +39,7 @@ export type Props = { } const mapStateToProps = (state: AppState, ownProps: Props) => { - let feedVersionIndex, comparedVersionIndex + let feedVersionIndex const {routeParams, feedSource} = ownProps const {feedVersions} = feedSource const {feedVersionIndex: fvi, subpage} = routeParams @@ -74,8 +74,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { version = sortedVersions[feedVersionIndex - 1] if (gtfs.filter.comparedVersion) { - comparedVersionIndex = sortedVersions.findIndex(feedVer => feedVer.id === gtfs.filter.comparedVersion) + 1 - comparedVersion = sortedVersions[comparedVersionIndex - 1] + comparedVersion = sortedVersions.find(feedVer => feedVer.id === gtfs.filter.comparedVersion) } } // FIXME: prop drilling. @@ -83,7 +82,6 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { gtfs, hasVersions, feedVersionIndex, - comparedVersionIndex, gtfsPlusValidation: state.gtfsplus.validation, sortedVersions, user: state.user, From 2f0c25f98d5095e97e1b5f6624389aab4209823a Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 8 Mar 2021 18:16:54 -0500 Subject: [PATCH 114/553] refactor(manager/actions/versions): Remove action setComparedVersionIndex. --- lib/manager/actions/versions.js | 21 +------------------ .../version/FeedVersionNavigator.js | 1 - .../version/VersionComparisonDropdown.js | 19 +++++++++-------- 3 files changed, 11 insertions(+), 30 deletions(-) diff --git a/lib/manager/actions/versions.js b/lib/manager/actions/versions.js index 95027a186..2bcb2b511 100644 --- a/lib/manager/actions/versions.js +++ b/lib/manager/actions/versions.js @@ -103,7 +103,7 @@ export function setActiveVersion (version: FeedVersion) { // Sets the compared feed version. export const setComparedVersion = createAction( 'SET_COMPARED_FEEDVERSION', - (payload: FeedVersion) => payload + (payload: ?FeedVersion) => payload ) const uploadingFeed = createVoidPayloadAction('UPLOADING_FEED') @@ -595,25 +595,6 @@ export function setVersionIndex ( } } -export function setComparedVersionIndex ( - feed: Feed, - index: ?number, - push?: boolean = true, - isPublic?: boolean -) { - return function (dispatch: dispatchFn, getState: getStateFn) { - if (feed.feedVersions) { - dispatch(setComparedVersion(feed.feedVersions[index - 1])) - // TODO: add support for URL/browser history, e.g.: - // if (push) { - // browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${activeIndex}/compareto/${index}`) - // } - } else { - console.warn('No feed versions for feed were found.', feed) - } - } -} - /** * Starts the export shapes server job for a particular feed version. * diff --git a/lib/manager/components/version/FeedVersionNavigator.js b/lib/manager/components/version/FeedVersionNavigator.js index 090c03f87..0abd3e155 100644 --- a/lib/manager/components/version/FeedVersionNavigator.js +++ b/lib/manager/components/version/FeedVersionNavigator.js @@ -305,7 +305,6 @@ export default class FeedVersionNavigator extends Component { diff --git a/lib/manager/components/version/VersionComparisonDropdown.js b/lib/manager/components/version/VersionComparisonDropdown.js index 5fd3e31e0..7c2a5e173 100644 --- a/lib/manager/components/version/VersionComparisonDropdown.js +++ b/lib/manager/components/version/VersionComparisonDropdown.js @@ -12,8 +12,7 @@ import type {AppState} from '../../../types/reducers' type Props = { comparedVersion?: FeedVersion, - feedSource: Feed, - setComparedVersionIndex: typeof versionsActions.setComparedVersionIndex, + setComparedVersion: typeof versionsActions.setComparedVersion, version: FeedVersion, versions: Array } @@ -23,17 +22,19 @@ type Props = { * active version. */ class VersionComparisonDropdown extends Component { - //Fix this--- _onSelectComparedVersion = (index: number) => { - const {comparedVersion, feedSource, setComparedVersionIndex} = this.props + const {comparedVersion, setComparedVersion, versions} = this.props const comparedVersionIndex = comparedVersion ? comparedVersion.version : -1 + // Note: index is 1-based (the menu item at index 0 is a caption). if (index !== comparedVersionIndex) { - setComparedVersionIndex(feedSource, index) - } else { - setComparedVersionIndex(feedSource, null) + setComparedVersion(versions.find(v => v.version === index))//FIXME:[QBD] pass sorted versions to selector? } } + _onClearComparedVersion = () => { + this.props.setComparedVersion(null) + } + render () { const { comparedVersion, @@ -62,7 +63,7 @@ class VersionComparisonDropdown extends Component { extraOptions={comparedVersion ? [ { - onClick: null, + onClick: this._onClearComparedVersion, text: 'Exit compare mode' } ] @@ -86,7 +87,7 @@ const mapStateToProps = (state: AppState, ownProps: {}) => { } const mapDispatchToProps = { - setComparedVersionIndex: versionsActions.setComparedVersionIndex + setComparedVersion: versionsActions.setComparedVersion } export default connect(mapStateToProps, mapDispatchToProps)(VersionComparisonDropdown) From 909bd7ae9e0d164e79106361966733de7744cb2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Mar 2021 01:04:24 +0000 Subject: [PATCH 115/553] build(deps): bump elliptic from 6.5.3 to 6.5.4 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4) Signed-off-by: dependabot[bot] --- yarn.lock | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index 70d434802..0e62fc728 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2347,10 +2347,10 @@ blueimp-md5@^2.3.0: resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.10.0.tgz#02f0843921f90dca14f5b8920a38593201d6964d" integrity sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== body-parser@1.18.3: version "1.18.3" @@ -2456,7 +2456,7 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -4489,17 +4489,17 @@ element-class@^0.2.0: integrity sha1-nTu9B2f5AT744cjr5yLBQCpgBQ4= elliptic@^6.0.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" email-validator@^2.0.3: version "2.0.4" @@ -6253,7 +6253,7 @@ history@^3.0.0: query-string "^4.2.2" warning "^3.0.0" -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -9028,7 +9028,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +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" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= From 00445ee33e7b02c77a650d4a4098e64b6c528c67 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 8 Mar 2021 17:55:45 -0800 Subject: [PATCH 116/553] refactor: address various PR review comments See https://github.com/ibi-group/datatools-ui/pull/638 --- .../components/deployment/CustomFileEditor.js | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/manager/components/deployment/CustomFileEditor.js b/lib/manager/components/deployment/CustomFileEditor.js index 3676063cc..9525a39fb 100644 --- a/lib/manager/components/deployment/CustomFileEditor.js +++ b/lib/manager/components/deployment/CustomFileEditor.js @@ -46,8 +46,7 @@ export default class CustomFileEditor extends Component { const {fileSource, model: customFile} = this.state - return (fileSource === 'uri' && !!customFile.uri) || - (!!customFile.contents && !!customFile.filename) + return fileSource === 'uri' || Boolean(customFile.filename) } /** @@ -55,7 +54,7 @@ export default class CustomFileEditor extends Component { const {model: customFile} = this.state - return !!customFile.contents || !!customFile.uri + return Boolean(customFile.contents) || Boolean(customFile.uri) } /** @@ -162,18 +161,28 @@ export default class CustomFileEditor extends Component { + const { customFile } = this.props const isEditing = this._isEditing() const canEdit = this._canEdit() - const either = !isEditing && !canEdit + const isNewFile = Object.keys(customFile).every(key => !customFile[key]) return ( - + {canEdit && + + } + {isEditing && !isNewFile && + + } {isEditing &&
    )}
    - {/* Components below are all rendered as direct children of this div to accommodate - drawing the "today" line marker above the FeedSpan, while keeping it - under the FeedStartLabel and FeedEndLabel contents. - FIXME[React 16+]: Extract FeedStartLabel, FeedEndLabel, FeedSpan into <>... markup. - */} - - - + {this.renderFeedSpan('active', activeChartProps)} {comparedVersionProp && hasGap && { versionStartDate={earliestEnd} versionEndDate={latestStart} />} - {comparedVersionProp && } - {comparedVersionProp && } - {comparedVersionProp && } + {comparedVersionProp && this.renderFeedSpan('compared', comparedChartProps)} {showToday && }
    @@ -119,21 +123,35 @@ export default class FeedVersionSpanChart extends Component { } } -/** Renders the validity span of one feed using the given props. */ -const FeedSpan = ({ +/** + * Compute label position and sizing info. + */ +function getRenderVars ({ firstDate, lastDate, - isServiceGap = false, - top, versionStartDate, - versionEndDate -}) => { + versionEndDate, + versionLabel +}) { const totalDays = lastDate.diff(firstDate, 'days') - const versionOffset = versionStartDate.diff(firstDate, 'days') const daysActive = versionEndDate.diff(versionStartDate, 'days') - const relativeLength = daysActive / totalDays - const relativeOffset = versionOffset / totalDays + const versionOffset = versionStartDate.diff(firstDate, 'days') + + return { + daysActive, + endLabel: versionEndDate.format(DATE_FORMAT), + relativeLength: daysActive / totalDays, + relativeOffset: versionOffset / totalDays, + startLabel: versionStartDate.format(DATE_FORMAT), + totalDays, + versionOffset + } +} +/** Renders the validity span of one feed using the given props. */ +const FeedSpan = props => { + const { isServiceGap = false, top } = props + const { daysActive, relativeLength, relativeOffset } = getRenderVars(props) return ( { - const totalDays = lastDate.diff(firstDate, 'days') - const versionOffset = versionStartDate.diff(firstDate, 'days') - const relativeOffset = versionOffset / totalDays - const startLabel = versionStartDate.format(DATE_FORMAT) - +const FeedStartLabel = props => { + const { top } = props + const { relativeOffset, startLabel, totalDays, versionOffset } = getRenderVars(props) return ( { - const totalDays = lastDate.diff(firstDate, 'days') - const versionOffset = versionStartDate.diff(firstDate, 'days') - const daysActive = versionEndDate.diff(versionStartDate, 'days') - const endLabel = versionEndDate.format(DATE_FORMAT) - const relativeLength = daysActive / totalDays - const relativeOffset = versionOffset / totalDays +const FeedEndLabel = props => { + const { top, versionLabel } = props + const { + daysActive, + endLabel, + relativeLength, + relativeOffset, + totalDays, + versionOffset + } = getRenderVars(props) return ( { const totalDays = lastDate.diff(firstDate, 'days') - const today = moment() const todayOffset = today.diff(firstDate, 'days') From d7a28adf9e869e6f72fea4d618a213ccae954b11 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:49:27 -0400 Subject: [PATCH 131/553] refactor: Minor tweaks --- .../components/version/FeedVersionSpanChart.js | 6 +++--- .../components/version/VersionComparisonDropdown.js | 13 ++++--------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 96f44b743..6008287fa 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -36,9 +36,9 @@ const TODAY_MARKER_ZINDEX = 9998 export default class FeedVersionSpanChart extends Component { /** * Render a span of the chart. - * Note: Components below are all rendered as direct children of the parent element to accommodate - * drawing the "today" line marker above the FeedSpan, while keeping that marker - * under the FeedStartLabel and FeedEndLabel contents. + * Note: Components below are all rendered as direct children of the parent element + * (hence the returned array), so that the "today" marker appears + * above the FeedSpan while remaining below the FeedStartLabel and FeedEndLabel contents. * FIXME[React 16.2+]: Extract into <>... markup. */ renderFeedSpan = (name: string, props: any) => [ diff --git a/lib/manager/components/version/VersionComparisonDropdown.js b/lib/manager/components/version/VersionComparisonDropdown.js index 7c2a5e173..5cf4c8176 100644 --- a/lib/manager/components/version/VersionComparisonDropdown.js +++ b/lib/manager/components/version/VersionComparisonDropdown.js @@ -60,15 +60,10 @@ class VersionComparisonDropdown extends Component { id: 'prevVersionSelector', onSelect: this._onSelectComparedVersion }} - extraOptions={comparedVersion - ? [ - { - onClick: this._onClearComparedVersion, - text: 'Exit compare mode' - } - ] - : null - } + extraOptions={comparedVersion && [{ + onClick: this._onClearComparedVersion, + text: 'Exit compare mode' + }]} header={versions.length < 2 ? 'Load another version to enable comparison' : 'Select a version to compare with' From dbf0d430886ff7f0c7a7f96c2785a474754dbff1 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 16 Mar 2021 18:06:42 -0400 Subject: [PATCH 132/553] refactor: Sort vars. --- lib/manager/components/version/FeedVersionDetails.js | 1 + lib/manager/components/version/FeedVersionViewer.js | 4 ++-- lib/manager/containers/ActiveFeedVersionNavigator.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/manager/components/version/FeedVersionDetails.js b/lib/manager/components/version/FeedVersionDetails.js index 3be4d4b21..b79f16d10 100644 --- a/lib/manager/components/version/FeedVersionDetails.js +++ b/lib/manager/components/version/FeedVersionDetails.js @@ -18,6 +18,7 @@ import {BLOCKING_ERROR_TYPES} from '../../util/version' import FeedVersionSpanChart from './FeedVersionSpanChart' import VersionRetrievalBadge from './VersionRetrievalBadge' import VersionSelectorDropdown from './VersionSelectorDropdown' + import type {FeedVersion, GtfsPlusValidation, Bounds, Feed} from '../../../types' import type {ManagerUserState} from '../../../types/reducers' diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 3921edfc1..5b2040602 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -151,8 +151,8 @@ type SelectorProps = { class VersionSectionSelector extends Component { _renderIssuesLabel = () => { - const { version, comparedVersion } = this.props - const { validationResult, validationSummary, feedLoadResult } = version + const { comparedVersion, version } = this.props + const { feedLoadResult, validationResult, validationSummary } = version const tableFatalExceptions = getTableFatalExceptions(version) const hasCriticalError = validationSummary.loadStatus !== 'SUCCESS' || diff --git a/lib/manager/containers/ActiveFeedVersionNavigator.js b/lib/manager/containers/ActiveFeedVersionNavigator.js index 981ab121c..d018526e2 100644 --- a/lib/manager/containers/ActiveFeedVersionNavigator.js +++ b/lib/manager/containers/ActiveFeedVersionNavigator.js @@ -63,7 +63,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => { ? feedVersions.sort(versionsLastUpdatedComparator) : [] - let version, comparedVersion + let comparedVersion, version if ( hasVersions && From 4b1a300ae1e2f573081c305d6b9ddc7cb418ab69 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 17 Mar 2021 09:43:41 -0400 Subject: [PATCH 133/553] refactor(types/reducers): Use FeedVersion in FilterState. --- lib/types/reducers.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/types/reducers.js b/lib/types/reducers.js index 28065860c..d6aa53f0b 100644 --- a/lib/types/reducers.js +++ b/lib/types/reducers.js @@ -9,6 +9,7 @@ import type { Alert, ControlPoint, DataToolsConfig, + FeedVersion, FetchStatus, GtfsPlusValidation, GtfsRoute, @@ -281,7 +282,7 @@ export type DateTimeFilter = { export type FilterState = { activeFeeds: any, - comparedVersion: any, + comparedVersion: FeedVersion, dateTimeFilter: DateTimeFilter, loadedFeeds: Array, map: MapFilter, @@ -295,7 +296,7 @@ export type FilterState = { showArrivals: boolean, timepointFilter: boolean, typeFilter: Array, - version: any + version: FeedVersion } export type ValidationTrip = { From 6a7d0de8c1f0b0f1a40428a4a93acbc8cf16bf2f Mon Sep 17 00:00:00 2001 From: Rob Gregg Date: Fri, 19 Mar 2021 10:04:31 +0000 Subject: [PATCH 134/553] improvement(AlertEditor.js): MTC Service Alerts: Changes to Alert Field Character Limit Validation Changed character count down to count up. Removed popup validation for title and description. Show errors when over characater limit 647 --- lib/alerts/components/AlertEditor.js | 59 ++++++++++++---------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/lib/alerts/components/AlertEditor.js b/lib/alerts/components/AlertEditor.js index 0e1e26fd2..7be5e4166 100644 --- a/lib/alerts/components/AlertEditor.js +++ b/lib/alerts/components/AlertEditor.js @@ -1,29 +1,29 @@ // @flow -import Icon from '@conveyal/woonerf/components/icon' -import moment from 'moment' +import * as activeAlertActions from '../actions/activeAlert' +import * as alertActions from '../actions/alerts' + +import type {Alert, Feed, GtfsRoute, GtfsStop, Project} from '../../types' +import {Button, ButtonToolbar, Col, ControlLabel, FormControl, FormGroup, Grid, Row} from 'react-bootstrap' +import {CAUSES, EFFECTS, isNew} from '../util' import React, {Component} from 'react' -import {Grid, Row, Col, ButtonToolbar, Button, FormControl, ControlLabel, FormGroup} from 'react-bootstrap' -import DateTimeField from 'react-bootstrap-datetimepicker' -import {browserHistory} from 'react-router' -import Toggle from 'react-toggle' import AffectedServices from './AffectedServices' -import * as alertActions from '../actions/alerts' -import * as activeAlertActions from '../actions/activeAlert' +import type {Props as ContainerProps} from '../containers/ActiveAlertEditor' +import DateTimeField from 'react-bootstrap-datetimepicker' +import GlobalGtfsFilter from '../../gtfs/containers/GlobalGtfsFilter' +import GtfsMapSearch from '../../gtfs/components/gtfsmapsearch' +import Icon from '@conveyal/woonerf/components/icon' import Loading from '../../common/components/Loading' import ManagerPage from '../../common/components/ManagerPage' +import type {ManagerUserState} from '../../types/reducers' import PageNotFound from '../../common/components/PageNotFound' -import {isModuleEnabled} from '../../common/util/config' +import Toggle from 'react-toggle' +import {browserHistory} from 'react-router' import {checkEntitiesForFeeds} from '../../common/util/permissions' +import {isModuleEnabled} from '../../common/util/config' +import moment from 'moment' import toSentenceCase from '../../common/util/to-sentence-case' -import GtfsMapSearch from '../../gtfs/components/gtfsmapsearch' -import GlobalGtfsFilter from '../../gtfs/containers/GlobalGtfsFilter' -import {CAUSES, EFFECTS, isNew} from '../util' - -import type {Props as ContainerProps} from '../containers/ActiveAlertEditor' -import type {Alert, Feed, GtfsRoute, GtfsStop, Project} from '../../types' -import type {ManagerUserState} from '../../types/reducers' type Props = ContainerProps & { activeFeeds: Array, @@ -78,13 +78,6 @@ export default class AlertEditor extends Component { if (!title.trim()) { return window.alert('You must specify an alert title') } - // alert title/description must meet character limits (for display purposes) - if (title.length > ALERT_TITLE_CHAR_LIMIT) { - return window.alert(`Alert title must be ${ALERT_TITLE_CHAR_LIMIT} characters or less`) - } - if (description && description.length > ALERT_DESCRIPTION_CHAR_LIMIT) { - return window.alert(`Alert description must be ${ALERT_DESCRIPTION_CHAR_LIMIT} characters or less`) - } if (!end || !start || !momentEnd.isValid() || !momentStart.isValid()) { return window.alert('Alert must have a valid start and end date') } @@ -140,12 +133,8 @@ export default class AlertEditor extends Component { } = this.props if (!isModuleEnabled('alerts')) return if (!alert) return - const titleCharactersRemaining = alert.title - ? ALERT_TITLE_CHAR_LIMIT - alert.title.length - : ALERT_TITLE_CHAR_LIMIT - const descriptionCharactersRemaining = alert.description - ? ALERT_DESCRIPTION_CHAR_LIMIT - alert.description.length - : ALERT_DESCRIPTION_CHAR_LIMIT + const titleCharacterCount = alert.title ? alert.title.length : 0 + const descriptionCharactersCount = alert.description ? alert.description.length : 0 const canPublish = alert.affectedEntities.length && checkEntitiesForFeeds(alert.affectedEntities, publishableFeeds) const canEdit = checkEntitiesForFeeds(alert.affectedEntities, editableFeeds) @@ -216,18 +205,19 @@ export default class AlertEditor extends Component { {' '} CHAR_WARNING_LIMIT + titleCharacterCount > CHAR_WARNING_LIMIT && titleCharacterCount <= ALERT_TITLE_CHAR_LIMIT ? 'text-muted' : 'text-danger' } style={{fontWeight: 400}}> - {titleCharactersRemaining} + {titleCharacterCount}
    + {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT ? 'WARNING: Alert title longer than 100 characters may get truncated in some dissemination channels. ' : ''} Note: alert title serves as text for eTID alerts. Use descriptive language so it can serve as a standalone - alert. + alert.
    @@ -297,12 +287,13 @@ export default class AlertEditor extends Component { {' '} CHAR_WARNING_LIMIT + descriptionCharactersCount > CHAR_WARNING_LIMIT && descriptionCharactersCount <= ALERT_DESCRIPTION_CHAR_LIMIT ? 'text-muted' : 'text-danger' } style={{fontWeight: 400}}> - {descriptionCharactersRemaining} + {descriptionCharactersCount} +

    {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT ? 'WARNING: Alert description longer than 1200 characters may get truncated in some dissemination channels. ' : ''}

    Date: Fri, 19 Mar 2021 18:16:36 -0400 Subject: [PATCH 135/553] feat(FeedTransformation): Add normalize field transformation --- i18n/english.yml | 3 ++ lib/common/constants/index.js | 3 +- .../transform/FeedTransformRules.js | 3 +- .../transform/FeedTransformation.js | 51 +++++++++++++++++-- lib/types/index.js | 1 + 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/i18n/english.yml b/i18n/english.yml index 2d3fccbc7..951c0a550 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -244,6 +244,9 @@ components: DeleteRecordsTransformation: label: Delete records from %tablePlaceholder% name: Delete records transformation + NormalizeFieldTransformation: + label: Normalize fields + name: Normalize fields transformation ReplaceFileFromStringTransformation: label: Replace %tablePlaceholder% from %filePlaceholder% name: Replace file from string transformation diff --git a/lib/common/constants/index.js b/lib/common/constants/index.js index 3eb71f69d..dc11026f9 100644 --- a/lib/common/constants/index.js +++ b/lib/common/constants/index.js @@ -34,6 +34,7 @@ export const RETRIEVAL_METHODS = Object.freeze({ export const FEED_TRANSFORMATION_TYPES = Object.freeze({ DELETE_RECORDS: 'DeleteRecordsTransformation', + NORMALIZE_FIELDS: 'NormalizeFieldTransformation', REPLACE_FILE_FROM_VERSION: 'ReplaceFileFromVersionTransformation', - REPLACE_FILE_FROM_STRING: 'ReplaceFileFromStringTransformation' + REPLACE_FILE_FROM_STRING: 'ReplaceFileFromStringTransformation', }) diff --git a/lib/manager/components/transform/FeedTransformRules.js b/lib/manager/components/transform/FeedTransformRules.js index 180cdfbee..2d5d094e7 100644 --- a/lib/manager/components/transform/FeedTransformRules.js +++ b/lib/manager/components/transform/FeedTransformRules.js @@ -32,7 +32,8 @@ function newFeedTransformation (type: string = 'ReplaceFileFromVersionTransforma const feedTransformationTypes = [ 'ReplaceFileFromVersionTransformation', - 'ReplaceFileFromStringTransformation' + 'ReplaceFileFromStringTransformation', + 'NormalizeFieldTransformation' ] type TransformRulesProps = { diff --git a/lib/manager/components/transform/FeedTransformation.js b/lib/manager/components/transform/FeedTransformation.js index b0bd21040..385526b7b 100644 --- a/lib/manager/components/transform/FeedTransformation.js +++ b/lib/manager/components/transform/FeedTransformation.js @@ -27,8 +27,8 @@ type Props = { * Component that renders fields for a single feed transformation * (e.g., ReplaceFileFromStringTransformation). */ -export default class FeedTransformation extends Component { - state = { csvData: null } +export default class FeedTransformation extends Component { + state = { csvData: null, fieldName: null } _getFieldsForType = (type: string) => { const {feedSource, transformation} = this.props @@ -55,7 +55,7 @@ export default class FeedTransformation extends Component ) break - case 'ReplaceFileFromStringTransformation': + case 'ReplaceFileFromStringTransformation': { const inputIsUnchanged = this.state.csvData === null const csvData = inputIsUnchanged ? transformation.csvData @@ -96,6 +96,41 @@ export default class FeedTransformation extends Component ) break + } + case 'NormalizeFieldTransformation': { + const inputIsUnchanged = this.state.fieldName === null + const fieldName = inputIsUnchanged + ? transformation.fieldName + : this.state.fieldName + fields.push( +
    + +
    + +
    + + This transform will: +
      +
    • Capitalize bus stop names (for bus stops in all-caps),
    • +
    • Replace '+' and '&' with 'and', '@' with 'at',
    • +
    • Remove contents within parentheses.
    • +
    +
    + ) + break + } default: break } @@ -141,6 +176,16 @@ export default class FeedTransformation extends Component) => { + this.setState({fieldName: evt.target.value}) + } + + _onSaveFieldToNormalize = () => { + const fieldName = this.state.fieldName || null + this.setState({fieldName: null}) + this.props.onChange({fieldName}, this.props.index) + } + _onRemoveTransformation = () => { this.props.onRemove(this.props.index) } diff --git a/lib/types/index.js b/lib/types/index.js index d90e92872..c627f762e 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -295,6 +295,7 @@ export type FeedTransformation = { '@type': $Values, active: boolean, csvData?: string, + fieldName?: string, matchField?: string, matchValues?: Array, sourceVersionId?: string, From 88a2989b7c0a0216d1585eb403171cde4adbe228 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 22 Mar 2021 18:59:26 -0400 Subject: [PATCH 136/553] refactor(FeedTransformation): Make normalize steps optional, add cap exceptions. --- .../transform/FeedTransformation.js | 56 ++++++++++++++++--- lib/types/index.js | 5 ++ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/lib/manager/components/transform/FeedTransformation.js b/lib/manager/components/transform/FeedTransformation.js index 385526b7b..44593cba5 100644 --- a/lib/manager/components/transform/FeedTransformation.js +++ b/lib/manager/components/transform/FeedTransformation.js @@ -2,7 +2,7 @@ import Icon from '@conveyal/woonerf/components/icon' import React, {Component} from 'react' -import {Button} from 'react-bootstrap' +import {Button, Checkbox, FormControl, FormGroup} from 'react-bootstrap' import Select from 'react-select' import {getGtfsSpec, getGtfsPlusSpec, isModuleEnabled} from '../../../common/util/config' @@ -14,6 +14,7 @@ import type { FeedTransformation as FeedTransformationType, ReactSelectOption } from '../../../types' +import { transform } from 'lodash-es' type Props = { feedSource: Feed, @@ -101,7 +102,8 @@ export default class FeedTransformation extends Component

    This transform will: -
      -
    • Capitalize bus stop names (for bus stops in all-caps),
    • -
    • Replace '+' and '&' with 'and', '@' with 'at',
    • -
    • Remove contents within parentheses.
    • +
        +
      • + + Capitalize bus stop names + +
        Exceptions: + + + +
        +
      • +
      • + + Perform the following substitutions: + +
          +
        • Replace '+' and '&' with 'and', '@' with 'at',
        • +
        • Remove contents within parentheses.
        • +
        +
    ) @@ -180,6 +210,18 @@ export default class FeedTransformation extends Component) => { + this.props.onChange({capitalize: evt.target.checked}, this.props.index) + } + + _onChangeCapitalizeExceptions = (evt: SyntheticInputEvent) => { + this.props.onChange({capitalizeExceptions: evt.target.value.split(',')}, this.props.index) + } + + _onChangePerformSubstitutions = (evt: SyntheticInputEvent) => { + this.props.onChange({performSubstitutions: evt.target.checked}, this.props.index) + } + _onSaveFieldToNormalize = () => { const fieldName = this.state.fieldName || null this.setState({fieldName: null}) diff --git a/lib/types/index.js b/lib/types/index.js index c627f762e..083f695c1 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -294,6 +294,11 @@ export type FetchFrequency = $Values export type FeedTransformation = { '@type': $Values, active: boolean, + + capitalize?: boolean, + capitalizeExceptions?: Array, + performSubstitutions?: boolean, + csvData?: string, fieldName?: string, matchField?: string, From 1fc31f4e1ab426dffa9c8804413cc589b64e3aff Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Tue, 23 Mar 2021 14:35:30 -0700 Subject: [PATCH 137/553] Update lib/manager/components/deployment/DeploymentConfigurationsPanel.js Co-authored-by: Landon Reed --- .../deployment/DeploymentConfigurationsPanel.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/manager/components/deployment/DeploymentConfigurationsPanel.js b/lib/manager/components/deployment/DeploymentConfigurationsPanel.js index 1d354b02f..8898973fd 100644 --- a/lib/manager/components/deployment/DeploymentConfigurationsPanel.js +++ b/lib/manager/components/deployment/DeploymentConfigurationsPanel.js @@ -32,13 +32,8 @@ const TRIP_PLANNER_VERSIONS = [ ] function calculateCustomFileKey (customFile: CustomFile, idx: number): string { - return `${ - customFile.filename || '' - }-${ - customFile.contents || '' - }-${ - customFile.uri || '' - }-${idx}` + const {contents, filename, uri} = customFile + return `${filename || ''}-${contents || ''}-${uri || ''}-${idx}` } export default class DeploymentConfigurationsPanel extends Component<{ From 0e73511fbf4f2ca2152704f0dcb52c710bfdd604 Mon Sep 17 00:00:00 2001 From: Rob Gregg Date: Wed, 24 Mar 2021 17:56:26 +0000 Subject: [PATCH 138/553] refactor(AlertEditor.js): Refactored, removed formatted IDE code #647 --- lib/alerts/components/AlertEditor.js | 203 +++++++++++++++------------ 1 file changed, 113 insertions(+), 90 deletions(-) diff --git a/lib/alerts/components/AlertEditor.js b/lib/alerts/components/AlertEditor.js index 7be5e4166..35eddebe1 100644 --- a/lib/alerts/components/AlertEditor.js +++ b/lib/alerts/components/AlertEditor.js @@ -1,29 +1,29 @@ // @flow -import * as activeAlertActions from '../actions/activeAlert' -import * as alertActions from '../actions/alerts' - -import type {Alert, Feed, GtfsRoute, GtfsStop, Project} from '../../types' -import {Button, ButtonToolbar, Col, ControlLabel, FormControl, FormGroup, Grid, Row} from 'react-bootstrap' -import {CAUSES, EFFECTS, isNew} from '../util' +import Icon from '@conveyal/woonerf/components/icon' +import moment from 'moment' import React, {Component} from 'react' +import {Grid, Row, Col, ButtonToolbar, Button, FormControl, ControlLabel, FormGroup} from 'react-bootstrap' +import DateTimeField from 'react-bootstrap-datetimepicker' +import {browserHistory} from 'react-router' +import Toggle from 'react-toggle' import AffectedServices from './AffectedServices' -import type {Props as ContainerProps} from '../containers/ActiveAlertEditor' -import DateTimeField from 'react-bootstrap-datetimepicker' -import GlobalGtfsFilter from '../../gtfs/containers/GlobalGtfsFilter' -import GtfsMapSearch from '../../gtfs/components/gtfsmapsearch' -import Icon from '@conveyal/woonerf/components/icon' +import * as alertActions from '../actions/alerts' +import * as activeAlertActions from '../actions/activeAlert' import Loading from '../../common/components/Loading' import ManagerPage from '../../common/components/ManagerPage' -import type {ManagerUserState} from '../../types/reducers' import PageNotFound from '../../common/components/PageNotFound' -import Toggle from 'react-toggle' -import {browserHistory} from 'react-router' -import {checkEntitiesForFeeds} from '../../common/util/permissions' import {isModuleEnabled} from '../../common/util/config' -import moment from 'moment' +import {checkEntitiesForFeeds} from '../../common/util/permissions' import toSentenceCase from '../../common/util/to-sentence-case' +import GtfsMapSearch from '../../gtfs/components/gtfsmapsearch' +import GlobalGtfsFilter from '../../gtfs/containers/GlobalGtfsFilter' +import {CAUSES, EFFECTS, isNew} from '../util' + +import type {Props as ContainerProps} from '../containers/ActiveAlertEditor' +import type {Alert, Feed, GtfsRoute, GtfsStop, Project} from '../../types' +import type {ManagerUserState} from '../../types/reducers' type Props = ContainerProps & { activeFeeds: Array, @@ -96,7 +96,7 @@ export default class AlertEditor extends Component { _deleteAlert = () => this.props.deleteAlert(this.props.alert) _onChange = (evt: SyntheticInputEvent) => - this.props.setActiveProperty({[evt.target.name]: evt.target.value}) + this.props.setActiveProperty({[evt.target.name]: evt.target.value}) _onChangeEnd = (time: string) => this.props.setActiveProperty({end: +time}) @@ -133,79 +133,90 @@ export default class AlertEditor extends Component { } = this.props if (!isModuleEnabled('alerts')) return if (!alert) return - const titleCharacterCount = alert.title ? alert.title.length : 0 - const descriptionCharactersCount = alert.description ? alert.description.length : 0 - const canPublish = alert.affectedEntities.length && + const titleCharactersRemaining = alert.title + ? ALERT_TITLE_CHAR_LIMIT - alert.title.length + : ALERT_TITLE_CHAR_LIMIT + const descriptionCharactersRemaining = alert.description + ? ALERT_DESCRIPTION_CHAR_LIMIT - alert.description.length + : ALERT_DESCRIPTION_CHAR_LIMIT + const titleCharacterCount = alert.title + ? alert.title.length + : 0 + const descriptionCharactersCount = alert.description + ? alert.description.length + : 0 + const canPublish = + alert.affectedEntities.length && checkEntitiesForFeeds(alert.affectedEntities, publishableFeeds) - const canEdit = checkEntitiesForFeeds(alert.affectedEntities, editableFeeds) - const editingIsDisabled = alert.published && !canPublish ? true : !canEdit - const sortedFeeds = editableFeeds.sort(sortFeeds511) - // If user has edit rights and alert is unpublished, user can delete alert, - // else check if they have publish rights. - const deleteIsDisabled = !editingIsDisabled && !alert.published - ? false - : !canPublish - const deleteButtonMessage = alert.published && deleteIsDisabled - ? 'Cannot delete because alert is published' - : !canEdit ? 'Cannot alter alerts for other agencies' : 'Delete alert' - const editButtonMessage = alert.published && deleteIsDisabled - ? 'Cannot edit because alert is published' - : !canEdit ? 'Cannot alter alerts for other agencies' : 'Edit alert' - return ( - - - - - - - - - + const canEdit = checkEntitiesForFeeds(alert.affectedEntities, editableFeeds) + const editingIsDisabled = alert.published && !canPublish ? true : !canEdit + const sortedFeeds = editableFeeds.sort(sortFeeds511) + // If user has edit rights and alert is unpublished, user can delete alert, + // else check if they have publish rights. + const deleteIsDisabled = !editingIsDisabled && !alert.published + ? false + : !canPublish + const deleteButtonMessage = alert.published && deleteIsDisabled + ? 'Cannot delete because alert is published' + : !canEdit ? 'Cannot alter alerts for other agencies' : 'Delete alert' + const editButtonMessage = alert.published && deleteIsDisabled + ? 'Cannot edit because alert is published' + : !canEdit ? 'Cannot alter alerts for other agencies' : 'Edit alert' + return ( + + + + - - - - - - - - - - - - - - - Alert Title - {' '} + onClick={this._onClickBack}> + Back + + + + + + + + + + + + + + + + + + + + + Alert Title + {' '} CHAR_WARNING_LIMIT && titleCharacterCount <= ALERT_TITLE_CHAR_LIMIT + titleCharactersRemaining > CHAR_WARNING_LIMIT ? 'text-muted' : 'text-danger' } @@ -214,7 +225,12 @@ export default class AlertEditor extends Component {
    - {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT ? 'WARNING: Alert title longer than 100 characters may get truncated in some dissemination channels. ' : ''} + {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT + ? ( + + {`WARNING: Alert title longer than ${ALERT_TITLE_CHAR_LIMIT} characters may get truncated in some dissemination channels. `} + + ) : ''} Note: alert title serves as text for eTID alerts. Use descriptive language so it can serve as a standalone alert. @@ -287,14 +303,21 @@ export default class AlertEditor extends Component { {' '} CHAR_WARNING_LIMIT && descriptionCharactersCount <= ALERT_DESCRIPTION_CHAR_LIMIT + descriptionCharactersRemaining > CHAR_WARNING_LIMIT ? 'text-muted' : 'text-danger' } style={{fontWeight: 400}}> {descriptionCharactersCount} -

    {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT ? 'WARNING: Alert description longer than 1200 characters may get truncated in some dissemination channels. ' : ''}

    + {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT + ? ( +
    + + {`WARNING: Alert description longer than ${ALERT_DESCRIPTION_CHAR_LIMIT} characters may get truncated in some dissemination channels. `} + +
    + ) : ''} { - From b533eee8fa67a4412eb8d4e45ba237f7cc2e239d Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Fri, 26 Mar 2021 13:08:45 -0700 Subject: [PATCH 139/553] chore: update issue template --- .github/issue_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index 52aedb349..660f711d0 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,4 +1,4 @@ -_**NOTE:** This issue system is intended for reporting bugs and tracking progress in software development. Although this software is licensed with an open-source license, any issue opened here may not be responded to in a timely manner. [Conveyal](https://www.conveyal.com) is unable to provide technical support for custom deployments of this software unless your company has a support contract with us. Please remove this note when creating the issue._ +_**NOTE:** This issue system is intended for reporting bugs and tracking progress in software development. Although this software is licensed with an open-source license, any issue opened here may not be responded to in a timely manner. [IBI Group](https://www.ibigroup.com/) is unable to provide technical support for custom deployments of this software unless your company has a support contract with us. Please remove this note when creating the issue._ ## Observed behavior (please include a screenshot if possible) From c3f83127563ed44205ccab25a21791947cfee46b Mon Sep 17 00:00:00 2001 From: Rob Gregg Date: Mon, 29 Mar 2021 16:55:29 +0100 Subject: [PATCH 140/553] refactor(AlertEditor.js): Refactored code, sorted Linting errors Made the title input and description text area full width. #648 --- lib/alerts/components/AlertEditor.js | 169 +++++++++++++-------------- 1 file changed, 84 insertions(+), 85 deletions(-) diff --git a/lib/alerts/components/AlertEditor.js b/lib/alerts/components/AlertEditor.js index 35eddebe1..591691faf 100644 --- a/lib/alerts/components/AlertEditor.js +++ b/lib/alerts/components/AlertEditor.js @@ -24,7 +24,6 @@ import {CAUSES, EFFECTS, isNew} from '../util' import type {Props as ContainerProps} from '../containers/ActiveAlertEditor' import type {Alert, Feed, GtfsRoute, GtfsStop, Project} from '../../types' import type {ManagerUserState} from '../../types/reducers' - type Props = ContainerProps & { activeFeeds: Array, addActiveEntity: typeof activeAlertActions.addActiveEntity, @@ -70,7 +69,7 @@ export default class AlertEditor extends Component { validateAndSave = () => { const {alert, saveAlert} = this.props - const {affectedEntities, description, end, start, title} = alert + const {affectedEntities, end, start, title} = alert const momentEnd = moment(end) const momentStart = moment(start) @@ -96,7 +95,7 @@ export default class AlertEditor extends Component { _deleteAlert = () => this.props.deleteAlert(this.props.alert) _onChange = (evt: SyntheticInputEvent) => - this.props.setActiveProperty({[evt.target.name]: evt.target.value}) + this.props.setActiveProperty({[evt.target.name]: evt.target.value}) _onChangeEnd = (time: string) => this.props.setActiveProperty({end: +time}) @@ -136,11 +135,11 @@ export default class AlertEditor extends Component { const titleCharactersRemaining = alert.title ? ALERT_TITLE_CHAR_LIMIT - alert.title.length : ALERT_TITLE_CHAR_LIMIT - const descriptionCharactersRemaining = alert.description + const descriptionCharactersRemaining = alert.description ? ALERT_DESCRIPTION_CHAR_LIMIT - alert.description.length : ALERT_DESCRIPTION_CHAR_LIMIT - const titleCharacterCount = alert.title - ? alert.title.length + const titleCharacterCount = alert.title + ? alert.title.length : 0 const descriptionCharactersCount = alert.description ? alert.description.length @@ -148,72 +147,72 @@ export default class AlertEditor extends Component { const canPublish = alert.affectedEntities.length && checkEntitiesForFeeds(alert.affectedEntities, publishableFeeds) - const canEdit = checkEntitiesForFeeds(alert.affectedEntities, editableFeeds) - const editingIsDisabled = alert.published && !canPublish ? true : !canEdit - const sortedFeeds = editableFeeds.sort(sortFeeds511) - // If user has edit rights and alert is unpublished, user can delete alert, - // else check if they have publish rights. - const deleteIsDisabled = !editingIsDisabled && !alert.published - ? false - : !canPublish - const deleteButtonMessage = alert.published && deleteIsDisabled - ? 'Cannot delete because alert is published' - : !canEdit ? 'Cannot alter alerts for other agencies' : 'Delete alert' - const editButtonMessage = alert.published && deleteIsDisabled - ? 'Cannot edit because alert is published' - : !canEdit ? 'Cannot alter alerts for other agencies' : 'Edit alert' - return ( - - - - + const canEdit = checkEntitiesForFeeds(alert.affectedEntities, editableFeeds) + const editingIsDisabled = alert.published && !canPublish ? true : !canEdit + const sortedFeeds = editableFeeds.sort(sortFeeds511) + // If user has edit rights and alert is unpublished, user can delete alert, + // else check if they have publish rights. + const deleteIsDisabled = !editingIsDisabled && !alert.published + ? false + : !canPublish + const deleteButtonMessage = alert.published && deleteIsDisabled + ? 'Cannot delete because alert is published' + : !canEdit ? 'Cannot alter alerts for other agencies' : 'Delete alert' + const editButtonMessage = alert.published && deleteIsDisabled + ? 'Cannot edit because alert is published' + : !canEdit ? 'Cannot alter alerts for other agencies' : 'Edit alert' + return ( + + + + + + + + + - - - - - - - - - - - - - - - - - - - + title={deleteButtonMessage} + bsStyle='danger' + disabled={deleteIsDisabled} + onClick={this._onClickDelete} + > Delete + + + + + + + + + + + + + + Alert Title - {' '} + {' '} CHAR_WARNING_LIMIT @@ -225,15 +224,15 @@ export default class AlertEditor extends Component {
    - {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT + {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT ? ( - {`WARNING: Alert title longer than ${ALERT_TITLE_CHAR_LIMIT} characters may get truncated in some dissemination channels. `} + {`WARNING: Alert title longer than ${ALERT_TITLE_CHAR_LIMIT} characters may get truncated in some dissemination channels. `}
    - ) : ''} + ) : ''} Note: alert title serves as text for eTID alerts. Use descriptive language so it can serve as a standalone - alert. + alert.
    @@ -296,7 +295,7 @@ export default class AlertEditor extends Component {
    - + Description @@ -310,14 +309,14 @@ export default class AlertEditor extends Component { style={{fontWeight: 400}}> {descriptionCharactersCount} - {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT - ? ( -
    - - {`WARNING: Alert description longer than ${ALERT_DESCRIPTION_CHAR_LIMIT} characters may get truncated in some dissemination channels. `} - -
    - ) : ''} + {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT + ? ( +
    + + {`WARNING: Alert description longer than ${ALERT_DESCRIPTION_CHAR_LIMIT} characters may get truncated in some dissemination channels. `} + +
    + ) : ''}
    { onChange={this._onChange} />
    - + URL {
    - From d50ca196fccb1b885e057b6ca97fb9504c4c2fe8 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 29 Mar 2021 14:38:30 -0700 Subject: [PATCH 141/553] ci: sanity check to see if mkdocs gets installed --- .github/workflows/node-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 672d3ef59..522793c65 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -26,7 +26,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: Install mkdocs - run: pip install mkdocs + run: | + pip install mkdocs + mkdocs --version - name: Use Node.js 12.x uses: actions/setup-node@v1 with: From 6c4bf790693b3778235574368a9853698d8efc20 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 29 Mar 2021 14:45:02 -0700 Subject: [PATCH 142/553] ci: try to upgrade pip? --- .github/workflows/node-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 522793c65..0565f7f27 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -27,6 +27,7 @@ jobs: - uses: actions/checkout@v2 - name: Install mkdocs run: | + python -m pip install --upgrade pip pip install mkdocs mkdocs --version - name: Use Node.js 12.x From ef89a66512265821f07f65209bb3caa5d5b99630 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Mon, 29 Mar 2021 18:02:59 -0700 Subject: [PATCH 143/553] ci: try to setup python v3 --- .github/workflows/node-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 0565f7f27..c0d859c7f 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -25,9 +25,11 @@ jobs: --health-retries 5 steps: - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: '3.x' - name: Install mkdocs run: | - python -m pip install --upgrade pip pip install mkdocs mkdocs --version - name: Use Node.js 12.x From 272042d1f8fe13f6fbf3980b1d83ae7ebca9abb3 Mon Sep 17 00:00:00 2001 From: Rob Gregg Date: Tue, 30 Mar 2021 16:59:02 +0100 Subject: [PATCH 144/553] refactor(AlertEditor.js): Refactor Sorted final IDE quirks to do with spacing #648 --- lib/alerts/components/AlertEditor.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/alerts/components/AlertEditor.js b/lib/alerts/components/AlertEditor.js index 591691faf..763874226 100644 --- a/lib/alerts/components/AlertEditor.js +++ b/lib/alerts/components/AlertEditor.js @@ -24,6 +24,7 @@ import {CAUSES, EFFECTS, isNew} from '../util' import type {Props as ContainerProps} from '../containers/ActiveAlertEditor' import type {Alert, Feed, GtfsRoute, GtfsStop, Project} from '../../types' import type {ManagerUserState} from '../../types/reducers' + type Props = ContainerProps & { activeFeeds: Array, addActiveEntity: typeof activeAlertActions.addActiveEntity, @@ -211,7 +212,7 @@ export default class AlertEditor extends Component { - Alert Title + Alert Title {' '} {
    - {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT - ? ( + {titleCharacterCount > ALERT_TITLE_CHAR_LIMIT && + ( - {`WARNING: Alert title longer than ${ALERT_TITLE_CHAR_LIMIT} characters may get truncated in some dissemination channels. `}
    + WARNING: Alert title longer than {ALERT_TITLE_CHAR_LIMIT} characters may get truncated in some dissemination channels.
    - ) : ''} + ) + } Note: alert title serves as text for eTID alerts. Use descriptive language so it can serve as a standalone alert. @@ -309,14 +311,15 @@ export default class AlertEditor extends Component { style={{fontWeight: 400}}> {descriptionCharactersCount} - {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT - ? ( + {descriptionCharactersCount > ALERT_DESCRIPTION_CHAR_LIMIT && + (
    - {`WARNING: Alert description longer than ${ALERT_DESCRIPTION_CHAR_LIMIT} characters may get truncated in some dissemination channels. `} + WARNING: Alert description longer than {ALERT_DESCRIPTION_CHAR_LIMIT} characters may get truncated in some dissemination channels.
    - ) : ''} + ) + } Date: Tue, 30 Mar 2021 16:39:14 +0000 Subject: [PATCH 145/553] build(deps): bump y18n from 3.2.1 to 3.2.2 Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index edfd31ac0..49c0199d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15102,9 +15102,9 @@ xmlbuilder@~9.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" From 457a0e5b598bf12181f2f9da21f955fd71269d8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Mar 2021 19:22:38 +0000 Subject: [PATCH 146/553] build(deps): bump y18n from 3.2.1 to 3.2.2 in /scripts Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] --- scripts/yarn.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/yarn.lock b/scripts/yarn.lock index ecdceb1fc..04fa1906d 100644 --- a/scripts/yarn.lock +++ b/scripts/yarn.lock @@ -1200,8 +1200,9 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" From c29f1aafc24df94bd603a268a753d5d5d755541e Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Tue, 30 Mar 2021 16:32:06 -0700 Subject: [PATCH 147/553] ci: add note about python3 install --- .github/workflows/node-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index c0d859c7f..005008dce 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -25,6 +25,7 @@ jobs: --health-retries 5 steps: - uses: actions/checkout@v2 + # install python 3.x in order to have mkdocs properly installed - uses: actions/setup-python@v2 with: python-version: '3.x' From 26f9962e1c2396daa76fa082035815a4ab4c8cea Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Wed, 31 Mar 2021 11:07:27 -0700 Subject: [PATCH 148/553] refactor: update issue template with mailto link --- .github/issue_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index 660f711d0..6239fc4fb 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,4 +1,4 @@ -_**NOTE:** This issue system is intended for reporting bugs and tracking progress in software development. Although this software is licensed with an open-source license, any issue opened here may not be responded to in a timely manner. [IBI Group](https://www.ibigroup.com/) is unable to provide technical support for custom deployments of this software unless your company has a support contract with us. Please remove this note when creating the issue._ +_**NOTE:** This issue system is intended for reporting bugs and tracking progress in software development. Although this software is licensed with an open-source license, any issue opened here may not be responded to in a timely manner. [IBI Group](https://www.ibigroup.com/) is able to provide technical support for custom deployments of this software. Please contact [Ritesh Warade](mailto:ritesh.warade@ibigroup.com?subject=Data%20Tools%20inquiry%20via%20GitHub&body=Name:%20%0D%0AAgency/Company:%20%0D%0ABest%20date/time%20for%20a%20demo/discussion:%20%0D%0ADescription%20of%20needs:%20) if your company is interested in opening a support contract with us. Please remove this note when creating the issue._ ## Observed behavior (please include a screenshot if possible) From 9602d0a3b54a8e0bc0158f46034a0e8f9f84782e Mon Sep 17 00:00:00 2001 From: Rob Gregg Date: Wed, 31 Mar 2021 21:51:11 +0100 Subject: [PATCH 149/553] refactor(AlertEditor.js): CSS styling of the description textarea Added an inline style to increase the height so that 4 lines were visible #648 --- lib/alerts/components/AlertEditor.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/alerts/components/AlertEditor.js b/lib/alerts/components/AlertEditor.js index 763874226..0fe7ffe6a 100644 --- a/lib/alerts/components/AlertEditor.js +++ b/lib/alerts/components/AlertEditor.js @@ -326,7 +326,8 @@ export default class AlertEditor extends Component { placeholder='Detailed description of alert...' defaultValue={alert.description} name='description' - onChange={this._onChange} /> + onChange={this._onChange} + style={{ minHeight: '89px' }} /> From e754d45ec785cc8e4f402413570c4d7fd66ffd02 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 2 Apr 2021 18:08:56 -0400 Subject: [PATCH 150/553] refactor(FeedTransformations): Persist cap exceptions and substitutions as string. --- .../transform/FeedTransformation.js | 30 ++++++++++++------- lib/types/index.js | 4 ++- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/manager/components/transform/FeedTransformation.js b/lib/manager/components/transform/FeedTransformation.js index 44593cba5..5c8361dad 100644 --- a/lib/manager/components/transform/FeedTransformation.js +++ b/lib/manager/components/transform/FeedTransformation.js @@ -14,7 +14,6 @@ import type { FeedTransformation as FeedTransformationType, ReactSelectOption } from '../../../types' -import { transform } from 'lodash-es' type Props = { feedSource: Feed, @@ -132,15 +131,15 @@ export default class FeedTransformation extends Component Capitalize bus stop names -
    Exceptions: +
    Exceptions: - +
  • @@ -151,10 +150,15 @@ export default class FeedTransformation extends Component Perform the following substitutions: -
      -
    • Replace '+' and '&' with 'and', '@' with 'at',
    • -
    • Remove contents within parentheses.
    • -
    + + +
  • @@ -215,13 +219,17 @@ export default class FeedTransformation extends Component) => { - this.props.onChange({capitalizeExceptions: evt.target.value.split(',')}, this.props.index) + this.props.onChange({capitalizeExceptions: evt.target.value}, this.props.index) } _onChangePerformSubstitutions = (evt: SyntheticInputEvent) => { this.props.onChange({performSubstitutions: evt.target.checked}, this.props.index) } + _onChangeSubstitutions = (evt: SyntheticInputEvent) => { + this.props.onChange({substitutions: evt.target.value}, this.props.index) + } + _onSaveFieldToNormalize = () => { const fieldName = this.state.fieldName || null this.setState({fieldName: null}) diff --git a/lib/types/index.js b/lib/types/index.js index 083f695c1..f0b91fd3a 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -295,9 +295,11 @@ export type FeedTransformation = { '@type': $Values, active: boolean, + // TODO: Split the types for different transformations capitalize?: boolean, - capitalizeExceptions?: Array, + capitalizeExceptions?: string, performSubstitutions?: boolean, + substitutions?: string, csvData?: string, fieldName?: string, From f2ceef820f005d141f5b84a6c3cd7d54b460ac4b Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:27:39 -0400 Subject: [PATCH 151/553] Update lib/manager/components/version/DeltaStat.js Co-authored-by: Evan Siroky --- lib/manager/components/version/DeltaStat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/manager/components/version/DeltaStat.js b/lib/manager/components/version/DeltaStat.js index becc309c6..3bd655fe6 100644 --- a/lib/manager/components/version/DeltaStat.js +++ b/lib/manager/components/version/DeltaStat.js @@ -6,7 +6,7 @@ import {Label as BsLabel, OverlayTrigger, Tooltip} from 'react-bootstrap' import {formatDelta} from '../../util/version' /** - * Renders a delta statistic as a label with tooltip when comparing feed + * Renders a delta statistic as a label with tooltip when comparing feed * versions. */ const DeltaStat = ( From 8c399f0e3de145bf3f62d8e4995c4e75b228a22e Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 6 Apr 2021 10:38:42 -0400 Subject: [PATCH 152/553] refactor: Fix lint --- .../version/FeedVersionSpanChart.js | 23 +++++++++---------- .../components/version/FeedVersionViewer.js | 10 ++++---- .../version/VersionComparisonDropdown.js | 8 +++---- .../version/VersionSelectorDropdown.js | 8 +++---- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 6008287fa..07511b92f 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -49,7 +49,7 @@ export default class FeedVersionSpanChart extends Component { render () { const { activeVersion, comparedVersion: comparedVersionProp, style } = this.props - const comparedVersion = comparedVersionProp ? comparedVersionProp : activeVersion + const comparedVersion = comparedVersionProp || activeVersion // Construct moment objects for the active/compared version start/end dates. const activeStartDate = moment(activeVersion.validationSummary.startDate) @@ -112,8 +112,8 @@ export default class FeedVersionSpanChart extends Component { isServiceGap lastDate={lastDate} top={`${HEIGHT_EM}em`} - versionStartDate={earliestEnd} versionEndDate={latestStart} + versionStartDate={earliestEnd} />} {comparedVersionProp && this.renderFeedSpan('compared', comparedChartProps)} {showToday && } @@ -129,9 +129,9 @@ export default class FeedVersionSpanChart extends Component { function getRenderVars ({ firstDate, lastDate, - versionStartDate, versionEndDate, - versionLabel + versionLabel, + versionStartDate }) { const totalDays = lastDate.diff(firstDate, 'days') const daysActive = versionEndDate.diff(versionStartDate, 'days') @@ -154,8 +154,10 @@ const FeedSpan = props => { const { daysActive, relativeLength, relativeOffset } = getRenderVars(props) return ( + overlay={ {isServiceGap && 'No service for'}{' '} {daysActive} days }> @@ -170,9 +172,9 @@ const FeedSpan = props => { @@ -186,7 +188,7 @@ const FeedSpan = props => { */ const FeedStartLabel = props => { const { top } = props - const { relativeOffset, startLabel, totalDays, versionOffset } = getRenderVars(props) + const { relativeOffset, startLabel } = getRenderVars(props) return ( { const FeedEndLabel = props => { const { top, versionLabel } = props const { - daysActive, endLabel, relativeLength, - relativeOffset, - totalDays, - versionOffset + relativeOffset } = getRenderVars(props) return ( diff --git a/lib/manager/components/version/FeedVersionViewer.js b/lib/manager/components/version/FeedVersionViewer.js index 5b2040602..462bac4b1 100644 --- a/lib/manager/components/version/FeedVersionViewer.js +++ b/lib/manager/components/version/FeedVersionViewer.js @@ -25,7 +25,7 @@ import * as plusActions from '../../../gtfsplus/actions/gtfsplus' import ActiveGtfsPlusVersionSummary from '../../../gtfsplus/containers/ActiveGtfsPlusVersionSummary' import VersionDateLabel from './VersionDateLabel' import NotesViewer from '../NotesViewer' -import {errorPriorityLevels, formatDelta, getTableFatalExceptions} from '../../util/version' +import {errorPriorityLevels, getTableFatalExceptions} from '../../util/version' import GtfsValidationViewer from '../validation/GtfsValidationViewer' import VersionButtonToolbar from './VersionButtonToolbar' @@ -74,10 +74,10 @@ export default class FeedVersionViewer extends Component { listView, newNotePosted, notesRequested, + user, version, versions, - versionSection, - user + versionSection } = this.props if (feedSource && !feedSource.latestValidation) { @@ -106,10 +106,10 @@ export default class FeedVersionViewer extends Component { diff --git a/lib/manager/components/version/VersionComparisonDropdown.js b/lib/manager/components/version/VersionComparisonDropdown.js index 5cf4c8176..cd3e922d2 100644 --- a/lib/manager/components/version/VersionComparisonDropdown.js +++ b/lib/manager/components/version/VersionComparisonDropdown.js @@ -7,7 +7,7 @@ import {connect} from 'react-redux' import * as versionsActions from '../../actions/versions' import VersionSelectorDropdown, {DefaultItemFormatter} from './VersionSelectorDropdown' -import type {Feed, FeedVersion} from '../../../types' +import type {FeedVersion} from '../../../types' import type {AppState} from '../../../types/reducers' type Props = { @@ -27,7 +27,7 @@ class VersionComparisonDropdown extends Component { const comparedVersionIndex = comparedVersion ? comparedVersion.version : -1 // Note: index is 1-based (the menu item at index 0 is a caption). if (index !== comparedVersionIndex) { - setComparedVersion(versions.find(v => v.version === index))//FIXME:[QBD] pass sorted versions to selector? + setComparedVersion(versions.find(v => v.version === index)) } } @@ -38,8 +38,8 @@ class VersionComparisonDropdown extends Component { render () { const { comparedVersion, - versions, - version + version, + versions } = this.props let title = 'Compare versions' if (comparedVersion) { diff --git a/lib/manager/components/version/VersionSelectorDropdown.js b/lib/manager/components/version/VersionSelectorDropdown.js index dacbd1796..757b771a9 100644 --- a/lib/manager/components/version/VersionSelectorDropdown.js +++ b/lib/manager/components/version/VersionSelectorDropdown.js @@ -21,15 +21,15 @@ type Props = { export const DefaultItemFormatter = (version: FeedVersion, activeVersion: ?FeedVersion) => ( {activeVersion && version.id === activeVersion.id ? : null} @@ -63,7 +63,7 @@ export default function VersionSelectorDropdown (props: Props) { {versionsSorted.length > 0 ? versionsSorted.map((v, i) => itemFormatter(v, version)) : No versions available} - + {extraOptions && } {extraOptions && extraOptions.map((option, i) => ( {option.text} From 331339a1a03af1f70986a770dccf112f83bde46f Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 6 Apr 2021 11:31:06 -0400 Subject: [PATCH 153/553] refactor: Fix flow errors --- lib/common/components/MenuItem.js | 6 ++-- .../version/FeedVersionSpanChart.js | 36 +++++++++++-------- lib/types/reducers.js | 4 +-- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/common/components/MenuItem.js b/lib/common/components/MenuItem.js index 8b6fcd40b..a0d3eb342 100644 --- a/lib/common/components/MenuItem.js +++ b/lib/common/components/MenuItem.js @@ -8,14 +8,14 @@ import {MenuItem as BsMenuItem} from 'react-bootstrap' * Simple wrapper around Bootstrap's menu item to inject a checkmark if the item * is selected. */ -const MenuItem = ({children, selected, ...menuItemProps}: {children: React.Node, selected?: boolean}) => ( +const MenuItem = ({children, selected, ...menuItemProps}: {children?: React.Node, selected?: boolean}) => ( {selected ? diff --git a/lib/manager/components/version/FeedVersionSpanChart.js b/lib/manager/components/version/FeedVersionSpanChart.js index 07511b92f..75e70730c 100644 --- a/lib/manager/components/version/FeedVersionSpanChart.js +++ b/lib/manager/components/version/FeedVersionSpanChart.js @@ -154,13 +154,16 @@ const FeedSpan = props => { const { daysActive, relativeLength, relativeOffset } = getRenderVars(props) return ( - {isServiceGap && 'No service for'}{' '} - {daysActive} days - }> + overlay={( + + {isServiceGap && 'No service for'}{' '} + {daysActive} days + + )} + placement='bottom' + > - {`Today - ${today.format(TODAY_DATE_FORMAT)}`} - } - placement='top'> + overlay={( + + {`Today - ${today.format(TODAY_DATE_FORMAT)}`} + + )} + placement='top' + >
    , map: MapFilter, @@ -301,7 +301,7 @@ export type FilterState = { showArrivals: boolean, timepointFilter: boolean, typeFilter: Array, - version: FeedVersion + version: ?FeedVersion } export type ValidationTrip = { From 6236f136509bbafe788a0815a5d74d6098ab0c89 Mon Sep 17 00:00:00 2001 From: Rob Gregg Date: Thu, 8 Apr 2021 17:23:40 +0100 Subject: [PATCH 154/553] fix(EditorInput.js gtfs.yml): Added missing GTFS Extended Route Types Added the route types to the GTFS.yml file and then added logic to display the route_type field in an optgroup #645 --- gtfs.yml | 150 +++++++++++++++++++++++++++ lib/editor/components/EditorInput.js | 15 ++- 2 files changed, 164 insertions(+), 1 deletion(-) diff --git a/gtfs.yml b/gtfs.yml index 4170346d5..17b76574c 100644 --- a/gtfs.yml +++ b/gtfs.yml @@ -290,6 +290,156 @@ text: Gondola - value: 7 text: Funicular + - value: 100 + text: Railway Service + - value: 100 + text: Railway Service + - value: 101 + text: High Speed Rail Service + - value: 102 + text: Long Distance Trains + - value: 103 + text: Inter Regional Rail Service + - value: 104 + text: Car Transport Rail Service + - value: 105 + text: Sleeper Rail Service + - value: 106 + text: Regional Rail Service + - value: 107 + text: Tourist Railway Service + - value: 108 + text: Rail Shuttle (Within Complex) + - value: 109 + text: Suburban Railway + - value: 110 + text: Replacement Rail Service + - value: 111 + text: Special Rail Service + - value: 112 + text: Lorry Transport Rail Service + - value: 113 + text: All Rail Services + - value: 114 + text: Cross-Country Rail Service + - value: 115 + text: Vehicle Transport Rail Service + - value: 116 + text: Rack and Pinion Railway + - value: 117 + text: Additional Rail Service + - value: 200 + text: Coach Service + - value: 201 + text: International Coach Service + - value: 202 + text: National Coach Service + - value: 203 + text: Shuttle Coach Service + - value: 204 + text: Regional Coach Service + - value: 205 + text: Special Coach Service + - value: 206 + text: Sightseeing Coach Service + - value: 207 + text: Tourist Coach Service + - value: 208 + text: Commuter Coach Service + - value: 209 + text: All Coach Services + - value: 400 + text: Urban Railway Service + - value: 401 + text: Metro Service + - value: 402 + text: Underground Service + - value: 403 + text: Urban Railway Service + - value: 404 + text: All Urban Railway Services + - value: 405 + text: Monorail + - value: 700 + text: Bus Service + - value: 701 + text: Regional Bus Service + - value: 702 + text: Express Bus Service + - value: 703 + text: Stopping Bus Service + - value: 704 + text: Local Bus Service + - value: 705 + text: Night Bus Service + - value: 706 + text: Post Bus Service + - value: 707 + text: Special Needs Bus + - value: 708 + text: Mobility Bus Service + - value: 709 + text: Mobility Bus for Registered Disabled + - value: 710 + text: Sightseeing Bus + - value: 711 + text: Shuttle Bus + - value: 712 + text: School Bus + - value: 713 + text: School and Public Service Bus + - value: 714 + text: Rail Replacement Bus Service + - value: 715 + text: Demand and Response Bus Service + - value: 716 + text: All Bus Services + - value: 800 + text: Trolleybus Service + - value: 900 + text: Tram Service + - value: 901 + text: City Tram Service + - value: 902 + text: Local Tram Service + - value: 903 + text: Regional Tram Service + - value: 904 + text: Sightseeing Tram Service + - value: 905 + text: Shuttle Tram Service + - value: 906 + text: All Tram Services + - value: 1000 + text: Water Transport Service + - value: 1100 + text: Air Service + - value: 1200 + text: Ferry Service + - value: 1300 + text: Aerial Lift Service + - value: 1400 + text: Funicular Service + - value: 1500 + text: Taxi Service + - value: 1501 + text: Communal Taxi Service + - value: 1502 + text: Water Taxi Service + - value: 1503 + text: Rail Taxi Service + - value: 1504 + text: Bike Taxi Service + - value: 1505 + text: Licensed Taxi Service + - value: 1506 + text: Private Hire Service Vehicle + - value: 1507 + text: All Taxi Services + - value: 1700 + text: Miscellaneous Service + - value: 1702 + text: Horse-drawn Carriage columnWidth: 6 helpContent: The route_type field describes the type of transportation used on a route. Valid values for this field are... - name: route_sort_order diff --git a/lib/editor/components/EditorInput.js b/lib/editor/components/EditorInput.js index 5b291fabf..8836ba34b 100644 --- a/lib/editor/components/EditorInput.js +++ b/lib/editor/components/EditorInput.js @@ -300,6 +300,8 @@ export default class EditorInput extends Component { ) case 'DROPDOWN': + const standard = 'Standard' + const extended = 'Extended' return ( { ? : null } - {field.options && field.options.map(o => ())} + {field.name === 'route_type' && + + {field.options.slice(0, 7).map(o => ( + ))} + } + {field.name === 'route_type' && + + {field.options.slice(8).map(o => ( + ))} + } + )} + {field.name !== 'route_type' && field.options && field.options.map(o => ())}} ) From decd272884532576604bd369e77fe27cf9ada042 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 9 Apr 2021 17:59:43 -0400 Subject: [PATCH 155/553] refactor(NormalizeFields): Extract component --- .../transform/FeedTransformation.js | 97 +-------- .../components/transform/NormalizeFields.js | 185 ++++++++++++++++++ 2 files changed, 193 insertions(+), 89 deletions(-) create mode 100644 lib/manager/components/transform/NormalizeFields.js diff --git a/lib/manager/components/transform/FeedTransformation.js b/lib/manager/components/transform/FeedTransformation.js index 5c8361dad..208d55fbe 100644 --- a/lib/manager/components/transform/FeedTransformation.js +++ b/lib/manager/components/transform/FeedTransformation.js @@ -8,6 +8,7 @@ import Select from 'react-select' import {getGtfsSpec, getGtfsPlusSpec, isModuleEnabled} from '../../../common/util/config' import {getTransformationName} from '../../util/transform' import VersionSelectorDropdown from '../version/VersionSelectorDropdown' +import NormalizeFields from './NormalizeFields' import type { Feed, @@ -98,70 +99,14 @@ export default class FeedTransformation extends Component - -
    - -
    - - This transform will: -
      -
    • - - Capitalize bus stop names - -
      Exceptions: - - - -
      -
    • -
    • - - Perform the following substitutions: - - - - -
    • -
    -
    + ) break } @@ -210,32 +155,6 @@ export default class FeedTransformation extends Component) => { - this.setState({fieldName: evt.target.value}) - } - - _onChangeCapitalizeField = (evt: SyntheticInputEvent) => { - this.props.onChange({capitalize: evt.target.checked}, this.props.index) - } - - _onChangeCapitalizeExceptions = (evt: SyntheticInputEvent) => { - this.props.onChange({capitalizeExceptions: evt.target.value}, this.props.index) - } - - _onChangePerformSubstitutions = (evt: SyntheticInputEvent) => { - this.props.onChange({performSubstitutions: evt.target.checked}, this.props.index) - } - - _onChangeSubstitutions = (evt: SyntheticInputEvent) => { - this.props.onChange({substitutions: evt.target.value}, this.props.index) - } - - _onSaveFieldToNormalize = () => { - const fieldName = this.state.fieldName || null - this.setState({fieldName: null}) - this.props.onChange({fieldName}, this.props.index) - } - _onRemoveTransformation = () => { this.props.onRemove(this.props.index) } diff --git a/lib/manager/components/transform/NormalizeFields.js b/lib/manager/components/transform/NormalizeFields.js new file mode 100644 index 000000000..81fd6bda8 --- /dev/null +++ b/lib/manager/components/transform/NormalizeFields.js @@ -0,0 +1,185 @@ +// @flow + +import { isEqual } from 'lodash' +import React, {Component} from 'react' +import {Button, Checkbox, FormControl, FormGroup} from 'react-bootstrap' + +import type { + Feed, + FeedTransformation as FeedTransformationType +} from '../../../types' + +// TODO: Use the correct feed transformation type instead. +type State = { + capitalize?: boolean, + capitalizeExceptions?: string, + fieldName: ?string, + performSubstitutions?: boolean, + substitutions?: string +} + +type Props = { + feedSource: Feed, + index: number, + onSave: (State, number) => void, + transformation: FeedTransformationType // TODO: split tranformation types. +} + +function getTransformationFields (transformation: FeedTransformationType): State { + const { + capitalize, + capitalizeExceptions = '', + fieldName = '', + performSubstitutions, + substitutions = '' + } = transformation + return { + capitalize, + capitalizeExceptions, + fieldName, + performSubstitutions, + substitutions + } +} + +/** + * Component that renders input fields for the NoramlizeFieldTransformation. + */ +export default class NormalizeFields extends Component { + state = { + capitalize: true, + capitalizeExceptions: '', + fieldName: '', + performSubstitutions: true, + substitutions: '' + } + + constructor (props: Props) { + super(props) + this.state = getTransformationFields(props.transformation) + } + + _getValidationIssues = () => { + const {feedSource, transformation} = this.props + // Get selected version (if applicable). + const version = feedSource.feedVersions && + feedSource.feedVersions.find(v => v.id === transformation.sourceVersionId) + const issues = [] + if (!transformation.table) { + issues.push('Table must be defined') + } + + // TODO: add validation. + + return issues + } + + _onChangeFieldToNormalize = (evt: SyntheticInputEvent) => { + this.setState({fieldName: evt.target.value}) + } + + _onChangeCapitalizeValues = (evt: SyntheticInputEvent) => { + this.setState({capitalize: evt.target.checked}) + } + + _onChangeCapitalizeExceptions = (evt: SyntheticInputEvent) => { + this.setState({capitalizeExceptions: evt.target.value}) + } + + _onChangePerformSubstitutions = (evt: SyntheticInputEvent) => { + this.setState({performSubstitutions: evt.target.checked}) + } + + _onChangeSubstitutions = (evt: SyntheticInputEvent) => { + this.setState({substitutions: evt.target.value}) + } + + _onSaveTransformationSettings = () => { + this.props.onSave(this.state, this.props.index) + } + + componentDidUpdate (prevProps: Props) { + const { transformation } = this.props + if (!isEqual(transformation, prevProps.transformation)) { + this.setState(getTransformationFields(transformation)) + } + } + + render () { + const { transformation } = this.props + const { + capitalize, + capitalizeExceptions, + fieldName, + performSubstitutions, + substitutions + } = this.state + + const inputIsUnchanged = isEqual(this.state, getTransformationFields(transformation)) + + return ( +
    + + +
      +
    • + + Capitalize field value + + Exceptions (comma-separated): + + + + +
    • +
    • + + Perform the following substitutions: + + + + +
    • +
    +
    + +
    +
    + ) + } +} From f83fd3e09ebfc4b6ec1c135531840931f47e1bc5 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:52:12 -0400 Subject: [PATCH 156/553] refactor(ReplaceFileFromStringFields): Extract component. --- i18n/english.yml | 4 +- .../transform/FeedTransformation.js | 72 +++--------- .../components/transform/NormalizeFields.js | 35 +++--- .../transform/ReplaceFileFromStringFields.js | 109 ++++++++++++++++++ 4 files changed, 146 insertions(+), 74 deletions(-) create mode 100644 lib/manager/components/transform/ReplaceFileFromStringFields.js diff --git a/i18n/english.yml b/i18n/english.yml index 951c0a550..e9d7ee0c4 100644 --- a/i18n/english.yml +++ b/i18n/english.yml @@ -245,8 +245,8 @@ components: label: Delete records from %tablePlaceholder% name: Delete records transformation NormalizeFieldTransformation: - label: Normalize fields - name: Normalize fields transformation + label: Normalize field + name: Normalize field transformation ReplaceFileFromStringTransformation: label: Replace %tablePlaceholder% from %filePlaceholder% name: Replace file from string transformation diff --git a/lib/manager/components/transform/FeedTransformation.js b/lib/manager/components/transform/FeedTransformation.js index 208d55fbe..4bf279230 100644 --- a/lib/manager/components/transform/FeedTransformation.js +++ b/lib/manager/components/transform/FeedTransformation.js @@ -8,7 +8,8 @@ import Select from 'react-select' import {getGtfsSpec, getGtfsPlusSpec, isModuleEnabled} from '../../../common/util/config' import {getTransformationName} from '../../util/transform' import VersionSelectorDropdown from '../version/VersionSelectorDropdown' -import NormalizeFields from './NormalizeFields' +import NormalizeFields, {getNormalizeFieldsValidationIssues} from './NormalizeFields' +import ReplaceFileFromStringFields, {getReplaceFileFromStringValidationIssues} from './ReplaceFileFromStringFields' import type { Feed, @@ -28,9 +29,7 @@ type Props = { * Component that renders fields for a single feed transformation * (e.g., ReplaceFileFromStringTransformation). */ -export default class FeedTransformation extends Component { - state = { csvData: null, fieldName: null } - +export default class FeedTransformation extends Component { _getFieldsForType = (type: string) => { const {feedSource, transformation} = this.props // Get selected version (if applicable). @@ -57,44 +56,14 @@ export default class FeedTransformation extends Component -