Thibault Malbranche пре 5 година
родитељ
комит
9bc43ae551
14 измењених фајлова са 949 додато и 279 уклоњено
  1. 75
    0
      .eslintrc.js
  2. 3
    1
      .gitignore
  3. 10
    0
      .prettierrc.js
  4. 9
    0
      .vscode/settings.json
  5. 7
    0
      index.d.ts
  6. 2
    1
      index.js
  7. 15
    5
      package.json
  8. 113
    100
      src/WebView.android.tsx
  9. 156
    138
      src/WebView.ios.tsx
  10. 1
    3
      src/WebViewShared.ts
  11. 0
    0
      src/WebViewTypes.flow.js
  12. 14
    9
      src/WebViewTypes.ts
  13. 4
    0
      tsconfig.json
  14. 540
    22
      yarn.lock

+ 75
- 0
.eslintrc.js Прегледај датотеку

@@ -0,0 +1,75 @@
1
+module.exports = {
2
+  // Airbnb is the base, prettier is here so that eslint doesn't conflict with prettier
3
+  extends: ['airbnb', 'prettier', 'prettier/react'],
4
+  parser: '@typescript-eslint/parser',
5
+  plugins: ['react', 'react-native', 'import', '@typescript-eslint'],
6
+  rules: {
7
+    'no-console': 'off',
8
+    // Lines will be broken before binary operators
9
+    'operator-linebreak': ['error', 'before'],
10
+    // Allow imports from dev and peer dependencies
11
+    'import/no-extraneous-dependencies': [
12
+      'error',
13
+      { devDependencies: true, peerDependencies: true },
14
+    ],
15
+    'react/jsx-filename-extension': ['error', { extensions: ['.tsx'] }],
16
+    // This rule doesn't play nice with Prettier
17
+    'react/jsx-one-expression-per-line': 'off',
18
+    // This rule doesn't play nice with Prettier
19
+    'react/jsx-wrap-multilines': 'off',
20
+    // Remove this rule because we only destructure props, but never state
21
+    'react/destructuring-assignment': 'off',
22
+    'react/prop-types': 'off',
23
+    '@typescript-eslint/adjacent-overload-signatures': 'error',
24
+    '@typescript-eslint/array-type': ['error', 'array'],
25
+    '@typescript-eslint/generic-type-naming': ['error', '^[a-zA-Z]+$'],
26
+    '@typescript-eslint/no-angle-bracket-type-assertion': 'error',
27
+    '@typescript-eslint/no-array-constructor': 'error',
28
+    '@typescript-eslint/no-empty-interface': 'error',
29
+    '@typescript-eslint/no-explicit-any': 'error',
30
+    '@typescript-eslint/no-extraneous-class': 'error',
31
+    '@typescript-eslint/no-inferrable-types': 'error',
32
+    '@typescript-eslint/no-misused-new': 'error',
33
+    '@typescript-eslint/no-namespace': 'error',
34
+    '@typescript-eslint/no-non-null-assertion': 'error',
35
+    '@typescript-eslint/no-object-literal-type-assertion': 'error',
36
+    '@typescript-eslint/no-parameter-properties': 'error',
37
+    '@typescript-eslint/no-this-alias': 'error',
38
+    '@typescript-eslint/no-triple-slash-reference': 'error',
39
+    '@typescript-eslint/no-type-alias': [
40
+      'error',
41
+      {
42
+        allowAliases: 'always',
43
+        allowCallbacks: 'always',
44
+        allowMappedTypes: 'always',
45
+      },
46
+    ],
47
+    '@typescript-eslint/no-unused-vars': [
48
+      'error',
49
+      { ignoreRestSiblings: true },
50
+    ],
51
+    '@typescript-eslint/prefer-interface': 'error',
52
+    '@typescript-eslint/prefer-namespace-keyword': 'error',
53
+    '@typescript-eslint/type-annotation-spacing': 'error',
54
+  },
55
+  settings: {
56
+    'import/resolver': {
57
+      node: {
58
+        extensions: [
59
+          '.js',
60
+          '.android.js',
61
+          '.ios.js',
62
+          '.jsx',
63
+          '.android.jsx',
64
+          '.ios.jsx',
65
+          '.tsx',
66
+          '.ts',
67
+          '.android.tsx',
68
+          '.android.ts',
69
+          '.ios.tsx',
70
+          '.ios.ts',
71
+        ],
72
+      },
73
+    },
74
+  },
75
+};

+ 3
- 1
.gitignore Прегледај датотеку

@@ -51,4 +51,6 @@ bundles/
51 51
 
52 52
 android/gradle
53 53
 android/gradlew
54
-android/gradlew.bat
54
+android/gradlew.bat
55
+
56
+lib/

+ 10
- 0
.prettierrc.js Прегледај датотеку

@@ -0,0 +1,10 @@
1
+// https://prettier.io/docs/en/options.html
2
+
3
+module.exports = {
4
+  // Enables semicolons at the end of statements
5
+  semi: true,
6
+  // Formats strings with single quotes ('') instead of quotes ("")
7
+  singleQuote: true,
8
+  // Adds a trailing comma at the end of all lists (including function arguments)
9
+  trailingComma: 'all',
10
+};

+ 9
- 0
.vscode/settings.json Прегледај датотеку

@@ -0,0 +1,9 @@
1
+{
2
+  "typescript.tsdk": "node_modules/typescript/lib",
3
+  "eslint.validate": [
4
+    "javascript",
5
+    "javascriptreact",
6
+    "typescript",
7
+    "typescriptreact"
8
+  ]
9
+}

+ 7
- 0
index.d.ts Прегледај датотеку

@@ -0,0 +1,7 @@
1
+import WebViewIOS from './lib/WebView.ios';
2
+import WebViewAndroid from './lib/WebView.android';
3
+
4
+declare const WebView: WebViewIOS | WebViewAndroid;
5
+
6
+export { WebView };
7
+export default WebView;

+ 2
- 1
index.js Прегледај датотеку

@@ -1,3 +1,4 @@
1
-import WebView from './js/WebView';
1
+import WebView from './lib/WebView';
2 2
 
3 3
 export { WebView };
4
+export default WebView;

+ 15
- 5
package.json Прегледај датотеку

@@ -11,13 +11,13 @@
11 11
   "version": "5.3.1",
12 12
   "homepage": "https://github.com/react-native-community/react-native-webview#readme",
13 13
   "scripts": {
14
-    "test:js": "jest",
15
-    "test:ios:flow": "flow check",
16
-    "test:android:flow": "flow check --flowconfig-name .flowconfig.android",
14
+    "prepare": "yarn tsc",
15
+    "test:js": "yarn jest",
16
+    "test:ts": "yarn tsc --noEmit && yarn eslint ./src --ext .ts,.tsx",
17 17
     "ci:publish": "yarn semantic-release",
18
-    "ci:test": "yarn ci:test:flow && yarn ci:test:js",
19
-    "ci:test:flow": "yarn test:ios:flow && yarn test:android:flow",
18
+    "ci:test": "yarn ci:test:ts && yarn ci:test:js",
20 19
     "ci:test:js": "yarn test:js",
20
+    "ci:test:ts": "yarn test:ts",
21 21
     "semantic-release": "semantic-release"
22 22
   },
