├── .eslintignore ├── .eslintrc ├── .github └── workflows │ └── format_eslint.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── index.d.ts ├── index.js ├── package.json ├── src └── MapViewDirections.js └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | **/node_modules/** 2 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | parser: babel-eslint 2 | parserOptions: 3 | sourceType: "module" 4 | ecmaVersion: 6 5 | ecmaFeatures: 6 | jsx: true 7 | 8 | env: 9 | react-native/react-native: true 10 | 11 | globals: 12 | __DEV__: true 13 | __PROD__: true 14 | React: false 15 | 16 | extends: 17 | - eslint:recommended 18 | - plugin:react/recommended 19 | 20 | rules: 21 | indent: 22 | - error 23 | - tab 24 | comma-dangle: 25 | - error 26 | - always-multiline 27 | semi: 2 28 | no-use-before-define: 2 29 | no-useless-constructor: 2 30 | react/no-array-index-key: 2 31 | react/no-deprecated: 2 32 | react/no-did-mount-set-state: 2 33 | react/no-did-update-set-state: 2 34 | react/no-direct-mutation-state: 2 35 | react/no-find-dom-node: 2 36 | react/no-is-mounted: 2 37 | react/no-multi-comp: 2 38 | react/no-redundant-should-component-update: 2 39 | react/no-string-refs: 2 40 | react/no-unused-prop-types: 2 41 | react/jsx-closing-bracket-location: 2 42 | react/jsx-closing-tag-location: 2 43 | react/jsx-indent: 44 | - error 45 | - tab 46 | react/jsx-indent-props: 47 | - error 48 | - tab 49 | react/jsx-key: 2 50 | react/jsx-no-bind: 2 51 | react/jsx-no-comment-textnodes: 2 52 | react/jsx-no-duplicate-props: 2 53 | react/jsx-no-undef: 2 54 | react/jsx-one-expression-per-line: 2 55 | react/jsx-tag-spacing: 2 56 | react/prefer-es6-class: 2 57 | react/prefer-stateless-function: 1 58 | react/prop-types: 2 59 | react/require-render-return: 2 60 | react/self-closing-comp: 61 | - error 62 | - component: true 63 | react/style-prop-object: 2 64 | react-native/no-unused-styles: 2 65 | react-native/no-inline-styles: 2 66 | react-native/no-color-literals: 1 67 | 68 | plugins: 69 | - react 70 | - react-native -------------------------------------------------------------------------------- /.github/workflows/format_eslint.yml: -------------------------------------------------------------------------------- 1 | name: Format (eslint) 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - '**.js' 7 | 8 | jobs: 9 | eslint: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v1 13 | 14 | - name: Install 15 | run: yarn --non-interactive --silent --ignore-scripts --production=false install 16 | env: 17 | CI: true 18 | 19 | - name: Run prettier 20 | run: yarn lint --fix 21 | 22 | - uses: stefanzweifel/git-auto-commit-action@v2.1.0 23 | with: 24 | commit_message: "🚨 Fix Lint Errors" 25 | branch: ${{ github.head_ref }} 26 | env: 27 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .github 2 | .eslintignore 3 | .eslintrc 4 | v2.md -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # `react-native-maps-directions` Changelog 2 | 3 | ## 1.9.0 – 2022-07-27 4 | 5 | - Fix: `timePrecision` prop type to `MapViewDirectionsTimePrecision` 6 | - Add `legs` in `onReady` callback; 7 | - Add types in `onReady`return; 8 | - Compatibility with `react-native-maps` 1.0.0 9 | 10 | ## 1.8.0 - 2020-04-14 11 | 12 | - Add `waypointOrder` in `onReady` callback (#139) 13 | 14 | ## 1.7.6 - 2020-03-17 15 | 16 | - Improve error handling in case a request to the Google Maps Directions API fails (#132) 17 | - Improve error handling when no `apikey` prop is given 18 | 19 | ## 1.7.5 - 2020-03-17 20 | 21 | - Fix “Cannot set property 'map' of undefined” error (#130 #131 #132) 22 | 23 | ## 1.7.4 - 2020-03-14 24 | 25 | - Add `channel` and `timePrecision` props to reduce the cost of Google maps (#129, thanks @rohitbansa) 26 | 27 | ## 1.7.3 - 2019-10-02 28 | 29 | - Add `precision` prop to allow one to choose between the ”Steps Polyline” and “Overview Polyline” 30 | 31 | ## 1.7.2 - 2019-10-02 32 | 33 | - Fix bug where duration was wrongfully calculated when using waypoints 34 | - Fix bug where not all legs of a route were drawn 35 | 36 | ## 1.7.1 - 2019-10-02 37 | 38 | - Fall back to standard duration in case “duration with traffic” is not given 39 | - Use “Steps polyline”, instead of “Overview polyline” (regression fix) 40 | - Update dependencies 41 | 42 | ## 1.7.0 - 2019-05-17 43 | 44 | - Add `optimizeWaypoints` prop to allow use of waypoints optimization. 45 | - Add `region` prop. 46 | - Return “Duration with traffic” as `duration` 47 | - Return `fare` in `onReady` 48 | 49 | 50 | ## 1.6.0 - 2018-03-09 51 | 52 | - Add `directionsServiceBaseUrl` prop to allow customisation of service to use. 53 | 54 | ## 1.5.0 - 2018-02-23 55 | 56 | - Add support for `resetOnChange` prop to prevent glitches whenn recalculating (#21) 57 | - Add `onStart` callback prop to know when routing starts 58 | 59 | ## 1.4.1 - 2018-01-31 60 | 61 | - Fix a bug where new origin/destination objects (with same values) trigger an endless loop (#13) 62 | 63 | ## 1.4.0 - 2018-01-07 64 | 65 | - Add support for waypoints (#10) 66 | 67 | ## 1.3.0 - 2017-12-21 68 | 69 | - Fix “Unmouting while a fetch is still in progress yields a warning” #5 70 | 71 | ## 1.2.0 - 2017-12-12 72 | 73 | - Add `language` and `mode` props 74 | 75 | ## 1.1.0 - 2017-11-23 76 | 77 | - Add `onReady` and `onError` events/callbacks 78 | 79 | ## 1.0.0 - 2017-11-19 80 | 81 | - initial release 82 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Bram(us) Van Damme - http://www.bram.us/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `react-native-maps-directions` 2 | 3 | [![npm Version](https://img.shields.io/npm/v/react-native-maps-directions.svg?style=flat)](https://www.npmjs.com/package/react-native-maps-directions) 4 | [![npm Downloads](https://img.shields.io/npm/dm/react-native-maps-directions.svg)](https://www.npmtrends.com/react-native-maps-directions) 5 | [![Contributors](https://img.shields.io/github/contributors/bramus/react-native-maps-directions.svg)](https://github.com/bramus/react-native-maps-directions/graphs/contributors) 6 | [![GitHub Last Commit](https://img.shields.io/github/last-commit/bramus/react-native-maps-directions.svg)](https://github.com/bramus/react-native-maps-directions) 7 | [![License](https://img.shields.io/npm/l/react-native-maps-directions.svg)](LICENSE.md) 8 | 9 | Directions component for [`react-native-maps`](https://github.com/airbnb/react-native-maps/) – Draw a route between two coordinates, powered by the Google Maps Directions API 10 | 11 | ![react-native-maps-directions](https://user-images.githubusercontent.com/213073/33188062-efc86e24-d096-11e7-87eb-6925291bc809.png) 12 | 13 | ## Installation 14 | 15 | Install `react-native-maps-directions` as a dependency using either 16 | 17 | - [Node's `npm`](https://nodejs.org/en/download/) 18 | 19 | ``` 20 | npm install react-native-maps-directions 21 | ``` 22 | 23 | - [Yarn](https://yarnpkg.com/en/docs/install) 24 | 25 | ``` 26 | yarn add react-native-maps-directions 27 | ``` 28 | 29 | ## Basic Usage 30 | 31 | Import `MapViewDirections` and render it as a child of a `MapView` component. The mandatory `MapViewDirections` props are: 32 | 33 | - `origin`: The origin location to start routing from 34 | - `destination`: The destination location to start routing to 35 | - `apikey`: Your Google Maps Directions API Key _(request one [here](https://developers.google.com/maps/documentation/directions/get-api-key); if you're using an existing Google Maps API Key make sure you've enabled the Google Maps Directions API for that key using the [Google API Console](https://console.developers.google.com/apis/))_. 36 | 37 | ```js 38 | import MapViewDirections from 'react-native-maps-directions'; 39 | 40 | const origin = {latitude: 37.3318456, longitude: -122.0296002}; 41 | const destination = {latitude: 37.771707, longitude: -122.4053769}; 42 | const GOOGLE_MAPS_APIKEY = '…'; 43 | 44 | 45 | 50 | 51 | ``` 52 | 53 | Once the directions in between `destination` and `origin` has been fetched, a `MapView.Polyline` between the two will be drawn. Whenever one of both changes, new directions will be fetched and rendered. 54 | 55 | ## Component API 56 | 57 | ### Props 58 | 59 | | Prop | Type | Default | Note 60 | |---|---|---|---| 61 | | `origin` | `LatLng` or `String` | | The origin location to start routing from. 62 | | `destination` | `LatLng` or `String` | | The destination location to start routing to. 63 | | `apikey` | `String` | | Your Google Maps API Key _(request one [here](https://developers.google.com/maps/documentation/directions/get-api-key); if you're using an existing Google Maps API Key make sure you've enabled the Google Maps Directions API for that key using the [Google API Console](https://console.developers.google.com/apis/) by hitting the “Enable APIs and Services“ button)_. 64 | | `waypoints` | [`LatLng` or `String`] | `[]` | Array of waypoints to use between origin and destination. 65 | | `language` | `String` | `"en"` | The language to use when calculating directions. See [here](https://developers.google.com/maps/documentation/javascript/localization) for more info. 66 | | `mode` | `String` | `"DRIVING"` | Which transportation mode to use when calculating directions. Allowed values are `"DRIVING"`, `"BICYCLING"`, `"WALKING"`, and `"TRANSIT"`. _(See [here](https://developers.google.com/maps/documentation/javascript/examples/directions-travel-modes) for more info)_. 67 | | `resetOnChange` | `boolean` | `true` | Tweak if the rendered `MapView.Polyline` should reset or not when calculating the route between `origin` and `destionation`. Set to `false` if you see the directions line glitching. 68 | | `optimizeWaypoints` | `boolean` | `false` | Set it to true if you would like Google Maps to re-order all the waypoints to optimize the route for the fastest route. Please be aware that if this option is enabled, you will be billed at a higher rate by Google as stated [here](https://developers.google.com/maps/documentation/javascript/directions#Waypoints). 69 | | `splitWaypoints` | `boolean` | `false` | Directions API has a [limit](https://developers.google.com/maps/documentation/directions/usage-and-billing#directions-advanced) of 10 or 25 (depends on the billing plan) waypoints per route. When exceeding this limit you will be billed at a higher reate by Google. Set this to `true` if you would like to automatically split waypoints into multiple routes, thus bypassing this waypoints limit. 70 | | `directionsServiceBaseUrl` | `string` | _(Google's)_ | Base URL of the Directions Service (API) you are using. By default the Google Directions API is used (`"https://maps.googleapis.com/maps/api/directions/json"`). Usually you won't need to change this. 71 | | `region` | `String` | | If you are using strings for **origin** or **destination**, sometimes you will get an incorrect route because Google Maps API needs the region where this places belong to. See [here](https://developers.google.com/maps/documentation/javascript/localization#Region) for more info. 72 | | `precision` | `String` | `"low"` | The precision level of detail of the drawn polyline. Allowed values are "high", and "low". Setting to "low" will yield a polyline that is an approximate (smoothed) path of the resulting directions. Setting to "high" may cause a hit in performance in case a complex route is returned. 73 | | `timePrecision` | `String` | `"none"` | The timePrecision to get Realtime traffic info. Allowed values are "none", and "now". Defaults to "none". 74 | | `channel` | `String` | `null` | If you include the channel parameter in your requests, you can generate a Successful Requests report that shows a breakdown of your application's API requests across different applications that use the same client ID (such as externally facing access vs. internally facing access). 75 | #### More props 76 | 77 | Since the result rendered on screen is a `MapView.Polyline` component, all [`MapView.Polyline` props](https://github.com/airbnb/react-native-maps/blob/master/docs/polyline.md#props) – except for `coordinates` – are also accepted. 78 | 79 | ```js 80 | 81 | 88 | 89 | ``` 90 | 91 | #### An extra note on `origin` and `destination` 92 | 93 | The values for the `origin` and `destination` props can take several forms. They can either be: 94 | 95 | - Coordinates in the form of an object with `latitude` and `longitude` keys 96 | - Coordinates in the form of a string with `latitude` and `longitude` values separated by a comma 97 | - Strings representing an address 98 | - Strings representing a location 99 | - Strings containing a Place Id from the Google Maps Place API prefixed with `place_id:` 100 | 101 | All examples below have the same `origin` location, represented in the formats mentioned above: 102 | 103 | ```js 104 | 105 | 106 | 107 | 108 | 109 | ``` 110 | 111 | Note: The `origin` and `destination` props don't need to use the same representation, you may mix them. 112 | 113 | Tip: Don't forget to tweak the `language` prop when using localized location names. 114 | 115 | ### Events/Callbacks 116 | 117 | | Event Name | Returns | Notes 118 | |---|---|---| 119 | | `onStart` | `{ origin, destination, waypoints: [] }` | Callback that is called when the routing has started. 120 | | `onReady` | `{ distance: Number, duration: Number, coordinates: [], fare: Object, waypointOrder: [[]] }` | Callback that is called when the routing has succesfully finished. Note: distance returned in kilometers and duration in minutes. 121 | | `onError` | `errorMessage` | Callback that is called in case the routing has failed. 122 | 123 | ## Extended Example 124 | 125 | This example will draw a route between AirBnB's Office and Apple's HQ 126 | 127 | ```js 128 | import React, { Component } from 'react'; 129 | import { Dimensions, StyleSheet } from 'react-native'; 130 | import MapView from 'react-native-maps'; 131 | import MapViewDirections from 'react-native-maps-directions'; 132 | 133 | const { width, height } = Dimensions.get('window'); 134 | const ASPECT_RATIO = width / height; 135 | const LATITUDE = 37.771707; 136 | const LONGITUDE = -122.4053769; 137 | const LATITUDE_DELTA = 0.0922; 138 | const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO; 139 | 140 | const GOOGLE_MAPS_APIKEY = '…'; 141 | 142 | class Example extends Component { 143 | 144 | constructor(props) { 145 | super(props); 146 | 147 | // AirBnB's Office, and Apple Park 148 | this.state = { 149 | coordinates: [ 150 | { 151 | latitude: 37.3317876, 152 | longitude: -122.0054812, 153 | }, 154 | { 155 | latitude: 37.771707, 156 | longitude: -122.4053769, 157 | }, 158 | ], 159 | }; 160 | 161 | this.mapView = null; 162 | } 163 | 164 | onMapPress = (e) => { 165 | this.setState({ 166 | coordinates: [ 167 | ...this.state.coordinates, 168 | e.nativeEvent.coordinate, 169 | ], 170 | }); 171 | } 172 | 173 | render() { 174 | return ( 175 | this.mapView = c} 184 | onPress={this.onMapPress} 185 | > 186 | {this.state.coordinates.map((coordinate, index) => 187 | 188 | )} 189 | {(this.state.coordinates.length >= 2) && ( 190 | 2) ? this.state.coordinates.slice(1, -1): undefined} 193 | destination={this.state.coordinates[this.state.coordinates.length-1]} 194 | apikey={GOOGLE_MAPS_APIKEY} 195 | strokeWidth={3} 196 | strokeColor="hotpink" 197 | optimizeWaypoints={true} 198 | onStart={(params) => { 199 | console.log(`Started routing between "${params.origin}" and "${params.destination}"`); 200 | }} 201 | onReady={result => { 202 | console.log(`Distance: ${result.distance} km`) 203 | console.log(`Duration: ${result.duration} min.`) 204 | 205 | this.mapView.fitToCoordinates(result.coordinates, { 206 | edgePadding: { 207 | right: (width / 20), 208 | bottom: (height / 20), 209 | left: (width / 20), 210 | top: (height / 20), 211 | } 212 | }); 213 | }} 214 | onError={(errorMessage) => { 215 | // console.log('GOT AN ERROR'); 216 | }} 217 | /> 218 | )} 219 | 220 | ); 221 | } 222 | } 223 | 224 | export default Example; 225 | ``` 226 | 227 | ## Example App 228 | 229 | An example app can be found in a separate repo, located at [https://github.com/bramus/react-native-maps-directions-example](https://github.com/bramus/react-native-maps-directions-example). 230 | 231 | ## Changelog 232 | 233 | Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. 234 | 235 | ## Credits 236 | 237 | - Bram(us) Van Damme ([https://www.bram.us/](https://www.bram.us/)) 238 | - [All Contributors](../../contributors) 239 | 240 | This code is inspired upon the article [React Native Maps with Google Directions Api](https://medium.com/@ali_oguzhan/react-native-maps-with-google-directions-api-bc716ed7a366) by [Ali Oğuzhan Yıldız](https://github.com/alioguzhan). 241 | 242 | ## License 243 | 244 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 245 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare module "react-native-maps-directions" { 2 | // Type definitions for react-native-maps-directions 1.6 3 | // Project: https://github.com/bramus/react-native-maps-directions 4 | // Definitions by: Ali Oguzhan Yildiz 5 | // Definitions by: Chris Shaffer (methodbox) 6 | // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped 7 | // TypeScript Version: 3.3 8 | 9 | import * as React from "react"; 10 | 11 | export type MapDirectionsLegs =[ 12 | { 13 | distance: { 14 | text: string, 15 | value: number 16 | }, 17 | duration: { 18 | text: string, 19 | value: number 20 | }, 21 | end_address: string, 22 | end_location: { 23 | lat: number, 24 | lng: number 25 | }, 26 | start_address: string, 27 | start_location: { 28 | lat: number, 29 | lng: number 30 | }, 31 | steps: [{ 32 | distance: { 33 | text: string, 34 | value: number 35 | }, 36 | duration: { 37 | text: string, 38 | value: number 39 | }, 40 | end_location: { 41 | lat: number, 42 | lng: number 43 | }, 44 | start_location: { 45 | lat: number, 46 | lng: number 47 | }, 48 | html_instructions: string, 49 | polyline: { 50 | points: string 51 | }, 52 | travel_mode: string, 53 | maneuver: string | undefined 54 | }], 55 | traffic_speed_entry: [], 56 | via_waypoint: [], 57 | }] 58 | 59 | export type MapDirectionsResponse = { 60 | coordinates: [ 61 | { 62 | latitude: number, 63 | longitude: number 64 | }], 65 | distance: number, 66 | duration: number, 67 | fares: [], 68 | legs: MapDirectionsLegs, 69 | waypointOrder: [[number]] 70 | } 71 | 72 | 73 | 74 | 75 | export type MapViewDirectionsOrigin = 76 | | string 77 | | { 78 | latitude: number; 79 | longitude: number; 80 | }; 81 | 82 | export type MapViewDirectionsWaypoints = 83 | | string 84 | | { 85 | latitude: number; 86 | longitude: number; 87 | }; 88 | 89 | export type MapViewDirectionsDestination = 90 | | string 91 | | { 92 | latitude: number; 93 | longitude: number; 94 | }; 95 | 96 | export type MapViewDirectionsMode = 97 | | "DRIVING" 98 | | "BICYCLING" 99 | | "TRANSIT" 100 | | "WALKING"; 101 | 102 | export type MapViewDirectionsPrecision = 103 | | "high" 104 | | "low"; 105 | 106 | export type MapViewDirectionsTimePrecision = 107 | | "now" 108 | | "none"; 109 | 110 | export interface MapViewDirectionsProps { 111 | /** 112 | * The origin location to start routing from. 113 | */ 114 | origin?: MapViewDirectionsOrigin; 115 | /** 116 | * Array of waypoints to use between origin and destination. 117 | */ 118 | waypoints?: MapViewDirectionsWaypoints[]; 119 | /** 120 | * The destination location to start routing to. 121 | */ 122 | destination?: MapViewDirectionsDestination; 123 | /** 124 | * Your Google Maps API Key 125 | */ 126 | apikey: string; 127 | /** 128 | * Callback that is called when the routing has started. 129 | */ 130 | onStart?: (...args: any[]) => any; 131 | /** 132 | * Callback that is called when the routing has succesfully finished. 133 | */ 134 | onReady?: (...args: MapDirectionsResponse[]) => any; 135 | /** 136 | * Callback that is called in case the routing has failed. 137 | */ 138 | onError?: (...args: any[]) => any; 139 | /** 140 | * Which transportation mode to use when calculating directions. 141 | * Allowed values are "DRIVING", "BICYCLING", "WALKING", and "TRANSIT". 142 | */ 143 | mode?: MapViewDirectionsMode; 144 | /** 145 | * The precision to draw the polyline with. 146 | * Allowed values are "high", and "low". 147 | * Defaults to "low" 148 | */ 149 | precision?: MapViewDirectionsPrecision; 150 | /** 151 | * The timePrecision to get Realtime traffic info. 152 | * Allowed values are "none", and "now". 153 | * Defaults to "none" 154 | */ 155 | timePrecision?: MapViewDirectionsTimePrecision; 156 | /** 157 | * If you include the channel parameter in your requests, 158 | * you can generate a Successful Requests report that shows a breakdown 159 | * of your application's API requests across different applications that 160 | * use the same client ID (such as externally facing access vs. internally 161 | * facing access). 162 | */ 163 | channel?: string; 164 | /** 165 | * The language to use when calculating directions. 166 | */ 167 | language?: string; 168 | /** 169 | * Tweak if the rendered MapView. Polyline should reset or not 170 | * when calculating the route between origin and destionation. 171 | * Set to false if you see the directions line glitching. 172 | */ 173 | resetOnChange?: boolean; 174 | /** 175 | * Set it to true if you would like Google Maps to re-order all the 176 | * waypoints to optimize the route for the fastest route. 177 | * Please be aware that if this option is enabled, 178 | * you will be billed for a higher rate by Google 179 | */ 180 | optimizeWaypoints?: boolean; 181 | /** 182 | * Directions API has a limit of 10 or 25 (depends on the billing plan) 183 | * waypoints per route. So waypoints array size is limited to those numbers. 184 | * Set this to true if you would like to automatically split waypoints to 185 | * multiple routes and by that avoid waypoints limit. 186 | */ 187 | splitWaypoints?: boolean; 188 | /** 189 | * Base URL of the Directions Service (API) you are using. 190 | * By default the Google Directions API is used 191 | * ("https://maps.googleapis.com/maps/api/directions/json"). 192 | * Usually you won't need to change this. 193 | */ 194 | directionsServiceBaseUrl?: string; 195 | /** 196 | * If you are using strings for origin or destination, 197 | * sometimes you will get an incorrect route because 198 | * Google Maps API needs the region where this places belong to. 199 | */ 200 | region?: string; 201 | /** 202 | * @number 203 | * The stroke width to use for the path - the line displayed 204 | * by polyline between two navigation points. 205 | * Default: 1 206 | */ 207 | strokeWidth?: number; 208 | /** 209 | * @string 210 | * The stroke color to use for the path. 211 | * Default: "#000" 212 | */ 213 | strokeColor?: string; 214 | /** 215 | * @Array 216 | * The stroke colors to use for the path (iOS only). 217 | * Must be the same length as coordinates. 218 | * Default: null 219 | */ 220 | strokeColors?: Array; 221 | /** 222 | * @string 223 | * The line cap style to apply to the open ends of the path. 224 | * Possible values are butt, round or square. 225 | * Note: lineCap is not yet supported for GoogleMaps provider on iOS. 226 | * Default: "round" 227 | */ 228 | lineCap?: string; 229 | /** 230 | * @string 231 | * The line join style to apply to corners of the path. 232 | * Possible values are miter, round or bevel. 233 | * Default: "round" 234 | */ 235 | lineJoin?: string; 236 | /** 237 | * @number 238 | * The limiting value that helps avoid spikes at junctions 239 | * between connected line segments. The miter limit helps you avoid 240 | * spikes in paths that use the miter lineJoin style. If the ratio of 241 | * the miter length—that is, the diagonal length of the miter join—to 242 | * the line thickness exceeds the miter limit, the joint is converted 243 | * to a bevel join. The default miter limit is 10, which results in the 244 | * conversion of miters whose angle at the joint is less than 11 degrees. 245 | */ 246 | miterLimit?: number; 247 | /** 248 | * @boolean 249 | * Boolean to indicate whether to draw each segment of the line as a geodesic 250 | * as opposed to straight lines on the Mercator projection. A geodesic is the 251 | * shortest path between two points on the Earth's surface. 252 | * The geodesic curve is constructed assuming the Earth is a sphere. 253 | */ 254 | geodesic?: boolean; 255 | /** 256 | * @number 257 | * (iOS only) The offset (in points) at which to start drawing the 258 | * dash pattern. Use this property to start drawing a dashed line 259 | * partway through a segment or gap. For example, a phase value of 6 for 260 | * the patter 5-2-3-2 would cause drawing to begin in the middle of the first gap. 261 | * Default: 0 262 | */ 263 | lineDashPhase?: number; 264 | /** 265 | * @Array 266 | * An array of numbers specifying the dash pattern to use for the path. 267 | * The array contains one or more numbers that indicate the lengths (measured in points) 268 | * of the line segments and gaps in the pattern. The values in the array alternate, 269 | * starting with the first line segment length, followed by the first gap length, 270 | * followed by the second line segment length, and so on. 271 | * Default: null 272 | */ 273 | lineDashPattern?: Array; 274 | /** 275 | * @boolean 276 | * Boolean to allow a polyline to be tappable and use the onPress function. 277 | */ 278 | tappable?: boolean; 279 | } 280 | 281 | export default class MapViewDirections extends React.Component< 282 | MapViewDirectionsProps, 283 | any 284 | > { 285 | render(): JSX.Element; 286 | } 287 | } 288 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import MapViewDirections from './src/MapViewDirections'; 2 | 3 | export default MapViewDirections; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-maps-directions", 3 | "version": "1.9.0", 4 | "description": "Directions Component for react-native-maps", 5 | "main": "index.js", 6 | "scripts": { 7 | "lint": "eslint .", 8 | "lint:watch": "esw --watch" 9 | }, 10 | "author": { 11 | "name": "Bramus!", 12 | "email": "bramus@bram.us", 13 | "url": "https://www.bram.us/" 14 | }, 15 | "repository": "https://github.com/bramus/react-native-maps-directions", 16 | "keywords": [ 17 | "react-native", 18 | "react-native-component", 19 | "react-native-maps", 20 | "directions", 21 | "google-maps", 22 | "ios", 23 | "android" 24 | ], 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/bramus/react-native-maps-directions/issues" 28 | }, 29 | "homepage": "https://github.com/bramus/react-native-maps-directions", 30 | "peerDependencies": { 31 | "react": "*", 32 | "react-native": "*", 33 | "react-native-maps": ">=1.0.0" 34 | }, 35 | "private": false, 36 | "dependencies": { 37 | "lodash.isequal": "^4.5.0", 38 | "prop-types": "^15.6.0" 39 | }, 40 | "devDependencies": { 41 | "babel-eslint": "^8.0.2", 42 | "eslint": "^4.11.0", 43 | "eslint-plugin-react": "^7.5.1", 44 | "eslint-plugin-react-native": "^3.2.0" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/MapViewDirections.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { Polyline } from 'react-native-maps'; 4 | import isEqual from 'lodash.isequal'; 5 | 6 | const WAYPOINT_LIMIT = 10; 7 | 8 | class MapViewDirections extends Component { 9 | 10 | constructor(props) { 11 | super(props); 12 | 13 | this.state = { 14 | coordinates: null, 15 | distance: null, 16 | duration: null, 17 | }; 18 | } 19 | 20 | componentDidMount() { 21 | this.fetchAndRenderRoute(this.props); 22 | } 23 | 24 | componentDidUpdate(prevProps) { 25 | if (!isEqual(prevProps.origin, this.props.origin) || !isEqual(prevProps.destination, this.props.destination) || !isEqual(prevProps.waypoints, this.props.waypoints) || !isEqual(prevProps.mode, this.props.mode) || !isEqual(prevProps.precision, this.props.precision) || !isEqual(prevProps.splitWaypoints, this.props.splitWaypoints)) { 26 | if (this.props.resetOnChange === false) { 27 | this.fetchAndRenderRoute(this.props); 28 | } else { 29 | this.resetState(() => { 30 | this.fetchAndRenderRoute(this.props); 31 | }); 32 | } 33 | } 34 | } 35 | 36 | resetState = (cb = null) => { 37 | this.setState({ 38 | coordinates: null, 39 | distance: null, 40 | duration: null, 41 | }, cb); 42 | } 43 | 44 | decode(t) { 45 | let points = []; 46 | for (let step of t) { 47 | let encoded = step.polyline.points; 48 | let index = 0, len = encoded.length; 49 | let lat = 0, lng = 0; 50 | while (index < len) { 51 | let b, shift = 0, result = 0; 52 | do { 53 | b = encoded.charAt(index++).charCodeAt(0) - 63; 54 | result |= (b & 0x1f) << shift; 55 | shift += 5; 56 | } while (b >= 0x20); 57 | 58 | let dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 59 | lat += dlat; 60 | shift = 0; 61 | result = 0; 62 | do { 63 | b = encoded.charAt(index++).charCodeAt(0) - 63; 64 | result |= (b & 0x1f) << shift; 65 | shift += 5; 66 | } while (b >= 0x20); 67 | let dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 68 | lng += dlng; 69 | 70 | points.push({ latitude: (lat / 1E5), longitude: (lng / 1E5) }); 71 | } 72 | } 73 | return points; 74 | } 75 | 76 | fetchAndRenderRoute = (props) => { 77 | 78 | let { 79 | origin: initialOrigin, 80 | destination: initialDestination, 81 | waypoints: initialWaypoints = [], 82 | apikey, 83 | onStart, 84 | onReady, 85 | onError, 86 | mode = 'DRIVING', 87 | language = 'en', 88 | optimizeWaypoints, 89 | splitWaypoints, 90 | directionsServiceBaseUrl = 'https://maps.googleapis.com/maps/api/directions/json', 91 | region, 92 | precision = 'low', 93 | timePrecision = 'none', 94 | channel, 95 | } = props; 96 | 97 | if (!apikey) { 98 | console.warn(`MapViewDirections Error: Missing API Key`); // eslint-disable-line no-console 99 | return; 100 | } 101 | 102 | if (!initialOrigin || !initialDestination) { 103 | return; 104 | } 105 | 106 | const timePrecisionString = timePrecision==='none' ? '' : timePrecision; 107 | 108 | // Routes array which we'll be filling. 109 | // We'll perform a Directions API Request for reach route 110 | const routes = []; 111 | 112 | // We need to split the waypoints in chunks, in order to not exceede the max waypoint limit 113 | // ~> Chunk up the waypoints, yielding multiple routes 114 | if (splitWaypoints && initialWaypoints && initialWaypoints.length > WAYPOINT_LIMIT) { 115 | // Split up waypoints in chunks with chunksize WAYPOINT_LIMIT 116 | const chunckedWaypoints = initialWaypoints.reduce((accumulator, waypoint, index) => { 117 | const numChunk = Math.floor(index / WAYPOINT_LIMIT); 118 | accumulator[numChunk] = [].concat((accumulator[numChunk] || []), waypoint); 119 | return accumulator; 120 | }, []); 121 | 122 | // Create routes for each chunk, using: 123 | // - Endpoints of previous chunks as startpoints for the route (except for the first chunk, which uses initialOrigin) 124 | // - Startpoints of next chunks as endpoints for the route (except for the last chunk, which uses initialDestination) 125 | for (let i = 0; i < chunckedWaypoints.length; i++) { 126 | routes.push({ 127 | waypoints: chunckedWaypoints[i], 128 | origin: (i === 0) ? initialOrigin : chunckedWaypoints[i-1][chunckedWaypoints[i-1].length - 1], 129 | destination: (i === chunckedWaypoints.length - 1) ? initialDestination : chunckedWaypoints[i+1][0], 130 | }); 131 | } 132 | } 133 | 134 | // No splitting of the waypoints is requested/needed. 135 | // ~> Use one single route 136 | else { 137 | routes.push({ 138 | waypoints: initialWaypoints, 139 | origin: initialOrigin, 140 | destination: initialDestination, 141 | }); 142 | } 143 | 144 | // Perform a Directions API Request for each route 145 | Promise.all(routes.map((route, index) => { 146 | let { 147 | origin, 148 | destination, 149 | waypoints, 150 | } = route; 151 | 152 | if (origin.latitude && origin.longitude) { 153 | origin = `${origin.latitude},${origin.longitude}`; 154 | } 155 | 156 | if (destination.latitude && destination.longitude) { 157 | destination = `${destination.latitude},${destination.longitude}`; 158 | } 159 | 160 | waypoints = waypoints 161 | .map(waypoint => (waypoint.latitude && waypoint.longitude) ? `${waypoint.latitude},${waypoint.longitude}` : waypoint) 162 | .join('|'); 163 | 164 | if (optimizeWaypoints) { 165 | waypoints = `optimize:true|${waypoints}`; 166 | } 167 | 168 | if (index === 0) { 169 | onStart && onStart({ 170 | origin, 171 | destination, 172 | waypoints: initialWaypoints, 173 | }); 174 | } 175 | 176 | return ( 177 | this.fetchRoute(directionsServiceBaseUrl, origin, waypoints, destination, apikey, mode, language, region, precision, timePrecisionString, channel) 178 | .then(result => { 179 | return result; 180 | }) 181 | .catch(errorMessage => { 182 | return Promise.reject(errorMessage); 183 | }) 184 | ); 185 | })).then(results => { 186 | // Combine all Directions API Request results into one 187 | const result = results.reduce((acc, { distance, duration, coordinates, fare, legs, waypointOrder }) => { 188 | acc.coordinates = [ 189 | ...acc.coordinates, 190 | ...coordinates, 191 | ]; 192 | acc.distance += distance; 193 | acc.duration += duration; 194 | acc.fares = [ 195 | ...acc.fares, 196 | fare, 197 | ]; 198 | acc.legs = legs; 199 | acc.waypointOrder = [ 200 | ...acc.waypointOrder, 201 | waypointOrder, 202 | ]; 203 | 204 | return acc; 205 | }, { 206 | coordinates: [], 207 | distance: 0, 208 | duration: 0, 209 | fares: [], 210 | legs: [], 211 | waypointOrder: [], 212 | }); 213 | 214 | // Plot it out and call the onReady callback 215 | this.setState({ 216 | coordinates: result.coordinates, 217 | }, function() { 218 | if (onReady) { 219 | onReady(result); 220 | } 221 | }); 222 | }) 223 | .catch(errorMessage => { 224 | this.resetState(); 225 | console.warn(`MapViewDirections Error: ${errorMessage}`); // eslint-disable-line no-console 226 | onError && onError(errorMessage); 227 | }); 228 | } 229 | 230 | fetchRoute(directionsServiceBaseUrl, origin, waypoints, destination, apikey, mode, language, region, precision, timePrecision, channel) { 231 | 232 | // Define the URL to call. Only add default parameters to the URL if it's a string. 233 | let url = directionsServiceBaseUrl; 234 | if (typeof (directionsServiceBaseUrl) === 'string') { 235 | url += `?origin=${origin}&waypoints=${waypoints}&destination=${destination}&key=${apikey}&mode=${mode.toLowerCase()}&language=${language}®ion=${region}`; 236 | if(timePrecision){ 237 | url+=`&departure_time=${timePrecision}`; 238 | } 239 | if(channel){ 240 | url+=`&channel=${channel}`; 241 | } 242 | } 243 | 244 | return fetch(url) 245 | .then(response => response.json()) 246 | .then(json => { 247 | 248 | if (json.status !== 'OK') { 249 | const errorMessage = json.error_message || json.status || 'Unknown error'; 250 | return Promise.reject(errorMessage); 251 | } 252 | 253 | if (json.routes.length) { 254 | 255 | const route = json.routes[0]; 256 | 257 | return Promise.resolve({ 258 | distance: route.legs.reduce((carry, curr) => { 259 | return carry + curr.distance.value; 260 | }, 0) / 1000, 261 | duration: route.legs.reduce((carry, curr) => { 262 | return carry + (curr.duration_in_traffic ? curr.duration_in_traffic.value : curr.duration.value); 263 | }, 0) / 60, 264 | coordinates: ( 265 | (precision === 'low') ? 266 | this.decode([{polyline: route.overview_polyline}]) : 267 | route.legs.reduce((carry, curr) => { 268 | return [ 269 | ...carry, 270 | ...this.decode(curr.steps), 271 | ]; 272 | }, []) 273 | ), 274 | fare: route.fare, 275 | waypointOrder: route.waypoint_order, 276 | legs: route.legs, 277 | }); 278 | 279 | } else { 280 | return Promise.reject(); 281 | } 282 | }) 283 | .catch(err => { 284 | return Promise.reject(`Error on GMAPS route request: ${err}`); 285 | }); 286 | } 287 | 288 | render() { 289 | const { coordinates } = this.state; 290 | 291 | if (!coordinates) { 292 | return null; 293 | } 294 | 295 | const { 296 | origin, // eslint-disable-line no-unused-vars 297 | waypoints, // eslint-disable-line no-unused-vars 298 | splitWaypoints, // eslint-disable-line no-unused-vars 299 | destination, // eslint-disable-line no-unused-vars 300 | apikey, // eslint-disable-line no-unused-vars 301 | onReady, // eslint-disable-line no-unused-vars 302 | onError, // eslint-disable-line no-unused-vars 303 | mode, // eslint-disable-line no-unused-vars 304 | language, // eslint-disable-line no-unused-vars 305 | region, // eslint-disable-line no-unused-vars 306 | precision, // eslint-disable-line no-unused-vars 307 | ...props 308 | } = this.props; 309 | 310 | return ( 311 | 312 | ); 313 | } 314 | 315 | } 316 | 317 | MapViewDirections.propTypes = { 318 | origin: PropTypes.oneOfType([ 319 | PropTypes.string, 320 | PropTypes.shape({ 321 | latitude: PropTypes.number.isRequired, 322 | longitude: PropTypes.number.isRequired, 323 | }), 324 | ]), 325 | waypoints: PropTypes.arrayOf( 326 | PropTypes.oneOfType([ 327 | PropTypes.string, 328 | PropTypes.shape({ 329 | latitude: PropTypes.number.isRequired, 330 | longitude: PropTypes.number.isRequired, 331 | }), 332 | ]), 333 | ), 334 | destination: PropTypes.oneOfType([ 335 | PropTypes.string, 336 | PropTypes.shape({ 337 | latitude: PropTypes.number.isRequired, 338 | longitude: PropTypes.number.isRequired, 339 | }), 340 | ]), 341 | apikey: PropTypes.string.isRequired, 342 | onStart: PropTypes.func, 343 | onReady: PropTypes.func, 344 | onError: PropTypes.func, 345 | mode: PropTypes.oneOf(['DRIVING', 'BICYCLING', 'TRANSIT', 'WALKING']), 346 | language: PropTypes.string, 347 | resetOnChange: PropTypes.bool, 348 | optimizeWaypoints: PropTypes.bool, 349 | splitWaypoints: PropTypes.bool, 350 | directionsServiceBaseUrl: PropTypes.string, 351 | region: PropTypes.string, 352 | precision: PropTypes.oneOf(['high', 'low']), 353 | timePrecision: PropTypes.oneOf(['now', 'none']), 354 | channel: PropTypes.string, 355 | }; 356 | 357 | export default MapViewDirections; 358 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.0.0-beta.32", "@babel/code-frame@^7.0.0-beta.31": 6 | version "7.0.0-beta.32" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.32.tgz#04f231b8ec70370df830d9926ce0f5add074ec4c" 8 | dependencies: 9 | chalk "^2.0.0" 10 | esutils "^2.0.2" 11 | js-tokens "^3.0.0" 12 | 13 | "@babel/helper-function-name@7.0.0-beta.32": 14 | version "7.0.0-beta.32" 15 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.32.tgz#6161af4419f1b4e3ed2d28c0c79c160e218be1f3" 16 | dependencies: 17 | "@babel/helper-get-function-arity" "7.0.0-beta.32" 18 | "@babel/template" "7.0.0-beta.32" 19 | "@babel/types" "7.0.0-beta.32" 20 | 21 | "@babel/helper-get-function-arity@7.0.0-beta.32": 22 | version "7.0.0-beta.32" 23 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.32.tgz#93721a99db3757de575a83bab7c453299abca568" 24 | dependencies: 25 | "@babel/types" "7.0.0-beta.32" 26 | 27 | "@babel/template@7.0.0-beta.32": 28 | version "7.0.0-beta.32" 29 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.32.tgz#e1d9fdbd2a7bcf128f2f920744a67dab18072495" 30 | dependencies: 31 | "@babel/code-frame" "7.0.0-beta.32" 32 | "@babel/types" "7.0.0-beta.32" 33 | babylon "7.0.0-beta.32" 34 | lodash "^4.2.0" 35 | 36 | "@babel/traverse@^7.0.0-beta.31": 37 | version "7.0.0-beta.32" 38 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.32.tgz#b78b754c6e1af3360626183738e4c7a05951bc99" 39 | dependencies: 40 | "@babel/code-frame" "7.0.0-beta.32" 41 | "@babel/helper-function-name" "7.0.0-beta.32" 42 | "@babel/types" "7.0.0-beta.32" 43 | babylon "7.0.0-beta.32" 44 | debug "^3.0.1" 45 | globals "^10.0.0" 46 | invariant "^2.2.0" 47 | lodash "^4.2.0" 48 | 49 | "@babel/types@7.0.0-beta.32", "@babel/types@^7.0.0-beta.31": 50 | version "7.0.0-beta.32" 51 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.32.tgz#c317d0ecc89297b80bbcb2f50608e31f6452a5ff" 52 | dependencies: 53 | esutils "^2.0.2" 54 | lodash "^4.2.0" 55 | to-fast-properties "^2.0.0" 56 | 57 | acorn-jsx@^3.0.0: 58 | version "3.0.1" 59 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 60 | dependencies: 61 | acorn "^3.0.4" 62 | 63 | acorn@^3.0.4: 64 | version "3.3.0" 65 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 66 | 67 | acorn@^5.2.1: 68 | version "5.2.1" 69 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" 70 | 71 | ajv-keywords@^2.1.0: 72 | version "2.1.1" 73 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 74 | 75 | ajv@^5.2.3, ajv@^5.3.0: 76 | version "5.4.0" 77 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" 78 | dependencies: 79 | co "^4.6.0" 80 | fast-deep-equal "^1.0.0" 81 | fast-json-stable-stringify "^2.0.0" 82 | json-schema-traverse "^0.3.0" 83 | 84 | ansi-escapes@^3.0.0: 85 | version "3.0.0" 86 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" 87 | 88 | ansi-regex@^2.0.0: 89 | version "2.1.1" 90 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 91 | 92 | ansi-regex@^3.0.0: 93 | version "3.0.0" 94 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 95 | 96 | ansi-styles@^2.2.1: 97 | version "2.2.1" 98 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 99 | 100 | ansi-styles@^3.1.0: 101 | version "3.2.0" 102 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 103 | dependencies: 104 | color-convert "^1.9.0" 105 | 106 | argparse@^1.0.7: 107 | version "1.0.10" 108 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 109 | dependencies: 110 | sprintf-js "~1.0.2" 111 | 112 | array-includes@^3.0.3: 113 | version "3.0.3" 114 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 115 | dependencies: 116 | define-properties "^1.1.2" 117 | es-abstract "^1.7.0" 118 | 119 | array-union@^1.0.1: 120 | version "1.0.2" 121 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 122 | dependencies: 123 | array-uniq "^1.0.1" 124 | 125 | array-uniq@^1.0.1: 126 | version "1.0.3" 127 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 128 | 129 | arrify@^1.0.0: 130 | version "1.0.1" 131 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 132 | 133 | asap@~2.0.3: 134 | version "2.0.6" 135 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 136 | 137 | babel-code-frame@^6.22.0: 138 | version "6.26.0" 139 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 140 | dependencies: 141 | chalk "^1.1.3" 142 | esutils "^2.0.2" 143 | js-tokens "^3.0.2" 144 | 145 | babel-eslint@^8.0.2: 146 | version "8.0.2" 147 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.0.2.tgz#e44fb9a037d749486071d52d65312f5c20aa7530" 148 | dependencies: 149 | "@babel/code-frame" "^7.0.0-beta.31" 150 | "@babel/traverse" "^7.0.0-beta.31" 151 | "@babel/types" "^7.0.0-beta.31" 152 | babylon "^7.0.0-beta.31" 153 | 154 | babylon@7.0.0-beta.32, babylon@^7.0.0-beta.31: 155 | version "7.0.0-beta.32" 156 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.32.tgz#e9033cb077f64d6895f4125968b37dc0a8c3bc6e" 157 | 158 | balanced-match@^1.0.0: 159 | version "1.0.0" 160 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 161 | 162 | brace-expansion@^1.1.7: 163 | version "1.1.8" 164 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 165 | dependencies: 166 | balanced-match "^1.0.0" 167 | concat-map "0.0.1" 168 | 169 | caller-path@^0.1.0: 170 | version "0.1.0" 171 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 172 | dependencies: 173 | callsites "^0.2.0" 174 | 175 | callsites@^0.2.0: 176 | version "0.2.0" 177 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 178 | 179 | chalk@^1.1.3: 180 | version "1.1.3" 181 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 182 | dependencies: 183 | ansi-styles "^2.2.1" 184 | escape-string-regexp "^1.0.2" 185 | has-ansi "^2.0.0" 186 | strip-ansi "^3.0.0" 187 | supports-color "^2.0.0" 188 | 189 | chalk@^2.0.0, chalk@^2.1.0: 190 | version "2.3.0" 191 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 192 | dependencies: 193 | ansi-styles "^3.1.0" 194 | escape-string-regexp "^1.0.5" 195 | supports-color "^4.0.0" 196 | 197 | chardet@^0.4.0: 198 | version "0.4.0" 199 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.0.tgz#0bbe1355ac44d7a3ed4a925707c4ef70f8190f6c" 200 | 201 | circular-json@^0.3.1: 202 | version "0.3.3" 203 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 204 | 205 | cli-cursor@^2.1.0: 206 | version "2.1.0" 207 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 208 | dependencies: 209 | restore-cursor "^2.0.0" 210 | 211 | cli-width@^2.0.0: 212 | version "2.2.0" 213 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 214 | 215 | co@^4.6.0: 216 | version "4.6.0" 217 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 218 | 219 | color-convert@^1.9.0: 220 | version "1.9.1" 221 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 222 | dependencies: 223 | color-name "^1.1.1" 224 | 225 | color-name@^1.1.1: 226 | version "1.1.3" 227 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 228 | 229 | concat-map@0.0.1: 230 | version "0.0.1" 231 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 232 | 233 | concat-stream@^1.6.0: 234 | version "1.6.0" 235 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 236 | dependencies: 237 | inherits "^2.0.3" 238 | readable-stream "^2.2.2" 239 | typedarray "^0.0.6" 240 | 241 | core-js@^1.0.0: 242 | version "1.2.7" 243 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 244 | 245 | core-util-is@~1.0.0: 246 | version "1.0.2" 247 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 248 | 249 | cross-spawn@^5.1.0: 250 | version "5.1.0" 251 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 252 | dependencies: 253 | lru-cache "^4.0.1" 254 | shebang-command "^1.2.0" 255 | which "^1.2.9" 256 | 257 | debug@^3.0.1, debug@^3.1.0: 258 | version "3.2.6" 259 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 260 | dependencies: 261 | ms "^2.1.1" 262 | 263 | deep-is@~0.1.3: 264 | version "0.1.3" 265 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 266 | 267 | define-properties@^1.1.2: 268 | version "1.1.2" 269 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 270 | dependencies: 271 | foreach "^2.0.5" 272 | object-keys "^1.0.8" 273 | 274 | del@^2.0.2: 275 | version "2.2.2" 276 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 277 | dependencies: 278 | globby "^5.0.0" 279 | is-path-cwd "^1.0.0" 280 | is-path-in-cwd "^1.0.0" 281 | object-assign "^4.0.1" 282 | pify "^2.0.0" 283 | pinkie-promise "^2.0.0" 284 | rimraf "^2.2.8" 285 | 286 | doctrine@^2.0.0, doctrine@^2.1.0: 287 | version "2.1.0" 288 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 289 | dependencies: 290 | esutils "^2.0.2" 291 | 292 | encoding@^0.1.11: 293 | version "0.1.12" 294 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 295 | dependencies: 296 | iconv-lite "~0.4.13" 297 | 298 | es-abstract@^1.7.0: 299 | version "1.9.0" 300 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" 301 | dependencies: 302 | es-to-primitive "^1.1.1" 303 | function-bind "^1.1.1" 304 | has "^1.0.1" 305 | is-callable "^1.1.3" 306 | is-regex "^1.0.4" 307 | 308 | es-to-primitive@^1.1.1: 309 | version "1.1.1" 310 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 311 | dependencies: 312 | is-callable "^1.1.1" 313 | is-date-object "^1.0.1" 314 | is-symbol "^1.0.1" 315 | 316 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 317 | version "1.0.5" 318 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 319 | 320 | eslint-plugin-react-native@^3.2.0: 321 | version "3.2.0" 322 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.2.0.tgz#3ec47907858bd07275248bef2de3142ee5c1efb1" 323 | 324 | eslint-plugin-react@^7.5.1: 325 | version "7.5.1" 326 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz#52e56e8d80c810de158859ef07b880d2f56ee30b" 327 | dependencies: 328 | doctrine "^2.0.0" 329 | has "^1.0.1" 330 | jsx-ast-utils "^2.0.0" 331 | prop-types "^15.6.0" 332 | 333 | eslint-scope@^3.7.1: 334 | version "3.7.1" 335 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 336 | dependencies: 337 | esrecurse "^4.1.0" 338 | estraverse "^4.1.1" 339 | 340 | eslint-visitor-keys@^1.0.0: 341 | version "1.0.0" 342 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 343 | 344 | eslint@^4.11.0: 345 | version "4.18.2" 346 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" 347 | dependencies: 348 | ajv "^5.3.0" 349 | babel-code-frame "^6.22.0" 350 | chalk "^2.1.0" 351 | concat-stream "^1.6.0" 352 | cross-spawn "^5.1.0" 353 | debug "^3.1.0" 354 | doctrine "^2.1.0" 355 | eslint-scope "^3.7.1" 356 | eslint-visitor-keys "^1.0.0" 357 | espree "^3.5.2" 358 | esquery "^1.0.0" 359 | esutils "^2.0.2" 360 | file-entry-cache "^2.0.0" 361 | functional-red-black-tree "^1.0.1" 362 | glob "^7.1.2" 363 | globals "^11.0.1" 364 | ignore "^3.3.3" 365 | imurmurhash "^0.1.4" 366 | inquirer "^3.0.6" 367 | is-resolvable "^1.0.0" 368 | js-yaml "^3.9.1" 369 | json-stable-stringify-without-jsonify "^1.0.1" 370 | levn "^0.3.0" 371 | lodash "^4.17.4" 372 | minimatch "^3.0.2" 373 | mkdirp "^0.5.1" 374 | natural-compare "^1.4.0" 375 | optionator "^0.8.2" 376 | path-is-inside "^1.0.2" 377 | pluralize "^7.0.0" 378 | progress "^2.0.0" 379 | require-uncached "^1.0.3" 380 | semver "^5.3.0" 381 | strip-ansi "^4.0.0" 382 | strip-json-comments "~2.0.1" 383 | table "4.0.2" 384 | text-table "~0.2.0" 385 | 386 | espree@^3.5.2: 387 | version "3.5.2" 388 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" 389 | dependencies: 390 | acorn "^5.2.1" 391 | acorn-jsx "^3.0.0" 392 | 393 | esprima@^4.0.0: 394 | version "4.0.1" 395 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 396 | 397 | esquery@^1.0.0: 398 | version "1.0.0" 399 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 400 | dependencies: 401 | estraverse "^4.0.0" 402 | 403 | esrecurse@^4.1.0: 404 | version "4.2.0" 405 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 406 | dependencies: 407 | estraverse "^4.1.0" 408 | object-assign "^4.0.1" 409 | 410 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 411 | version "4.2.0" 412 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 413 | 414 | esutils@^2.0.2: 415 | version "2.0.2" 416 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 417 | 418 | external-editor@^2.0.4: 419 | version "2.1.0" 420 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" 421 | dependencies: 422 | chardet "^0.4.0" 423 | iconv-lite "^0.4.17" 424 | tmp "^0.0.33" 425 | 426 | fast-deep-equal@^1.0.0: 427 | version "1.0.0" 428 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 429 | 430 | fast-json-stable-stringify@^2.0.0: 431 | version "2.0.0" 432 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 433 | 434 | fast-levenshtein@~2.0.4: 435 | version "2.0.6" 436 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 437 | 438 | fbjs@^0.8.16: 439 | version "0.8.16" 440 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" 441 | dependencies: 442 | core-js "^1.0.0" 443 | isomorphic-fetch "^2.1.1" 444 | loose-envify "^1.0.0" 445 | object-assign "^4.1.0" 446 | promise "^7.1.1" 447 | setimmediate "^1.0.5" 448 | ua-parser-js "^0.7.9" 449 | 450 | figures@^2.0.0: 451 | version "2.0.0" 452 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 453 | dependencies: 454 | escape-string-regexp "^1.0.5" 455 | 456 | file-entry-cache@^2.0.0: 457 | version "2.0.0" 458 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 459 | dependencies: 460 | flat-cache "^1.2.1" 461 | object-assign "^4.0.1" 462 | 463 | flat-cache@^1.2.1: 464 | version "1.3.0" 465 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 466 | dependencies: 467 | circular-json "^0.3.1" 468 | del "^2.0.2" 469 | graceful-fs "^4.1.2" 470 | write "^0.2.1" 471 | 472 | foreach@^2.0.5: 473 | version "2.0.5" 474 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 475 | 476 | fs.realpath@^1.0.0: 477 | version "1.0.0" 478 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 479 | 480 | function-bind@^1.0.2, function-bind@^1.1.1: 481 | version "1.1.1" 482 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 483 | 484 | functional-red-black-tree@^1.0.1: 485 | version "1.0.1" 486 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 487 | 488 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 489 | version "7.1.2" 490 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 491 | dependencies: 492 | fs.realpath "^1.0.0" 493 | inflight "^1.0.4" 494 | inherits "2" 495 | minimatch "^3.0.4" 496 | once "^1.3.0" 497 | path-is-absolute "^1.0.0" 498 | 499 | globals@^10.0.0: 500 | version "10.4.0" 501 | resolved "https://registry.yarnpkg.com/globals/-/globals-10.4.0.tgz#5c477388b128a9e4c5c5d01c7a2aca68c68b2da7" 502 | 503 | globals@^11.0.1: 504 | version "11.12.0" 505 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 506 | 507 | globby@^5.0.0: 508 | version "5.0.0" 509 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 510 | dependencies: 511 | array-union "^1.0.1" 512 | arrify "^1.0.0" 513 | glob "^7.0.3" 514 | object-assign "^4.0.1" 515 | pify "^2.0.0" 516 | pinkie-promise "^2.0.0" 517 | 518 | graceful-fs@^4.1.2: 519 | version "4.1.11" 520 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 521 | 522 | has-ansi@^2.0.0: 523 | version "2.0.0" 524 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 525 | dependencies: 526 | ansi-regex "^2.0.0" 527 | 528 | has-flag@^2.0.0: 529 | version "2.0.0" 530 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 531 | 532 | has@^1.0.1: 533 | version "1.0.1" 534 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 535 | dependencies: 536 | function-bind "^1.0.2" 537 | 538 | iconv-lite@^0.4.17, iconv-lite@~0.4.13: 539 | version "0.4.19" 540 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 541 | 542 | ignore@^3.3.3: 543 | version "3.3.7" 544 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" 545 | 546 | imurmurhash@^0.1.4: 547 | version "0.1.4" 548 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 549 | 550 | inflight@^1.0.4: 551 | version "1.0.6" 552 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 553 | dependencies: 554 | once "^1.3.0" 555 | wrappy "1" 556 | 557 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 558 | version "2.0.3" 559 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 560 | 561 | inquirer@^3.0.6: 562 | version "3.3.0" 563 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 564 | dependencies: 565 | ansi-escapes "^3.0.0" 566 | chalk "^2.0.0" 567 | cli-cursor "^2.1.0" 568 | cli-width "^2.0.0" 569 | external-editor "^2.0.4" 570 | figures "^2.0.0" 571 | lodash "^4.3.0" 572 | mute-stream "0.0.7" 573 | run-async "^2.2.0" 574 | rx-lite "^4.0.8" 575 | rx-lite-aggregates "^4.0.8" 576 | string-width "^2.1.0" 577 | strip-ansi "^4.0.0" 578 | through "^2.3.6" 579 | 580 | invariant@^2.2.0: 581 | version "2.2.2" 582 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 583 | dependencies: 584 | loose-envify "^1.0.0" 585 | 586 | is-callable@^1.1.1, is-callable@^1.1.3: 587 | version "1.1.3" 588 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 589 | 590 | is-date-object@^1.0.1: 591 | version "1.0.1" 592 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 593 | 594 | is-fullwidth-code-point@^2.0.0: 595 | version "2.0.0" 596 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 597 | 598 | is-path-cwd@^1.0.0: 599 | version "1.0.0" 600 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 601 | 602 | is-path-in-cwd@^1.0.0: 603 | version "1.0.0" 604 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 605 | dependencies: 606 | is-path-inside "^1.0.0" 607 | 608 | is-path-inside@^1.0.0: 609 | version "1.0.0" 610 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 611 | dependencies: 612 | path-is-inside "^1.0.1" 613 | 614 | is-promise@^2.1.0: 615 | version "2.1.0" 616 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 617 | 618 | is-regex@^1.0.4: 619 | version "1.0.4" 620 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 621 | dependencies: 622 | has "^1.0.1" 623 | 624 | is-resolvable@^1.0.0: 625 | version "1.0.0" 626 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 627 | dependencies: 628 | tryit "^1.0.1" 629 | 630 | is-stream@^1.0.1: 631 | version "1.1.0" 632 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 633 | 634 | is-symbol@^1.0.1: 635 | version "1.0.1" 636 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 637 | 638 | isarray@~1.0.0: 639 | version "1.0.0" 640 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 641 | 642 | isexe@^2.0.0: 643 | version "2.0.0" 644 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 645 | 646 | isomorphic-fetch@^2.1.1: 647 | version "2.2.1" 648 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 649 | dependencies: 650 | node-fetch "^1.0.1" 651 | whatwg-fetch ">=0.10.0" 652 | 653 | js-tokens@^3.0.0, js-tokens@^3.0.2: 654 | version "3.0.2" 655 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 656 | 657 | js-yaml@^3.9.1: 658 | version "3.13.1" 659 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 660 | dependencies: 661 | argparse "^1.0.7" 662 | esprima "^4.0.0" 663 | 664 | json-schema-traverse@^0.3.0: 665 | version "0.3.1" 666 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 667 | 668 | json-stable-stringify-without-jsonify@^1.0.1: 669 | version "1.0.1" 670 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 671 | 672 | jsx-ast-utils@^2.0.0: 673 | version "2.0.1" 674 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" 675 | dependencies: 676 | array-includes "^3.0.3" 677 | 678 | levn@^0.3.0, levn@~0.3.0: 679 | version "0.3.0" 680 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 681 | dependencies: 682 | prelude-ls "~1.1.2" 683 | type-check "~0.3.2" 684 | 685 | lodash.isequal@^4.5.0: 686 | version "4.5.0" 687 | resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 688 | 689 | lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: 690 | version "4.17.15" 691 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 692 | 693 | loose-envify@^1.0.0, loose-envify@^1.3.1: 694 | version "1.3.1" 695 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 696 | dependencies: 697 | js-tokens "^3.0.0" 698 | 699 | lru-cache@^4.0.1: 700 | version "4.1.1" 701 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 702 | dependencies: 703 | pseudomap "^1.0.2" 704 | yallist "^2.1.2" 705 | 706 | mimic-fn@^1.0.0: 707 | version "1.1.0" 708 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 709 | 710 | minimatch@^3.0.2, minimatch@^3.0.4: 711 | version "3.0.4" 712 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 713 | dependencies: 714 | brace-expansion "^1.1.7" 715 | 716 | minimist@0.0.8: 717 | version "0.0.8" 718 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 719 | 720 | mkdirp@^0.5.1: 721 | version "0.5.1" 722 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 723 | dependencies: 724 | minimist "0.0.8" 725 | 726 | ms@^2.1.1: 727 | version "2.1.2" 728 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 729 | 730 | mute-stream@0.0.7: 731 | version "0.0.7" 732 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 733 | 734 | natural-compare@^1.4.0: 735 | version "1.4.0" 736 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 737 | 738 | node-fetch@^1.0.1: 739 | version "1.7.3" 740 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 741 | dependencies: 742 | encoding "^0.1.11" 743 | is-stream "^1.0.1" 744 | 745 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 746 | version "4.1.1" 747 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 748 | 749 | object-keys@^1.0.8: 750 | version "1.0.11" 751 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 752 | 753 | once@^1.3.0: 754 | version "1.4.0" 755 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 756 | dependencies: 757 | wrappy "1" 758 | 759 | onetime@^2.0.0: 760 | version "2.0.1" 761 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 762 | dependencies: 763 | mimic-fn "^1.0.0" 764 | 765 | optionator@^0.8.2: 766 | version "0.8.2" 767 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 768 | dependencies: 769 | deep-is "~0.1.3" 770 | fast-levenshtein "~2.0.4" 771 | levn "~0.3.0" 772 | prelude-ls "~1.1.2" 773 | type-check "~0.3.2" 774 | wordwrap "~1.0.0" 775 | 776 | os-tmpdir@~1.0.2: 777 | version "1.0.2" 778 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 779 | 780 | path-is-absolute@^1.0.0: 781 | version "1.0.1" 782 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 783 | 784 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 785 | version "1.0.2" 786 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 787 | 788 | pify@^2.0.0: 789 | version "2.3.0" 790 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 791 | 792 | pinkie-promise@^2.0.0: 793 | version "2.0.1" 794 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 795 | dependencies: 796 | pinkie "^2.0.0" 797 | 798 | pinkie@^2.0.0: 799 | version "2.0.4" 800 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 801 | 802 | pluralize@^7.0.0: 803 | version "7.0.0" 804 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 805 | 806 | prelude-ls@~1.1.2: 807 | version "1.1.2" 808 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 809 | 810 | process-nextick-args@~1.0.6: 811 | version "1.0.7" 812 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 813 | 814 | progress@^2.0.0: 815 | version "2.0.0" 816 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 817 | 818 | promise@^7.1.1: 819 | version "7.3.1" 820 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 821 | dependencies: 822 | asap "~2.0.3" 823 | 824 | prop-types@^15.6.0: 825 | version "15.6.0" 826 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" 827 | dependencies: 828 | fbjs "^0.8.16" 829 | loose-envify "^1.3.1" 830 | object-assign "^4.1.1" 831 | 832 | pseudomap@^1.0.2: 833 | version "1.0.2" 834 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 835 | 836 | readable-stream@^2.2.2: 837 | version "2.3.3" 838 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 839 | dependencies: 840 | core-util-is "~1.0.0" 841 | inherits "~2.0.3" 842 | isarray "~1.0.0" 843 | process-nextick-args "~1.0.6" 844 | safe-buffer "~5.1.1" 845 | string_decoder "~1.0.3" 846 | util-deprecate "~1.0.1" 847 | 848 | require-uncached@^1.0.3: 849 | version "1.0.3" 850 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 851 | dependencies: 852 | caller-path "^0.1.0" 853 | resolve-from "^1.0.0" 854 | 855 | resolve-from@^1.0.0: 856 | version "1.0.1" 857 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 858 | 859 | restore-cursor@^2.0.0: 860 | version "2.0.0" 861 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 862 | dependencies: 863 | onetime "^2.0.0" 864 | signal-exit "^3.0.2" 865 | 866 | rimraf@^2.2.8: 867 | version "2.6.2" 868 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 869 | dependencies: 870 | glob "^7.0.5" 871 | 872 | run-async@^2.2.0: 873 | version "2.3.0" 874 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 875 | dependencies: 876 | is-promise "^2.1.0" 877 | 878 | rx-lite-aggregates@^4.0.8: 879 | version "4.0.8" 880 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 881 | dependencies: 882 | rx-lite "*" 883 | 884 | rx-lite@*, rx-lite@^4.0.8: 885 | version "4.0.8" 886 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 887 | 888 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 889 | version "5.1.1" 890 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 891 | 892 | semver@^5.3.0: 893 | version "5.4.1" 894 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 895 | 896 | setimmediate@^1.0.5: 897 | version "1.0.5" 898 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 899 | 900 | shebang-command@^1.2.0: 901 | version "1.2.0" 902 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 903 | dependencies: 904 | shebang-regex "^1.0.0" 905 | 906 | shebang-regex@^1.0.0: 907 | version "1.0.0" 908 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 909 | 910 | signal-exit@^3.0.2: 911 | version "3.0.2" 912 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 913 | 914 | slice-ansi@1.0.0: 915 | version "1.0.0" 916 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 917 | dependencies: 918 | is-fullwidth-code-point "^2.0.0" 919 | 920 | sprintf-js@~1.0.2: 921 | version "1.0.3" 922 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 923 | 924 | string-width@^2.1.0, string-width@^2.1.1: 925 | version "2.1.1" 926 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 927 | dependencies: 928 | is-fullwidth-code-point "^2.0.0" 929 | strip-ansi "^4.0.0" 930 | 931 | string_decoder@~1.0.3: 932 | version "1.0.3" 933 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 934 | dependencies: 935 | safe-buffer "~5.1.0" 936 | 937 | strip-ansi@^3.0.0: 938 | version "3.0.1" 939 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 940 | dependencies: 941 | ansi-regex "^2.0.0" 942 | 943 | strip-ansi@^4.0.0: 944 | version "4.0.0" 945 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 946 | dependencies: 947 | ansi-regex "^3.0.0" 948 | 949 | strip-json-comments@~2.0.1: 950 | version "2.0.1" 951 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 952 | 953 | supports-color@^2.0.0: 954 | version "2.0.0" 955 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 956 | 957 | supports-color@^4.0.0: 958 | version "4.5.0" 959 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 960 | dependencies: 961 | has-flag "^2.0.0" 962 | 963 | table@4.0.2: 964 | version "4.0.2" 965 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 966 | dependencies: 967 | ajv "^5.2.3" 968 | ajv-keywords "^2.1.0" 969 | chalk "^2.1.0" 970 | lodash "^4.17.4" 971 | slice-ansi "1.0.0" 972 | string-width "^2.1.1" 973 | 974 | text-table@~0.2.0: 975 | version "0.2.0" 976 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 977 | 978 | through@^2.3.6: 979 | version "2.3.8" 980 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 981 | 982 | tmp@^0.0.33: 983 | version "0.0.33" 984 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 985 | dependencies: 986 | os-tmpdir "~1.0.2" 987 | 988 | to-fast-properties@^2.0.0: 989 | version "2.0.0" 990 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 991 | 992 | tryit@^1.0.1: 993 | version "1.0.3" 994 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 995 | 996 | type-check@~0.3.2: 997 | version "0.3.2" 998 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 999 | dependencies: 1000 | prelude-ls "~1.1.2" 1001 | 1002 | typedarray@^0.0.6: 1003 | version "0.0.6" 1004 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1005 | 1006 | ua-parser-js@^0.7.9: 1007 | version "0.7.17" 1008 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" 1009 | 1010 | util-deprecate@~1.0.1: 1011 | version "1.0.2" 1012 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1013 | 1014 | whatwg-fetch@>=0.10.0: 1015 | version "2.0.3" 1016 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 1017 | 1018 | which@^1.2.9: 1019 | version "1.3.0" 1020 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1021 | dependencies: 1022 | isexe "^2.0.0" 1023 | 1024 | wordwrap@~1.0.0: 1025 | version "1.0.0" 1026 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1027 | 1028 | wrappy@1: 1029 | version "1.0.2" 1030 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1031 | 1032 | write@^0.2.1: 1033 | version "0.2.1" 1034 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1035 | dependencies: 1036 | mkdirp "^0.5.1" 1037 | 1038 | yallist@^2.1.2: 1039 | version "2.1.2" 1040 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1041 | --------------------------------------------------------------------------------