23 23
   "peerDependencies": {
@@ -35,8 +35,18 @@
35 35
     "@types/invariant": "^2.2.29",
36 36
     "@types/react": "^16.6.3",
37 37
     "@types/react-native": "0.57.40",
38
+    "@typescript-eslint/eslint-plugin": "1.4.2",
39
+    "@typescript-eslint/parser": "1.4.2",
40
+    "babel-eslint": "10.0.1",
38 41
     "babel-jest": "^24.0.0",
39 42
     "flow-bin": "^0.80.0",
43
+    "eslint": "5.15.1",
44
+    "eslint-config-airbnb": "17.1.0",
45
+    "eslint-config-prettier": "4.1.0",
46
+    "eslint-plugin-import": "2.16.0",
47
+    "eslint-plugin-jsx-a11y": "6.2.1",
48
+    "eslint-plugin-react": "7.12.4",
49
+    "eslint-plugin-react-native": "3.6.0",
40 50
     "jest": "^24.0.0",
41 51
     "metro-react-native-babel-preset": "^0.51.1",
42 52
     "react": "16.6.3",

+ 113
- 100
src/WebView.android.tsx Прегледај датотеку

@@ -34,7 +34,10 @@ import styles from './WebView.styles';
34 34
 
35 35
 const UIManager = NotTypedUIManager as CustomUIManager;
36 36
 
37
-const resolveAssetSource = Image.resolveAssetSource;
37
+const RNCWebView = requireNativeComponent(
38
+  'RNCWebView',
39
+) as typeof NativeWebViewAndroid;
40
+const { resolveAssetSource } = Image;
38 41
 
39 42
 const defaultRenderLoading = () => (
40 43
   <View style={styles.loadingView}>
@@ -70,93 +73,6 @@ class WebView extends React.Component<AndroidWebViewProps, State> {
70 73
 
71 74
   webViewRef = React.createRef<NativeWebViewAndroid>();
72 75
 
73
-  render() {
74
-    const {
75
-      onMessage,
76
-      onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
77
-      originWhitelist,
78
-      renderError,
79
-      renderLoading,
80
-      source,
81
-      style,
82
-      nativeConfig = {},
83
-      ...otherProps
84
-    } = this.props;
85
-    let otherView = null;
86
-
87
-    if (this.state.viewState === 'LOADING') {
88
-      otherView = (renderLoading || defaultRenderLoading)();
89
-    } else if (this.state.viewState === 'ERROR') {
90
-      const errorEvent = this.state.lastErrorEvent;
91
-      invariant(errorEvent != null, 'lastErrorEvent expected to be non-null');
92
-      otherView =
93
-        renderError &&
94
-        renderError(errorEvent.domain, errorEvent.code, errorEvent.description);
95
-    } else if (this.state.viewState !== 'IDLE') {
96
-      console.error(
97
-        'RNCWebView invalid state encountered: ' + this.state.viewState,
98
-      );
99
-    }
100
-
101
-    const webViewStyles = [styles.container, style];
102
-    if (
103
-      this.state.viewState === 'LOADING' ||
104
-      this.state.viewState === 'ERROR'
105
-    ) {
106
-      // if we're in either LOADING or ERROR states, don't show the webView
107
-      webViewStyles.push(styles.hidden);
108
-    }
109
-
110
-    if (
111
-      (source as WebViewUriSource).method === 'POST' &&
112
-      (source as WebViewUriSource).headers
113
-    ) {
114
-      console.warn(
115
-        'WebView: `source.headers` is not supported when using POST.',
116
-      );
117
-    } else if (
118
-      (source as WebViewUriSource).method === 'GET' &&
119
-      (source as WebViewUriSource).body
120
-    ) {
121
-      console.warn('WebView: `source.body` is not supported when using GET.');
122
-    }
123
-
124
-    let NativeWebView =
125
-      (nativeConfig.component as typeof NativeWebViewAndroid) || RNCWebView;
126
-
127
-    const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
128
-      this.onShouldStartLoadWithRequestCallback,
129
-      originWhitelist,
130
-      onShouldStartLoadWithRequestProp,
131
-    );
132
-
133
-    const webView = (
134
-      <NativeWebView
135
-        {...otherProps}
136
-        key="webViewKey"
137
-        messagingEnabled={typeof onMessage === 'function'}
138
-        onLoadingError={this.onLoadingError}
139
-        onLoadingFinish={this.onLoadingFinish}
140
-        onLoadingProgress={this.onLoadingProgress}
141
-        onLoadingStart={this.onLoadingStart}
142
-        onMessage={this.onMessage}
143
-        onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
144
-        ref={this.webViewRef}
145
-        // TODO: find a better way to type this.
146
-        source={resolveAssetSource(source as ImageSourcePropType)}
147
-        style={webViewStyles}
148
-        {...nativeConfig.props}
149
-      />
150
-    );
151
-
152
-    return (
153
-      <View style={styles.container}>
154
-        {webView}
155
-        {otherView}
156
-      </View>
157
-    );
158
-  }
159
-
160 76
   getCommands = () => getViewManagerConfig('RNCWebView').Commands;
161 77
 
162 78
   goForward = () => {
@@ -236,16 +152,22 @@ class WebView extends React.Component<AndroidWebViewProps, State> {
236 152
   };
237 153
 
238 154
   onLoadingStart = (event: WebViewNavigationEvent) => {
239
-    const onLoadStart = this.props.onLoadStart;
240
-    onLoadStart && onLoadStart(event);
155
+    const { onLoadStart } = this.props;
156
+    if (onLoadStart) {
157
+      onLoadStart(event);
158
+    }
241 159
     this.updateNavigationState(event);
242 160
   };
243 161
 
244 162
   onLoadingError = (event: WebViewErrorEvent) => {
245 163
     event.persist(); // persist this event because we need to store it
246 164
     const { onError, onLoadEnd } = this.props;
247
-    onError && onError(event);
248
-    onLoadEnd && onLoadEnd(event);
165
+    if (onError) {
166
+      onError(event);
167
+    }
168
+    if (onLoadEnd) {
169
+      onLoadEnd(event);
170
+    }
249 171
     console.warn('Encountered an error loading page', event.nativeEvent);
250 172
 
251 173
     this.setState({
@@ -256,8 +178,12 @@ class WebView extends React.Component<AndroidWebViewProps, State> {
256 178
 
257 179
   onLoadingFinish = (event: WebViewNavigationEvent) => {
258 180
     const { onLoad, onLoadEnd } = this.props;
259
-    onLoad && onLoad(event);
260
-    onLoadEnd && onLoadEnd(event);
181
+    if (onLoad) {
182
+      onLoad(event);
183
+    }
184
+    if (onLoadEnd) {
185
+      onLoadEnd(event);
186
+    }
261 187
     this.setState({
262 188
       viewState: 'IDLE',
263 189
     });
@@ -266,12 +192,16 @@ class WebView extends React.Component<AndroidWebViewProps, State> {
266 192
 
267 193
   onMessage = (event: WebViewMessageEvent) => {
268 194
     const { onMessage } = this.props;
269
-    onMessage && onMessage(event);
195
+    if (onMessage) {
196
+      onMessage(event);
197
+    }
270 198
   };
271 199
 
272 200
   onLoadingProgress = (event: WebViewProgressEvent) => {
273 201
     const { onLoadProgress } = this.props;
274
-    onLoadProgress && onLoadProgress(event);
202
+    if (onLoadProgress) {
203
+      onLoadProgress(event);
204
+    }
275 205
   };
276 206
 
277 207
   onShouldStartLoadWithRequestCallback = (
@@ -286,10 +216,93 @@ class WebView extends React.Component<AndroidWebViewProps, State> {
286 216
       );
287 217
     }
288 218
   };
289
-}
290 219
 
291
-const RNCWebView = requireNativeComponent(
292
-  'RNCWebView',
293
-) as typeof NativeWebViewAndroid;
220
+  render() {
221
+    const {
222
+      onMessage,
223
+      onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
224
+      originWhitelist,
225
+      renderError,
226
+      renderLoading,
227
+      source,
228
+      style,
229
+      nativeConfig = {},
230
+      ...otherProps
231
+    } = this.props;
232
+    let otherView = null;
233
+
234
+    if (this.state.viewState === 'LOADING') {
235
+      otherView = (renderLoading || defaultRenderLoading)();
236
+    } else if (this.state.viewState === 'ERROR') {
237
+      const errorEvent = this.state.lastErrorEvent;
238
+      invariant(errorEvent != null, 'lastErrorEvent expected to be non-null');
239
+      otherView
240
+        = renderError
241
+        && renderError(errorEvent.domain, errorEvent.code, errorEvent.description);
242
+    } else if (this.state.viewState !== 'IDLE') {
243
+      console.error(
244
+        `RNCWebView invalid state encountered: ${this.state.viewState}`,
245
+      );
246
+    }
247
+
248
+    const webViewStyles = [styles.container, style];
249
+    if (
250
+      this.state.viewState === 'LOADING'
251
+      || this.state.viewState === 'ERROR'
252
+    ) {
253
+      // if we're in either LOADING or ERROR states, don't show the webView
254
+      webViewStyles.push(styles.hidden);
255
+    }
256
+
257
+    if (
258
+      (source as WebViewUriSource).method === 'POST'
259
+      && (source as WebViewUriSource).headers
260
+    ) {
261
+      console.warn(
262
+        'WebView: `source.headers` is not supported when using POST.',
263
+      );
264
+    } else if (
265
+      (source as WebViewUriSource).method === 'GET'
266
+      && (source as WebViewUriSource).body
267
+    ) {
268
+      console.warn('WebView: `source.body` is not supported when using GET.');
269
+    }
270
+
271
+    const NativeWebView
272
+      = (nativeConfig.component as typeof NativeWebViewAndroid) || RNCWebView;
273
+
274
+    const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
275
+      this.onShouldStartLoadWithRequestCallback,
276
+      originWhitelist,
277
+      onShouldStartLoadWithRequestProp,
278
+    );
279
+
280
+    const webView = (
281
+      <NativeWebView
282
+        {...otherProps}
283
+        key="webViewKey"
284
+        messagingEnabled={typeof onMessage === 'function'}
285
+        onLoadingError={this.onLoadingError}
286
+        onLoadingFinish={this.onLoadingFinish}
287
+        onLoadingProgress={this.onLoadingProgress}
288
+        onLoadingStart={this.onLoadingStart}
289
+        onMessage={this.onMessage}
290
+        onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
291
+        ref={this.webViewRef}
292
+        // TODO: find a better way to type this.
293
+        source={resolveAssetSource(source as ImageSourcePropType)}
294
+        style={webViewStyles}
295
+        {...nativeConfig.props}
296
+      />
297
+    );
298
+
299
+    return (
300
+      <View style={styles.container}>
301
+        {webView}
302
+        {otherView}
303
+      </View>
304
+    );
305
+  }
306
+}
294 307
 
295 308
 module.exports = WebView;

+ 156
- 138
src/WebView.ios.tsx Прегледај датотеку

@@ -36,29 +36,38 @@ import {
36 36
   ViewManager,
37 37
   State,
38 38
   CustomUIManager,
39
+  WebViewNativeConfig,
39 40
 } from './WebViewTypes';
40 41
 
41 42
 import styles from './WebView.styles';
42 43
 
43 44
 const UIManager = NotTypedUIManager as CustomUIManager;
44 45
 
45
-const resolveAssetSource = Image.resolveAssetSource;
46
+const { resolveAssetSource } = Image;
46 47
 let didWarnAboutUIWebViewUsage = false;
47 48
 // Imported from https://github.com/facebook/react-native/blob/master/Libraries/Components/ScrollView/processDecelerationRate.js
48 49
 const processDecelerationRate = (
49 50
   decelerationRate: DecelerationRateConstant | number | undefined,
50 51
 ) => {
51
-  if (decelerationRate === 'normal') {
52
-    decelerationRate = 0.998;
53
-  } else if (decelerationRate === 'fast') {
54
-    decelerationRate = 0.99;
52
+  let newDecelerationRate = decelerationRate;
53
+  if (newDecelerationRate === 'normal') {
54
+    newDecelerationRate = 0.998;
55
+  } else if (newDecelerationRate === 'fast') {
56
+    newDecelerationRate = 0.99;
55 57
   }
56
-  return decelerationRate;
58
+  return newDecelerationRate;
57 59
 };
58 60
 
59 61
 const RNCUIWebViewManager = NativeModules.RNCUIWebViewManager as ViewManager;
60 62
 const RNCWKWebViewManager = NativeModules.RNCWKWebViewManager as ViewManager;
61 63
 
64
+const RNCUIWebView: typeof NativeWebViewIOS = requireNativeComponent(
65
+  'RNCUIWebView',
66
+);
67
+const RNCWKWebView: typeof NativeWebViewIOS = requireNativeComponent(
68
+  'RNCWKWebView',
69
+);
70
+
62 71
 const defaultRenderLoading = () => (
63 72
   <View style={styles.loadingView}>
64 73
     <ActivityIndicator />
@@ -71,9 +80,9 @@ const defaultRenderError = (
71 80
 ) => (
72 81
   <View style={styles.errorContainer}>
73 82
     <Text style={styles.errorTextTitle}>Error loading page</Text>
74
-    <Text style={styles.errorText}>{'Domain: ' + errorDomain}</Text>
75
-    <Text style={styles.errorText}>{'Error Code: ' + errorCode}</Text>
76
-    <Text style={styles.errorText}>{'Description: ' + errorDesc}</Text>
83
+    <Text style={styles.errorText}>{`Domain: ${errorDomain}`}</Text>
84
+    <Text style={styles.errorText}>{`Error Code: ${errorCode}`}</Text>
85
+    <Text style={styles.errorText}>{`Description: ${errorDesc}`}</Text>
77 86
   </View>
78 87
 );
79 88
 
@@ -97,25 +106,26 @@ class WebView extends React.Component<IOSWebViewProps, State> {
97 106
 
98 107
   webViewRef = React.createRef<NativeWebViewIOS>();
99 108
 
109
+  // eslint-disable-next-line camelcase
100 110
   UNSAFE_componentWillMount() {
101 111
     if (!this.props.useWebKit && !didWarnAboutUIWebViewUsage) {
102 112
       didWarnAboutUIWebViewUsage = true;
103 113
       console.warn(
104
-        'UIWebView is deprecated and will be removed soon, please use WKWebView (do not override useWebkit={true} prop),' +
105
-          ' more infos here: https://github.com/react-native-community/react-native-webview/issues/312',
114
+        'UIWebView is deprecated and will be removed soon, please use WKWebView (do not override useWebkit={true} prop),'
115
+          + ' more infos here: https://github.com/react-native-community/react-native-webview/issues/312',
106 116
       );
107 117
     }
108 118
     if (
109
-      this.props.useWebKit === true &&
110
-      this.props.scalesPageToFit !== undefined
119
+      this.props.useWebKit === true
120
+      && this.props.scalesPageToFit !== undefined
111 121
     ) {
112 122
       console.warn(
113 123
         'The scalesPageToFit property is not supported when useWebKit = true',
114 124
       );
115 125
     }
116 126
     if (
117
-      !this.props.useWebKit &&
118
-      this.props.allowsBackForwardNavigationGestures
127
+      !this.props.useWebKit
128
+      && this.props.allowsBackForwardNavigationGestures
119 129
     ) {
120 130
       console.warn(
121 131
         'The allowsBackForwardNavigationGestures property is not supported when useWebKit = false',
@@ -129,94 +139,8 @@ class WebView extends React.Component<IOSWebViewProps, State> {
129 139
     }
130 140
   }
131 141
 
132
-  render() {
133
-    const {
134
-      decelerationRate: decelerationRateProp,
135
-      nativeConfig = {},
136
-      onMessage,
137
-      onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
138
-      originWhitelist,
139
-      renderError,
140
-      renderLoading,
141
-      scalesPageToFit = this.props.useWebKit ? undefined : true,
142
-      style,
143
-      useWebKit,
144
-      ...otherProps
145
-    } = this.props;
146
-
147
-    let otherView = null;
148
-
149
-    if (this.state.viewState === 'LOADING') {
150
-      otherView = (renderLoading || defaultRenderLoading)();
151
-    } else if (this.state.viewState === 'ERROR') {
152
-      const errorEvent = this.state.lastErrorEvent;
153
-      invariant(errorEvent != null, 'lastErrorEvent expected to be non-null');
154
-      otherView = (renderError || defaultRenderError)(
155
-        errorEvent.domain,
156
-        errorEvent.code,
157
-        errorEvent.description,
158
-      );
159
-    } else if (this.state.viewState !== 'IDLE') {
160
-      console.error(
161
-        'RNCWebView invalid state encountered: ' + this.state.viewState,
162
-      );
163
-    }
164
-
165
-    const webViewStyles = [styles.container, styles.webView, style];
166
-    if (
167
-      this.state.viewState === 'LOADING' ||
168
-      this.state.viewState === 'ERROR'
169
-    ) {
170
-      // if we're in either LOADING or ERROR states, don't show the webView
171
-      webViewStyles.push(styles.hidden);
172
-    }
173
-
174
-    const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
175
-      this.onShouldStartLoadWithRequestCallback,
176
-      originWhitelist,
177
-      onShouldStartLoadWithRequestProp,
178
-    );
179
-
180
-    const decelerationRate = processDecelerationRate(decelerationRateProp);
181
-
182
-    let NativeWebView = nativeConfig.component as typeof NativeWebViewIOS;
183
-
184
-    if (useWebKit) {
185
-      NativeWebView = NativeWebViewIOS || RNCWKWebView;
186
-    } else {
187
-      NativeWebView = NativeWebViewIOS || RNCUIWebView;
188
-    }
189
-
190
-    const webView = (
191
-      <NativeWebView
192
-        {...otherProps}
193
-        decelerationRate={decelerationRate}
194
-        key="webViewKey"
195
-        messagingEnabled={typeof onMessage === 'function'}
196
-        onLoadingError={this._onLoadingError}
197
-        onLoadingFinish={this._onLoadingFinish}
198
-        onLoadingProgress={this._onLoadingProgress}
199
-        onLoadingStart={this._onLoadingStart}
200
-        onMessage={this._onMessage}
201
-        onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
202
-        ref={this.webViewRef}
203
-        scalesPageToFit={scalesPageToFit}
204
-        // TODO: find a better way to type this.
205
-        source={resolveAssetSource(this.props.source as ImageSourcePropType)}
206
-        style={webViewStyles}
207
-        {...nativeConfig.props}
208
-      />
209
-    );
210
-
211
-    return (
212
-      <View style={styles.container}>
213
-        {webView}
214
-        {otherView}
215
-      </View>
216
-    );
217
-  }
218
-
219
-  _getCommands = () =>
142
+  // eslint-disable-next-line react/sort-comp
143
+  getCommands = () =>
220 144
     !this.props.useWebKit
221 145
       ? getViewManagerConfig('RNCUIWebView').Commands
222 146
       : getViewManagerConfig('RNCWKWebView').Commands;
@@ -227,7 +151,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
227 151
   goForward = () => {
228 152
     UIManager.dispatchViewManagerCommand(
229 153
       this.getWebViewHandle(),
230
-      this._getCommands().goForward,
154
+      this.getCommands().goForward,
231 155
       null,
232 156
     );
233 157
   };
@@ -238,7 +162,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
238 162
   goBack = () => {
239 163
     UIManager.dispatchViewManagerCommand(
240 164
       this.getWebViewHandle(),
241
-      this._getCommands().goBack,
165
+      this.getCommands().goBack,
242 166
       null,
243 167
     );
244 168
   };
@@ -250,7 +174,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
250 174
     this.setState({ viewState: 'LOADING' });
251 175
     UIManager.dispatchViewManagerCommand(
252 176
       this.getWebViewHandle(),
253
-      this._getCommands().reload,
177
+      this.getCommands().reload,
254 178
       null,
255 179
     );
256 180
   };
@@ -261,7 +185,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
261 185
   stopLoading = () => {
262 186
     UIManager.dispatchViewManagerCommand(
263 187
       this.getWebViewHandle(),
264
-      this._getCommands().stopLoading,
188
+      this.getCommands().stopLoading,
265 189
       null,
266 190
     );
267 191
   };
@@ -279,7 +203,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
279 203
   postMessage = (data: string) => {
280 204
     UIManager.dispatchViewManagerCommand(
281 205
       this.getWebViewHandle(),
282
-      this._getCommands().postMessage,
206
+      this.getCommands().postMessage,
283 207
       [String(data)],
284 208
     );
285 209
   };
@@ -293,7 +217,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
293 217
   injectJavaScript = (data: string) => {
294 218
     UIManager.dispatchViewManagerCommand(
295 219
       this.getWebViewHandle(),
296
-      this._getCommands().injectJavaScript,
220
+      this.getCommands().injectJavaScript,
297 221
       [data],
298 222
     );
299 223
   };
@@ -302,7 +226,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
302 226
    * We return an event with a bunch of fields including:
303 227
    *  url, title, loading, canGoBack, canGoForward
304 228
    */
305
-  _updateNavigationState = (event: WebViewNavigationEvent) => {
229
+  updateNavigationState = (event: WebViewNavigationEvent) => {
306 230
     if (this.props.onNavigationStateChange) {
307 231
       this.props.onNavigationStateChange(event.nativeEvent);
308 232
     }
@@ -317,17 +241,23 @@ class WebView extends React.Component<IOSWebViewProps, State> {
317 241
     return nodeHandle as number;
318 242
   };
319 243
 
320
-  _onLoadingStart = (event: WebViewNavigationEvent) => {
321
-    const onLoadStart = this.props.onLoadStart;
322
-    onLoadStart && onLoadStart(event);
323
-    this._updateNavigationState(event);
244
+  onLoadingStart = (event: WebViewNavigationEvent) => {
245
+    const { onLoadStart } = this.props;
246
+    if (onLoadStart) {
247
+      onLoadStart(event);
248
+    }
249
+    this.updateNavigationState(event);
324 250
   };
325 251
 
326
-  _onLoadingError = (event: WebViewErrorEvent) => {
252
+  onLoadingError = (event: WebViewErrorEvent) => {
327 253
     event.persist(); // persist this event because we need to store it
328 254
     const { onError, onLoadEnd } = this.props;
329
-    onError && onError(event);
330
-    onLoadEnd && onLoadEnd(event);
255
+    if (onLoadEnd) {
256
+      onLoadEnd(event);
257
+    }
258
+    if (onError) {
259
+      onError(event);
260
+    }
331 261
     console.warn('Encountered an error loading page', event.nativeEvent);
332 262
 
333 263
     this.setState({
@@ -336,24 +266,32 @@ class WebView extends React.Component<IOSWebViewProps, State> {
336 266
     });
337 267
   };
338 268
 
339
-  _onLoadingFinish = (event: WebViewNavigationEvent) => {
269
+  onLoadingFinish = (event: WebViewNavigationEvent) => {
340 270
     const { onLoad, onLoadEnd } = this.props;
341
-    onLoad && onLoad(event);
342
-    onLoadEnd && onLoadEnd(event);
271
+    if (onLoad) {
272
+      onLoad(event);
273
+    }
274
+    if (onLoadEnd) {
275
+      onLoadEnd(event);
276
+    }
343 277
     this.setState({
344 278
       viewState: 'IDLE',
345 279
     });
346
-    this._updateNavigationState(event);
280
+    this.updateNavigationState(event);
347 281
   };
348 282
 
349
-  _onMessage = (event: WebViewMessageEvent) => {
283
+  onMessage = (event: WebViewMessageEvent) => {
350 284
     const { onMessage } = this.props;
351
-    onMessage && onMessage(event);
285
+    if (onMessage) {
286
+      onMessage(event);
287
+    }
352 288
   };
353 289
 
354
-  _onLoadingProgress = (event: WebViewProgressEvent) => {
290
+  onLoadingProgress = (event: WebViewProgressEvent) => {
355 291
     const { onLoadProgress } = this.props;
356
-    onLoadProgress && onLoadProgress(event);
292
+    if (onLoadProgress) {
293
+      onLoadProgress(event);
294
+    }
357 295
   };
358 296
 
359 297
   onShouldStartLoadWithRequestCallback = (
@@ -361,7 +299,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
361 299
     _url: string,
362 300
     lockIdentifier: number,
363 301
   ) => {
364
-    let viewManager = (this.props.nativeConfig || {}).viewManager;
302
+    let { viewManager }: WebViewNativeConfig = this.props.nativeConfig || {};
365 303
 
366 304
     if (this.props.useWebKit) {
367 305
       viewManager = viewManager || RNCWKWebViewManager;
@@ -377,10 +315,10 @@ class WebView extends React.Component<IOSWebViewProps, State> {
377 315
       return;
378 316
     }
379 317
 
380
-    this._showRedboxOnPropChanges(prevProps, 'allowsInlineMediaPlayback');
381
-    this._showRedboxOnPropChanges(prevProps, 'incognito');
382
-    this._showRedboxOnPropChanges(prevProps, 'mediaPlaybackRequiresUserAction');
383
-    this._showRedboxOnPropChanges(prevProps, 'dataDetectorTypes');
318
+    this.showRedboxOnPropChanges(prevProps, 'allowsInlineMediaPlayback');
319
+    this.showRedboxOnPropChanges(prevProps, 'incognito');
320
+    this.showRedboxOnPropChanges(prevProps, 'mediaPlaybackRequiresUserAction');
321
+    this.showRedboxOnPropChanges(prevProps, 'dataDetectorTypes');
384 322
 
385 323
     if (this.props.scalesPageToFit !== undefined) {
386 324
       console.warn(
@@ -389,7 +327,7 @@ class WebView extends React.Component<IOSWebViewProps, State> {
389 327
     }
390 328
   }
391 329
 
392
-  _showRedboxOnPropChanges(
330
+  showRedboxOnPropChanges(
393 331
     prevProps: IOSWebViewProps,
394 332
     propName: keyof IOSWebViewProps,
395 333
   ) {
@@ -399,13 +337,93 @@ class WebView extends React.Component<IOSWebViewProps, State> {
399 337
       );
400 338
     }
401 339
   }
402
-}
403 340
 
404
-const RNCUIWebView: typeof NativeWebViewIOS = requireNativeComponent(
405
-  'RNCUIWebView',
406
-);
407
-const RNCWKWebView: typeof NativeWebViewIOS = requireNativeComponent(
408
-  'RNCWKWebView',
409
-);
341
+  render() {
342
+    const {
343
+      decelerationRate: decelerationRateProp,
344
+      nativeConfig = {},
345
+      onMessage,
346
+      onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
347
+      originWhitelist,
348
+      renderError,
349
+      renderLoading,
350
+      scalesPageToFit = this.props.useWebKit ? undefined : true,
351
+      style,
352
+      useWebKit,
353
+      ...otherProps
354
+    } = this.props;
355
+
356
+    let otherView = null;
357
+
358
+    if (this.state.viewState === 'LOADING') {
359
+      otherView = (renderLoading || defaultRenderLoading)();
360
+    } else if (this.state.viewState === 'ERROR') {
361
+      const errorEvent = this.state.lastErrorEvent;
362
+      invariant(errorEvent != null, 'lastErrorEvent expected to be non-null');
363
+      otherView = (renderError || defaultRenderError)(
364
+        errorEvent.domain,
365
+        errorEvent.code,
366
+        errorEvent.description,
367
+      );
368
+    } else if (this.state.viewState !== 'IDLE') {
369
+      console.error(
370
+        `RNCWebView invalid state encountered: ${this.state.viewState}`,
371
+      );
372
+    }
373
+
374
+    const webViewStyles = [styles.container, styles.webView, style];
375
+    if (
376
+      this.state.viewState === 'LOADING'
377
+      || this.state.viewState === 'ERROR'
378
+    ) {
379
+      // if we're in either LOADING or ERROR states, don't show the webView
380
+      webViewStyles.push(styles.hidden);
381
+    }
382
+
383
+    const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
384
+      this.onShouldStartLoadWithRequestCallback,
385
+      originWhitelist,
386
+      onShouldStartLoadWithRequestProp,
387
+    );
388
+
389
+    const decelerationRate = processDecelerationRate(decelerationRateProp);
390
+
391
+    let NativeWebView = nativeConfig.component as typeof NativeWebViewIOS;
392
+
393
+    if (useWebKit) {
394
+      NativeWebView = NativeWebViewIOS || RNCWKWebView;
395
+    } else {
396
+      NativeWebView = NativeWebViewIOS || RNCUIWebView;
397
+    }
398
+
399
+    const webView = (
400
+      <NativeWebView
401
+        {...otherProps}
402
+        decelerationRate={decelerationRate}
403
+        key="webViewKey"
404
+        messagingEnabled={typeof onMessage === 'function'}
405
+        onLoadingError={this.onLoadingError}
406
+        onLoadingFinish={this.onLoadingFinish}
407
+        onLoadingProgress={this.onLoadingProgress}
408
+        onLoadingStart={this.onLoadingStart}
409
+        onMessage={this.onMessage}
410
+        onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
411
+        ref={this.webViewRef}
412
+        scalesPageToFit={scalesPageToFit}
413
+        // TODO: find a better way to type this.
414
+        source={resolveAssetSource(this.props.source as ImageSourcePropType)}
415
+        style={webViewStyles}
416
+        {...nativeConfig.props}
417
+      />
418
+    );
419
+
420
+    return (
421
+      <View style={styles.container}>
422
+        {webView}
423
+        {otherView}
424
+      </View>
425
+    );
426
+  }
427
+}
410 428
 
411 429
 module.exports = WebView;

+ 1
- 3
src/WebViewShared.ts Прегледај датотеку

@@ -4,8 +4,6 @@
4 4
  * This source code is licensed under the MIT license found in the
5 5
  * LICENSE file in the root directory of this source tree.
6 6
  *
7
- * @format
8
- * @flow
9 7
  */
10 8
 
11 9
 import escapeStringRegexp from 'escape-string-regexp';
@@ -21,7 +19,7 @@ const UIManager = NotTypedUIManager as CustomUIManager;
21 19
 const defaultOriginWhitelist = ['http://*', 'https://*'];
22 20
 
23 21
 const extractOrigin = (url: string): string => {
24
-  const result = /^[A-Za-z][A-Za-z0-9\+\-\.]+:(\/\/)?[^/]*/.exec(url);
22
+  const result = /^[A-Za-z][A-Za-z0-9+\-.]+:(\/\/)?[^/]*/.exec(url);
25 23
   return result === null ? '' : result[0];
26 24
 };
27 25
 

src/WebViewTypes.js → src/WebViewTypes.flow.js Прегледај датотеку


+ 14
- 9
src/WebViewTypes.ts Прегледај датотеку

@@ -6,6 +6,8 @@
6 6
  *
7 7
  */
8 8
 
9
+/* eslint-disable react/no-multi-comp */
10
+
9 11
 import { ReactNode, ReactElement, Component } from 'react';
10 12
 import {
11 13
   NativeSyntheticEvent,
@@ -17,7 +19,7 @@ import {
17 19
   UIManagerStatic,
18 20
 } from 'react-native';
19 21
 
20
-interface WebViewCommands {
22
+export interface WebViewCommands {
21 23
   goForward: Function;
22 24
   goBack: Function;
23 25
   reload: Function;
@@ -35,8 +37,8 @@ export interface CustomUIManager extends UIManagerStatic {
35 37
   };
36 38
   dispatchViewManagerCommand: (
37 39
     viewHandle: number,
38
-    command: any,
39
-    params: any,
40
+    command: Function,
41
+    params: object | null,
40 42
   ) => void;
41 43
   RNCUIWebView: {
42 44
     Commands: WebViewCommands;
@@ -67,6 +69,7 @@ interface ErrorState extends BaseState {
67 69
 
68 70
 export type State = NormalState | ErrorState;
69 71
 
72
+// eslint-disable-next-line react/prefer-stateless-function
70 73
 declare class NativeWebViewIOSComponent extends Component<
71 74
   IOSNativeWebViewProps
72 75
 > {}
@@ -74,6 +77,7 @@ declare const NativeWebViewIOSBase: Constructor<NativeMethodsMixin> &
74 77
   typeof NativeWebViewIOSComponent;
75 78
 export class NativeWebViewIOS extends NativeWebViewIOSBase {}
76 79
 
80
+// eslint-disable-next-line react/prefer-stateless-function
77 81
 declare class NativeWebViewAndroidComponent extends Component<
78 82
   AndroidNativeWebViewProps
79 83
 > {}
@@ -134,8 +138,8 @@ export type WebViewMessageEvent = NativeSyntheticEvent<WebViewMessage>;
134 138
 
135 139
 export type WebViewErrorEvent = NativeSyntheticEvent<WebViewError>;
136 140
 
137
-export type DataDetectorTypes =
138
-  | 'phoneNumber'
141
+export type DataDetectorTypes
142
+  = | 'phoneNumber'
139 143
   | 'link'
140 144
   | 'address'
141 145
   | 'calendarEvent'
@@ -191,7 +195,7 @@ export interface ViewManager {
191 195
   startLoadWithResult: Function;
192 196
 }
193 197
 
194
-export type WebViewNativeConfig = {
198
+export interface WebViewNativeConfig {
195 199
   /**
196 200
    * The native component used to render the WebView.
197 201
    */
@@ -206,7 +210,7 @@ export type WebViewNativeConfig = {
206 210
    * @platform ios
207 211
    */
208 212
   viewManager?: ViewManager;
209
-};
213
+}
210 214
 
211 215
 export type OnShouldStartLoadWithRequest = (
212 216
   event: WebViewNavigation,
@@ -227,6 +231,7 @@ export interface CommonNativeWebViewProps extends ViewProps {
227 231
   showsHorizontalScrollIndicator?: boolean;
228 232
   showsVerticalScrollIndicator?: boolean;
229 233
   // TODO: find a better way to type this.
234
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any
230 235
   source: any;
231 236
   userAgent?: string;
232 237
 }
@@ -511,12 +516,12 @@ export interface WebViewSharedProps extends ViewProps {
511 516
     errorDomain: string | undefined,
512 517
     errorCode: number,
513 518
     errorDesc: string,
514
-  ) => ReactElement<any>; // view to show if there's an error
519
+  ) => ReactElement; // view to show if there's an error
515 520
 
516 521
   /**
517 522
    * Function that returns a loading indicator.
518 523
    */
519
-  renderLoading: () => ReactElement<any>;
524
+  renderLoading: () => ReactElement;
520 525
 
521 526
   /**
522 527
    * Function that is invoked when the `WebView` has finished loading.

+ 4
- 0
tsconfig.json Прегледај датотеку

@@ -1,10 +1,14 @@
1 1
 {
2
+  "include": ["src/*"],
2 3
   "compilerOptions": {
3 4
     "baseUrl": "./src/",
4 5
     "jsx": "react-native",
5 6
     "module": "esnext",
6 7
     "moduleResolution": "node",
7 8
     "lib": ["es2017"],
9
+    "declaration": true,
10
+    "declarationMap": true,
11
+    "outDir": "lib",
8 12
     "allowSyntheticDefaultImports": true,
9 13
     "esModuleInterop": true,
10 14
     "forceConsistentCasingInFileNames": true,

+ 540
- 22
yarn.lock Прегледај датотеку

@@ -841,6 +841,33 @@
841 841
     "@types/prop-types" "*"
842 842
     csstype "^2.2.0"
843 843
 
844
+"@typescript-eslint/eslint-plugin@1.4.2":
845
+  version "1.4.2"
846
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.4.2.tgz#370bc32022d1cc884a5dcf62624ef2024182769d"
847
+  integrity sha512-6WInypy/cK4rM1dirKbD5p7iFW28DbSRKT/+PGn+DYzBWEvHq5KnZAqQ5cX25JBc0qMkFxJNxNfBbFXJyyzVcw==
848
+  dependencies:
849
+    "@typescript-eslint/parser" "1.4.2"
850
+    "@typescript-eslint/typescript-estree" "1.4.2"
851
+    requireindex "^1.2.0"
852
+    tsutils "^3.7.0"
853
+
854
+"@typescript-eslint/parser@1.4.2":
855
+  version "1.4.2"
856
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.4.2.tgz#acfdee2019958a41d308d768e53ded975ef90ce8"
857
+  integrity sha512-OqLkY9295DXXaWToItUv3olO2//rmzh6Th6Sc7YjFFEpEuennsm5zhygLLvHZjPxPlzrQgE8UDaOPurDylaUuw==
858
+  dependencies:
859
+    "@typescript-eslint/typescript-estree" "1.4.2"
860
+    eslint-scope "^4.0.0"
861
+    eslint-visitor-keys "^1.0.0"
862
+
863
+"@typescript-eslint/typescript-estree@1.4.2":
864
+  version "1.4.2"
865
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.4.2.tgz#b16bc36c9a4748a7fca92cba4c2d73c5325c8a85"
866
+  integrity sha512-wKgi/w6k1v3R4b6oDc20cRWro2gBzp0wn6CAeYC8ExJMfvXMfiaXzw2tT9ilxdONaVWMCk7B9fMdjos7bF/CWw==
867
+  dependencies:
868
+    lodash.unescape "4.0.1"
869
+    semver "5.5.0"
870
+
844 871
 JSONStream@^1.0.4, JSONStream@^1.3.4:
845 872
   version "1.3.5"
846 873
   resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
@@ -880,6 +907,11 @@ acorn-globals@^4.1.0:
880 907
     acorn "^6.0.1"
881 908
     acorn-walk "^6.0.1"
882 909
 
910
+acorn-jsx@^5.0.0:
911
+  version "5.0.1"
912
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
913
+  integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
914
+
883 915
 acorn-walk@^6.0.1:
884 916
   version "6.1.1"
885 917
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
@@ -890,7 +922,7 @@ acorn@^5.5.3:
890 922
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
891 923
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
892 924
 
893
-acorn@^6.0.1:
925
+acorn@^6.0.1, acorn@^6.0.7:
894 926
   version "6.1.1"
895 927
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
896 928
   integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
@@ -925,7 +957,7 @@ aggregate-error@^2.0.0:
925 957
     clean-stack "^2.0.0"
926 958
     indent-string "^3.0.0"
927 959
 
928
-ajv@^6.5.5:
960
+ajv@^6.5.5, ajv@^6.9.1:
929 961
   version "6.10.0"
930 962
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
931 963
   integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
@@ -956,7 +988,7 @@ ansi-cyan@^0.1.1:
956 988
   dependencies:
957 989
     ansi-wrap "0.1.0"
958 990
 
959
-ansi-escapes@^3.0.0, ansi-escapes@^3.1.0:
991
+ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0:
960 992
   version "3.2.0"
961 993
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
962 994
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
@@ -990,6 +1022,11 @@ ansi-regex@^4.0.0:
990 1022
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9"
991 1023
   integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==
992 1024
 
1025
+ansi-regex@^4.1.0:
1026
+  version "4.1.0"
1027
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
1028
+  integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
1029
+
993 1030
 ansi-styles@^2.2.1:
994 1031
   version "2.2.1"
995 1032
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1072,6 +1109,14 @@ argv-formatter@~1.0.0:
1072 1109
   resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9"
1073 1110
   integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=
1074 1111
 
1112
+aria-query@^3.0.0:
1113
+  version "3.0.0"
1114
+  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
1115
+  integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
1116
+  dependencies:
1117
+    ast-types-flow "0.0.7"
1118
+    commander "^2.11.0"
1119
+
1075 1120
 arr-diff@^1.0.1:
1076 1121
   version "1.1.0"
1077 1122
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
@@ -1127,6 +1172,14 @@ array-ify@^1.0.0:
1127 1172
   resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
1128 1173
   integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=
1129 1174
 
1175
+array-includes@^3.0.3:
1176
+  version "3.0.3"
1177
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
1178
+  integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=
1179
+  dependencies:
1180
+    define-properties "^1.1.2"
1181
+    es-abstract "^1.7.0"
1182
+
1130 1183
 array-map@~0.0.0:
1131 1184
   version "0.0.0"
1132 1185
   resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
@@ -1196,6 +1249,11 @@ assign-symbols@^1.0.0:
1196 1249
   resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
1197 1250
   integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
1198 1251
 
1252
+ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
1253
+  version "0.0.7"
1254
+  resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
1255
+  integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
1256
+
1199 1257
 astral-regex@^1.0.0:
1200 1258
   version "1.0.0"
1201 1259
   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
@@ -1233,6 +1291,25 @@ aws4@^1.8.0:
1233 1291
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
1234 1292
   integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
1235 1293
 
1294
+axobject-query@^2.0.2:
1295
+  version "2.0.2"
1296
+  resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9"
1297
+  integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==
1298
+  dependencies:
1299
+    ast-types-flow "0.0.7"
1300
+
1301
+babel-eslint@10.0.1:
1302
+  version "10.0.1"
1303
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed"
1304
+  integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==
1305
+  dependencies:
1306
+    "@babel/code-frame" "^7.0.0"
1307
+    "@babel/parser" "^7.0.0"
1308
+    "@babel/traverse" "^7.0.0"
1309
+    "@babel/types" "^7.0.0"
1310
+    eslint-scope "3.7.1"
1311
+    eslint-visitor-keys "^1.0.0"
1312
+
1236 1313
 babel-jest@^24.0.0, babel-jest@^24.1.0:
1237 1314
   version "24.1.0"
1238 1315
   resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.1.0.tgz#441e23ef75ded3bd547e300ac3194cef87b55190"
@@ -1640,7 +1717,7 @@ chalk@^1.1.1:
1640 1717
     strip-ansi "^3.0.0"
1641 1718
     supports-color "^2.0.0"
1642 1719
 
1643
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
1720
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
1644 1721
   version "2.4.2"
1645 1722
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1646 1723
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1654,6 +1731,11 @@ chardet@^0.4.0:
1654 1731
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
1655 1732
   integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
1656 1733
 
1734
+chardet@^0.7.0:
1735
+  version "0.7.0"
1736
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
1737
+  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
1738
+
1657 1739
 chownr@^1.0.1, chownr@^1.1.1:
1658 1740
   version "1.1.1"
1659 1741
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
@@ -1834,7 +1916,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
1834 1916
   dependencies:
1835 1917
     delayed-stream "~1.0.0"
1836 1918
 
1837
-commander@^2.9.0:
1919
+commander@^2.11.0, commander@^2.9.0:
1838 1920
   version "2.19.0"
1839 1921
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
1840 1922
   integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
@@ -1942,6 +2024,11 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-
1942 2024
   resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
1943 2025
   integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
1944 2026
 
2027
+contains-path@^0.1.0:
2028
+  version "0.1.0"
2029
+  resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
2030
+  integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
2031
+
1945 2032
 conventional-changelog-angular@^5.0.0:
1946 2033
   version "5.0.3"
1947 2034
   resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0"
@@ -2062,7 +2149,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0:
2062 2149
     shebang-command "^1.2.0"
2063 2150
     which "^1.2.9"
2064 2151
 
2065
-cross-spawn@^6.0.0:
2152
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
2066 2153
   version "6.0.5"
2067 2154
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
2068 2155
   integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -2107,6 +2194,11 @@ cyclist@~0.2.2:
2107 2194
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
2108 2195
   integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
2109 2196
 
2197
+damerau-levenshtein@^1.0.4:
2198
+  version "1.0.4"
2199
+  resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
2200
+  integrity sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=
2201
+
2110 2202
 dashdash@^1.12.0:
2111 2203
   version "1.14.1"
2112 2204
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -2128,7 +2220,7 @@ dateformat@^3.0.0:
2128 2220
   resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
2129 2221
   integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
2130 2222
 
2131
-debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
2223
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
2132 2224
   version "2.6.9"
2133 2225
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
2134 2226
   integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -2149,7 +2241,7 @@ debug@^3.1.0:
2149 2241
   dependencies:
2150 2242
     ms "^2.1.1"
2151 2243
 
2152
-debug@^4.0.0, debug@^4.1.0, debug@^4.1.1:
2244
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
2153 2245
   version "4.1.1"
2154 2246
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
2155 2247
   integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
@@ -2208,7 +2300,7 @@ defaults@^1.0.3:
2208 2300
   dependencies:
2209 2301
     clone "^1.0.2"
2210 2302
 
2211
-define-properties@^1.1.2:
2303
+define-properties@^1.1.2, define-properties@^1.1.3:
2212 2304
   version "1.1.3"
2213 2305
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
2214 2306
   integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@@ -2310,6 +2402,28 @@ dir-glob@^2.0.0, dir-glob@^2.2.1:
2310 2402
   dependencies:
2311 2403
     path-type "^3.0.0"
2312 2404
 
2405
+doctrine@1.5.0:
2406
+  version "1.5.0"
2407
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
2408
+  integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
2409
+  dependencies:
2410
+    esutils "^2.0.2"
2411
+    isarray "^1.0.0"
2412
+
2413
+doctrine@^2.1.0:
2414
+  version "2.1.0"
2415
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
2416
+  integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
2417
+  dependencies:
2418
+    esutils "^2.0.2"
2419
+
2420
+doctrine@^3.0.0:
2421
+  version "3.0.0"
2422
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
2423
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
2424
+  dependencies:
2425
+    esutils "^2.0.2"
2426
+
2313 2427
 dom-walk@^0.1.0:
2314 2428
   version "0.1.1"
2315 2429
   resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
@@ -2381,6 +2495,11 @@ ee-first@1.1.1:
2381 2495
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
2382 2496
   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
2383 2497
 
2498
+emoji-regex@^7.0.1, emoji-regex@^7.0.2:
2499
+  version "7.0.3"
2500
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
2501
+  integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
2502
+
2384 2503
 encodeurl@~1.0.1, encodeurl@~1.0.2:
2385 2504
   version "1.0.2"
2386 2505
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@@ -2440,7 +2559,7 @@ errorhandler@^1.5.0:
2440 2559
     accepts "~1.3.3"
2441 2560
     escape-html "~1.0.3"
2442 2561
 
2443
-es-abstract@^1.5.1:
2562
+es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
2444 2563
   version "1.13.0"
2445 2564
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
2446 2565
   integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
@@ -2495,6 +2614,189 @@ escodegen@^1.9.1:
2495 2614
   optionalDependencies:
2496 2615
     source-map "~0.6.1"
2497 2616
 
2617
+eslint-config-airbnb-base@^13.1.0:
2618
+  version "13.1.0"
2619
+  resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz#b5a1b480b80dfad16433d6c4ad84e6605052c05c"
2620
+  integrity sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==
2621
+  dependencies:
2622
+    eslint-restricted-globals "^0.1.1"
2623
+    object.assign "^4.1.0"
2624
+    object.entries "^1.0.4"
2625
+
2626
+eslint-config-airbnb@17.1.0:
2627
+  version "17.1.0"
2628
+  resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz#3964ed4bc198240315ff52030bf8636f42bc4732"
2629
+  integrity sha512-R9jw28hFfEQnpPau01NO5K/JWMGLi6aymiF6RsnMURjTk+MqZKllCqGK/0tOvHkPi/NWSSOU2Ced/GX++YxLnw==
2630
+  dependencies:
2631
+    eslint-config-airbnb-base "^13.1.0"
2632
+    object.assign "^4.1.0"
2633
+    object.entries "^1.0.4"
2634
+
2635
+eslint-config-prettier@4.1.0:
2636
+  version "4.1.0"
2637
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.1.0.tgz#181364895899fff9fd3605fecb5c4f20e7d5f395"
2638
+  integrity sha512-zILwX9/Ocz4SV2vX7ox85AsrAgXV3f2o2gpIicdMIOra48WYqgUnWNH/cR/iHtmD2Vb3dLSC3LiEJnS05Gkw7w==
2639
+  dependencies:
2640
+    get-stdin "^6.0.0"
2641
+
2642
+eslint-import-resolver-node@^0.3.2:
2643
+  version "0.3.2"
2644
+  resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a"
2645
+  integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==
2646
+  dependencies:
2647
+    debug "^2.6.9"
2648
+    resolve "^1.5.0"
2649
+
2650
+eslint-module-utils@^2.3.0:
2651
+  version "2.3.0"
2652
+  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49"
2653
+  integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==
2654
+  dependencies:
2655
+    debug "^2.6.8"
2656
+    pkg-dir "^2.0.0"
2657
+
2658
+eslint-plugin-import@2.16.0:
2659
+  version "2.16.0"
2660
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f"
2661
+  integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==
2662
+  dependencies:
2663
+    contains-path "^0.1.0"
2664
+    debug "^2.6.9"
2665
+    doctrine "1.5.0"
2666
+    eslint-import-resolver-node "^0.3.2"
2667
+    eslint-module-utils "^2.3.0"
2668
+    has "^1.0.3"
2669
+    lodash "^4.17.11"
2670
+    minimatch "^3.0.4"
2671
+    read-pkg-up "^2.0.0"
2672
+    resolve "^1.9.0"
2673
+
2674
+eslint-plugin-jsx-a11y@6.2.1:
2675
+  version "6.2.1"
2676
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz#4ebba9f339b600ff415ae4166e3e2e008831cf0c"
2677
+  integrity sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w==
2678
+  dependencies:
2679
+    aria-query "^3.0.0"
2680
+    array-includes "^3.0.3"
2681
+    ast-types-flow "^0.0.7"
2682
+    axobject-query "^2.0.2"
2683
+    damerau-levenshtein "^1.0.4"
2684
+    emoji-regex "^7.0.2"
2685
+    has "^1.0.3"
2686
+    jsx-ast-utils "^2.0.1"
2687
+
2688
+eslint-plugin-react-hooks@1.5.0:
2689
+  version "1.5.0"
2690
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.5.0.tgz#cdd958cfff55bd5fa4f84db90d1490fb5ca4ae2b"
2691
+  integrity sha512-iwDuWR2ReRgvJsNm8fXPtTKdg78IVQF8I4+am3ntztPf/+nPnWZfArFu6aXpaC75/iCYRrkqI8nPCYkxJstmpA==
2692
+
2693
+eslint-plugin-react-native-globals@^0.1.1:
2694
+  version "0.1.2"
2695
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2"
2696
+  integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==
2697
+
2698
+eslint-plugin-react-native@3.6.0:
2699
+  version "3.6.0"
2700
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.6.0.tgz#7cad3b7c6159df6d26fe3252c6c5417a17f27b4b"
2701
+  integrity sha512-BEQcHZ06hZSBYWFVuNEq0xuui5VEsWpHDsZGBtfadHfCRqRMUrkYPgdDb3bpc60qShHE83kqIv59uKdinEg91Q==
2702
+  dependencies:
2703
+    eslint-plugin-react-native-globals "^0.1.1"
2704
+
2705
+eslint-plugin-react@7.12.4:
2706
+  version "7.12.4"
2707
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz#b1ecf26479d61aee650da612e425c53a99f48c8c"
2708
+  integrity sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==
2709
+  dependencies:
2710
+    array-includes "^3.0.3"
2711
+    doctrine "^2.1.0"
2712
+    has "^1.0.3"
2713
+    jsx-ast-utils "^2.0.1"
2714
+    object.fromentries "^2.0.0"
2715
+    prop-types "^15.6.2"
2716
+    resolve "^1.9.0"
2717
+
2718
+eslint-restricted-globals@^0.1.1:
2719
+  version "0.1.1"
2720
+  resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7"
2721
+  integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=
2722
+
2723
+eslint-scope@3.7.1:
2724
+  version "3.7.1"
2725
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
2726
+  integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=
2727
+  dependencies:
2728
+    esrecurse "^4.1.0"
2729
+    estraverse "^4.1.1"
2730
+
2731
+eslint-scope@^4.0.0, eslint-scope@^4.0.2:
2732
+  version "4.0.2"
2733
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e"
2734
+  integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==
2735
+  dependencies:
2736
+    esrecurse "^4.1.0"
2737
+    estraverse "^4.1.1"
2738
+
2739
+eslint-utils@^1.3.1:
2740
+  version "1.3.1"
2741
+  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512"
2742
+  integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==
2743
+
2744
+eslint-visitor-keys@^1.0.0:
2745
+  version "1.0.0"
2746
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
2747
+  integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==
2748
+
2749
+eslint@5.15.1:
2750
+  version "5.15.1"
2751
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.1.tgz#8266b089fd5391e0009a047050795b1d73664524"
2752
+  integrity sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg==
2753
+  dependencies:
2754
+    "@babel/code-frame" "^7.0.0"
2755
+    ajv "^6.9.1"
2756
+    chalk "^2.1.0"
2757
+    cross-spawn "^6.0.5"
2758
+    debug "^4.0.1"
2759
+    doctrine "^3.0.0"
2760
+    eslint-scope "^4.0.2"
2761
+    eslint-utils "^1.3.1"
2762
+    eslint-visitor-keys "^1.0.0"
2763
+    espree "^5.0.1"
2764
+    esquery "^1.0.1"
2765
+    esutils "^2.0.2"
2766
+    file-entry-cache "^5.0.1"
2767
+    functional-red-black-tree "^1.0.1"
2768
+    glob "^7.1.2"
2769
+    globals "^11.7.0"
2770
+    ignore "^4.0.6"
2771
+    import-fresh "^3.0.0"
2772
+    imurmurhash "^0.1.4"
2773
+    inquirer "^6.2.2"
2774
+    js-yaml "^3.12.0"
2775
+    json-stable-stringify-without-jsonify "^1.0.1"
2776
+    levn "^0.3.0"
2777
+    lodash "^4.17.11"
2778
+    minimatch "^3.0.4"
2779
+    mkdirp "^0.5.1"
2780
+    natural-compare "^1.4.0"
2781
+    optionator "^0.8.2"
2782
+    path-is-inside "^1.0.2"
2783
+    progress "^2.0.0"
2784
+    regexpp "^2.0.1"
2785
+    semver "^5.5.1"
2786
+    strip-ansi "^4.0.0"
2787
+    strip-json-comments "^2.0.1"
2788
+    table "^5.2.3"
2789
+    text-table "^0.2.0"
2790
+
2791
+espree@^5.0.1:
2792
+  version "5.0.1"
2793
+  resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
2794
+  integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
2795
+  dependencies:
2796
+    acorn "^6.0.7"
2797
+    acorn-jsx "^5.0.0"
2798
+    eslint-visitor-keys "^1.0.0"
2799
+
2498 2800
 esprima@^3.1.3:
2499 2801
   version "3.1.3"
2500 2802
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
@@ -2505,7 +2807,21 @@ esprima@^4.0.0, esprima@~4.0.0:
2505 2807
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
2506 2808
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2507 2809
 
2508
-estraverse@^4.2.0:
2810
+esquery@^1.0.1:
2811
+  version "1.0.1"
2812
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
2813
+  integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
2814
+  dependencies:
2815
+    estraverse "^4.0.0"
2816
+
2817
+esrecurse@^4.1.0:
2818
+  version "4.2.1"
2819
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
2820
+  integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
2821
+  dependencies:
2822
+    estraverse "^4.1.0"
2823
+
2824
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
2509 2825
   version "4.2.0"
2510 2826
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
2511 2827
   integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
@@ -2655,6 +2971,15 @@ external-editor@^2.0.4:
2655 2971
     iconv-lite "^0.4.17"
2656 2972
     tmp "^0.0.33"
2657 2973
 
2974
+external-editor@^3.0.3:
2975
+  version "3.0.3"
2976
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27"
2977
+  integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==
2978
+  dependencies:
2979
+    chardet "^0.7.0"
2980
+    iconv-lite "^0.4.24"
2981
+    tmp "^0.0.33"
2982
+
2658 2983
 extglob@^0.3.1:
2659 2984
   version "0.3.2"
2660 2985
   resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
@@ -2790,6 +3115,13 @@ figures@^2.0.0:
2790 3115
   dependencies:
2791 3116
     escape-string-regexp "^1.0.5"
2792 3117
 
3118
+file-entry-cache@^5.0.1:
3119
+  version "5.0.1"
3120
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
3121
+  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
3122
+  dependencies:
3123
+    flat-cache "^2.0.1"
3124
+
2793 3125
 filename-regex@^2.0.0:
2794 3126
   version "2.0.1"
2795 3127
   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
@@ -2873,6 +3205,20 @@ find-versions@^2.0.0:
2873 3205
     array-uniq "^1.0.0"
2874 3206
     semver-regex "^1.0.0"
2875 3207
 
3208
+flat-cache@^2.0.1:
3209
+  version "2.0.1"
3210
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
3211
+  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
3212
+  dependencies:
3213
+    flatted "^2.0.0"
3214
+    rimraf "2.6.3"
3215
+    write "1.0.3"
3216
+
3217
+flatted@^2.0.0:
3218
+  version "2.0.0"
3219
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
3220
+  integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==
3221
+
2876 3222
 flow-bin@^0.80.0:
2877 3223
   version "0.80.0"
2878 3224
   resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.80.0.tgz#04cc1ee626a6f50786f78170c92ebe1745235403"
@@ -3012,6 +3358,11 @@ function-bind@^1.1.1:
3012 3358
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
3013 3359
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
3014 3360
 
3361
+functional-red-black-tree@^1.0.1:
3362
+  version "1.0.1"
3363
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
3364
+  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
3365
+
3015 3366
 gauge@~1.2.5:
3016 3367
   version "1.2.7"
3017 3368
   resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93"
@@ -3061,6 +3412,11 @@ get-caller-file@^1.0.1:
3061 3412
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
3062 3413
   integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
3063 3414
 
3415
+get-stdin@^6.0.0:
3416
+  version "6.0.0"
3417
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
3418
+  integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
3419
+
3064 3420
 get-stream@^3.0.0:
3065 3421
   version "3.0.0"
3066 3422
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -3167,7 +3523,7 @@ global@^4.3.0:
3167 3523
     min-document "^2.19.0"
3168 3524
     process "~0.5.1"
3169 3525
 
3170
-globals@^11.1.0:
3526
+globals@^11.1.0, globals@^11.7.0:
3171 3527
   version "11.11.0"
3172 3528
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e"
3173 3529
   integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==
@@ -3384,7 +3740,7 @@ humanize-ms@^1.2.1:
3384 3740
   dependencies:
3385 3741
     ms "^2.0.0"
3386 3742
 
3387
-iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
3743
+iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
3388 3744
   version "0.4.24"
3389 3745
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
3390 3746
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -3413,7 +3769,7 @@ ignore@^3.3.5:
3413 3769
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
3414 3770
   integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
3415 3771
 
3416
-ignore@^4.0.3:
3772
+ignore@^4.0.3, ignore@^4.0.6:
3417 3773
   version "4.0.6"
3418 3774
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
3419 3775
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
@@ -3431,6 +3787,14 @@ import-fresh@^2.0.0:
3431 3787
     caller-path "^2.0.0"
3432 3788
     resolve-from "^3.0.0"
3433 3789
 
3790
+import-fresh@^3.0.0:
3791
+  version "3.0.0"
3792
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390"
3793
+  integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==
3794
+  dependencies:
3795
+    parent-module "^1.0.0"
3796
+    resolve-from "^4.0.0"
3797
+
3434 3798
 import-from@^2.1.0:
3435 3799
   version "2.1.0"
3436 3800
   resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
@@ -3513,6 +3877,25 @@ inquirer@^3.0.6:
3513 3877
     strip-ansi "^4.0.0"
3514 3878
     through "^2.3.6"
3515 3879
 
3880
+inquirer@^6.2.2:
3881
+  version "6.2.2"
3882
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406"
3883
+  integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==
3884
+  dependencies:
3885
+    ansi-escapes "^3.2.0"
3886
+    chalk "^2.4.2"
3887
+    cli-cursor "^2.1.0"
3888
+    cli-width "^2.0.0"
3889
+    external-editor "^3.0.3"
3890
+    figures "^2.0.0"
3891
+    lodash "^4.17.11"
3892
+    mute-stream "0.0.7"
3893
+    run-async "^2.2.0"
3894
+    rxjs "^6.4.0"
3895
+    string-width "^2.1.0"
3896
+    strip-ansi "^5.0.0"
3897
+    through "^2.3.6"
3898
+
3516 3899
 into-stream@^4.0.0:
3517 3900
   version "4.0.0"
3518 3901
   resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-4.0.0.tgz#ef10ee2ffb6f78af34c93194bbdc36c35f7d8a9d"
@@ -3858,7 +4241,7 @@ isarray@0.0.1:
3858 4241
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
3859 4242
   integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
3860 4243
 
3861
-isarray@1.0.0, isarray@~1.0.0:
4244
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
3862 4245
   version "1.0.0"
3863 4246
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
3864 4247
   integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
@@ -4417,6 +4800,11 @@ json-schema@0.2.3:
4417 4800
   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
4418 4801
   integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
4419 4802
 
4803
+json-stable-stringify-without-jsonify@^1.0.1:
4804
+  version "1.0.1"
4805
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
4806
+  integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
4807
+
4420 4808
 json-stable-stringify@^1.0.1:
4421 4809
   version "1.0.1"
4422 4810
   resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
@@ -4470,6 +4858,13 @@ jsprim@^1.2.2:
4470 4858
     json-schema "0.2.3"
4471 4859
     verror "1.10.0"
4472 4860
 
4861
+jsx-ast-utils@^2.0.1:
4862
+  version "2.0.1"
4863
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
4864
+  integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=
4865
+  dependencies:
4866
+    array-includes "^3.0.3"
4867
+
4473 4868
 kind-of@^1.1.0:
4474 4869
   version "1.1.0"
4475 4870
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
@@ -4547,7 +4942,7 @@ leven@^2.1.0:
4547 4942
   resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
4548 4943
   integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
4549 4944
 
4550
-levn@~0.3.0:
4945
+levn@^0.3.0, levn@~0.3.0:
4551 4946
   version "0.3.0"
4552 4947
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
4553 4948
   integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
@@ -4731,6 +5126,11 @@ lodash.toarray@^4.4.0:
4731 5126
   resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
4732 5127
   integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE=
4733 5128
 
5129
+lodash.unescape@4.0.1:
5130
+  version "4.0.1"
5131
+  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
5132
+  integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
5133
+
4734 5134
 lodash.union@~4.6.0:
4735 5135
   version "4.6.0"
4736 5136
   resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
@@ -5897,7 +6297,7 @@ object-copy@^0.1.0:
5897 6297
     define-property "^0.2.5"
5898 6298
     kind-of "^3.0.3"
5899 6299
 
5900
-object-keys@^1.0.12:
6300
+object-keys@^1.0.11, object-keys@^1.0.12:
5901 6301
   version "1.1.0"
5902 6302
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032"
5903 6303
   integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==
@@ -5909,6 +6309,36 @@ object-visit@^1.0.0:
5909 6309
   dependencies:
5910 6310
     isobject "^3.0.0"
5911 6311
 
6312
+object.assign@^4.1.0:
6313
+  version "4.1.0"
6314
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
6315
+  integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
6316
+  dependencies:
6317
+    define-properties "^1.1.2"
6318
+    function-bind "^1.1.1"
6319
+    has-symbols "^1.0.0"
6320
+    object-keys "^1.0.11"
6321
+
6322
+object.entries@^1.0.4:
6323
+  version "1.1.0"
6324
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
6325
+  integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==
6326
+  dependencies:
6327
+    define-properties "^1.1.3"
6328
+    es-abstract "^1.12.0"
6329
+    function-bind "^1.1.1"
6330
+    has "^1.0.3"
6331
+
6332
+object.fromentries@^2.0.0:
6333
+  version "2.0.0"
6334
+  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab"
6335
+  integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==
6336
+  dependencies:
6337
+    define-properties "^1.1.2"
6338
+    es-abstract "^1.11.0"
6339
+    function-bind "^1.1.1"
6340
+    has "^1.0.1"
6341
+
5912 6342
 object.getownpropertydescriptors@^2.0.3:
5913 6343
   version "2.0.3"
5914 6344
   resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
@@ -5983,7 +6413,7 @@ optimist@^0.6.1:
5983 6413
     minimist "~0.0.1"
5984 6414
     wordwrap "~0.0.2"
5985 6415
 
5986
-optionator@^0.8.1:
6416
+optionator@^0.8.1, optionator@^0.8.2:
5987 6417
   version "0.8.2"
5988 6418
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
5989 6419
   integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
@@ -6178,6 +6608,13 @@ parallel-transform@^1.1.0:
6178 6608
     inherits "^2.0.3"
6179 6609
     readable-stream "^2.1.5"
6180 6610
 
6611
+parent-module@^1.0.0:
6612
+  version "1.0.0"
6613
+  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5"
6614
+  integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==
6615
+  dependencies:
6616
+    callsites "^3.0.0"
6617
+
6181 6618
 parse-github-url@^1.0.1:
6182 6619
   version "1.0.2"
6183 6620
   resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395"
@@ -6429,6 +6866,11 @@ process@~0.5.1:
6429 6866
   resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
6430 6867
   integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
6431 6868
 
6869
+progress@^2.0.0:
6870
+  version "2.0.3"
6871
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
6872
+  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
6873
+
6432 6874
 promise-inflight@^1.0.1, promise-inflight@~1.0.1:
6433 6875
   version "1.0.1"
6434 6876
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
@@ -6918,6 +7360,11 @@ regex-not@^1.0.0, regex-not@^1.0.2:
6918 7360
     extend-shallow "^3.0.2"
6919 7361
     safe-regex "^1.1.0"
6920 7362
 
7363
+regexpp@^2.0.1:
7364
+  version "2.0.1"
7365
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
7366
+  integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
7367
+
6921 7368
 regexpu-core@^4.1.3:
6922 7369
   version "4.5.3"
6923 7370
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.3.tgz#72f572e03bb8b9f4f4d895a0ccc57e707f4af2e4"
@@ -7024,6 +7471,11 @@ require-main-filename@^1.0.1:
7024 7471
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
7025 7472
   integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
7026 7473
 
7474
+requireindex@^1.2.0:
7475
+  version "1.2.0"
7476
+  resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
7477
+  integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
7478
+
7027 7479
 resolve-cwd@^2.0.0:
7028 7480
   version "2.0.0"
7029 7481
   resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -7051,7 +7503,7 @@ resolve@1.1.7:
7051 7503
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
7052 7504
   integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
7053 7505
 
7054
-resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1:
7506
+resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0:
7055 7507
   version "1.10.0"
7056 7508
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
7057 7509
   integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
@@ -7081,7 +7533,7 @@ retry@^0.12.0:
7081 7533
   resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
7082 7534
   integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
7083 7535
 
7084
-rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2:
7536
+rimraf@2, rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2:
7085 7537
   version "2.6.3"
7086 7538
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
7087 7539
   integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -7124,6 +7576,13 @@ rx-lite@*, rx-lite@^4.0.8:
7124 7576
   resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
7125 7577
   integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
7126 7578
 
7579
+rxjs@^6.4.0:
7580
+  version "6.4.0"
7581
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504"
7582
+  integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==
7583
+  dependencies:
7584
+    tslib "^1.9.0"
7585
+
7127 7586
 safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
7128 7587
   version "5.1.2"
7129 7588
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -7242,6 +7701,11 @@ semver-regex@^1.0.0:
7242 7701
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
7243 7702
   integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
7244 7703
 
7704
+semver@5.5.0:
7705
+  version "5.5.0"
7706
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
7707
+  integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
7708
+
7245 7709
 semver@~5.3.0:
7246 7710
   version "5.3.0"
7247 7711
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -7389,6 +7853,15 @@ slash@^2.0.0:
7389 7853
   resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
7390 7854
   integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
7391 7855
 
7856
+slice-ansi@^2.1.0:
7857
+  version "2.1.0"
7858
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
7859
+  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
7860
+  dependencies:
7861
+    ansi-styles "^3.2.0"
7862
+    astral-regex "^1.0.0"
7863
+    is-fullwidth-code-point "^2.0.0"
7864
+
7392 7865
 slide@^1.1.3, slide@^1.1.5, slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
7393 7866
   version "1.1.6"
7394 7867
   resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
@@ -7720,6 +8193,15 @@ string-width@^1.0.1:
7720 8193
     is-fullwidth-code-point "^2.0.0"
7721 8194
     strip-ansi "^4.0.0"
7722 8195
 
8196
+string-width@^3.0.0:
8197
+  version "3.1.0"
8198
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
8199
+  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
8200
+  dependencies:
8201
+    emoji-regex "^7.0.1"
8202
+    is-fullwidth-code-point "^2.0.0"
8203
+    strip-ansi "^5.1.0"
8204
+
7723 8205
 string_decoder@~0.10.x:
7724 8206
   version "0.10.31"
7725 8207
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@@ -7758,6 +8240,13 @@ strip-ansi@^5.0.0:
7758 8240
   dependencies:
7759 8241
     ansi-regex "^4.0.0"
7760 8242
 
8243
+strip-ansi@^5.1.0:
8244
+  version "5.1.0"
8245
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4"
8246
+  integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==
8247
+  dependencies:
8248
+    ansi-regex "^4.1.0"
8249
+
7761 8250
 strip-bom@^3.0.0:
7762 8251
   version "3.0.0"
7763 8252
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -7773,7 +8262,7 @@ strip-indent@^2.0.0:
7773 8262
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
7774 8263
   integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
7775 8264
 
7776
-strip-json-comments@~2.0.1:
8265
+strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
7777 8266
   version "2.0.1"
7778 8267
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
7779 8268
   integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
@@ -7810,6 +8299,16 @@ symbol-tree@^3.2.2:
7810 8299
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
7811 8300
   integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=
7812 8301
 
8302
+table@^5.2.3:
8303
+  version "5.2.3"
8304
+  resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2"
8305
+  integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==
8306
+  dependencies:
8307
+    ajv "^6.9.1"
8308
+    lodash "^4.17.11"
8309
+    slice-ansi "^2.1.0"
8310
+    string-width "^3.0.0"
8311
+
7813 8312
 tar@^2.0.0:
7814 8313
   version "2.2.1"
7815 8314
   resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
@@ -7862,7 +8361,7 @@ text-extensions@^1.0.0:
7862 8361
   resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"
7863 8362
   integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==
7864 8363
 
7865
-text-table@~0.2.0:
8364
+text-table@^0.2.0, text-table@~0.2.0:
7866 8365
   version "0.2.0"
7867 8366
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
7868 8367
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
@@ -7985,6 +8484,18 @@ trim-right@^1.0.1:
7985 8484
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
7986 8485
   integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
7987 8486
 
8487
+tslib@^1.8.1, tslib@^1.9.0:
8488
+  version "1.9.3"
8489
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
8490
+  integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
8491
+
8492
+tsutils@^3.7.0:
8493
+  version "3.9.1"
8494
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.9.1.tgz#2a40dc742943c71eca6d5c1994fcf999956be387"
8495
+  integrity sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA==
8496
+  dependencies:
8497
+    tslib "^1.8.1"
8498
+
7988 8499
 tunnel-agent@^0.6.0:
7989 8500
   version "0.6.0"
7990 8501
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -8405,6 +8916,13 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
8405 8916
     imurmurhash "^0.1.4"
8406 8917
     signal-exit "^3.0.2"
8407 8918
 
8919
+write@1.0.3:
8920
+  version "1.0.3"
8921
+  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
8922
+  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
8923
+  dependencies:
8924
+    mkdirp "^0.5.1"
8925
+
8408 8926
 ws@^1.1.0, ws@^1.1.5:
8409 8927
   version "1.1.5"
8410 8928
   resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"