From 1d226a3c28b86e0fc0fcb6501086c32cde474855 Mon Sep 17 00:00:00 2001 From: Daniel Lo Nigro Date: Tue, 4 Sep 2018 23:51:43 -0700 Subject: [PATCH] Add Flow typing - Includes workaround for `config-chain` including intentionally broken test files in its repo: https://github.com/facebook/flow/issues/869 - Includes Hack for externals with Parcel: https://github.com/parcel-bundler/parcel/issues/144 --- .flowconfig | 15 +++++ flow-typed/source-map.js | 12 ++++ js/buildTree.js | 20 +++++- js/components/App.js | 16 ++++- js/components/Code.js | 14 +++- js/components/FileTree.js | 38 +++++++++-- js/components/Files.js | 19 +++++- js/externals/prism.js | 2 + js/externals/react-dom.js | 2 + js/externals/react.js | 2 + js/externals/source-map.js | 2 + js/getFilesFromSourceMap.js | 8 ++- js/index.js | 9 ++- package.json | 12 ++++ yarn.lock | 131 ++++++++++++++++++++++++++++++++++-- 15 files changed, 282 insertions(+), 20 deletions(-) create mode 100644 .flowconfig create mode 100644 flow-typed/source-map.js create mode 100644 js/externals/prism.js create mode 100644 js/externals/react-dom.js create mode 100644 js/externals/react.js create mode 100644 js/externals/source-map.js diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..774082a --- /dev/null +++ b/.flowconfig @@ -0,0 +1,15 @@ +[ignore] +# https://github.com/facebook/flow/issues/869 +.*/node_modules/config-chain/test/broken.json + +[include] + +[declarations] + +[libs] + +[lints] + +[options] + +[strict] diff --git a/flow-typed/source-map.js b/flow-typed/source-map.js new file mode 100644 index 0000000..3fef31f --- /dev/null +++ b/flow-typed/source-map.js @@ -0,0 +1,12 @@ +declare module "source-map" { + declare class SourceMapConsumer { + sources: $ReadOnlyArray, + + destroy(): void; + sourceContentFor(url: string): ?string; + } + + declare module.exports: { + SourceMapConsumer: (file: string | ArrayBuffer) => Promise, + } +} diff --git a/js/buildTree.js b/js/buildTree.js index a35a9e8..35b564b 100644 --- a/js/buildTree.js +++ b/js/buildTree.js @@ -1,5 +1,14 @@ -export default function buildTree(files) { - const tree = { +// @flow + +export type TreeNode = $ReadOnly<{| + name: string, + path: string, + type: 'dir' | 'file', + children: Map, +|}>; + +export default function buildTree(files: Array): TreeNode { + const tree: TreeNode = { name: '/', path: '', type: 'dir', @@ -16,6 +25,7 @@ export default function buildTree(files) { if (!next) { next = { name: piece, + path: `${curr.path}/${piece}`, type: 'dir', children: new Map(), }; @@ -35,7 +45,11 @@ export default function buildTree(files) { let root = tree; while (root && root.children.size === 1) { const firstKey = root.children.keys().next().value; - root = root.children.get(firstKey); + const node = firstKey && root.children.get(firstKey); + if (!node) { + break; + } + root = node; } return root; diff --git a/js/components/App.js b/js/components/App.js index e088b9a..0daf3ed 100644 --- a/js/components/App.js +++ b/js/components/App.js @@ -1,9 +1,21 @@ +// @flow + +import React from 'react'; + import classNames from './App.css'; import Files from './Files'; import getFilesFromSourceMap from '../getFilesFromSourceMap'; -export default class App extends React.Component { +type Props = {||}; +type State = {| + error: ?Error, + files: ?Map, + id: number, + loading: boolean, +|}; + +export default class App extends React.Component { state = { error: null, files: null, @@ -41,7 +53,7 @@ export default class App extends React.Component { ); } - _onSelectFile = (evt) => { + _onSelectFile = (evt: {target: {files: Array}}) => { this.setState(state => ({id: state.id + 1, loading: true})); const file = evt.target.files[0]; getFilesFromSourceMap(file).then( diff --git a/js/components/Code.js b/js/components/Code.js index 7ed897e..08d5d57 100644 --- a/js/components/Code.js +++ b/js/components/Code.js @@ -1,10 +1,20 @@ +// @flow + +// TODO: Flow type this +import Prism from 'prismjs'; +import React from 'react'; + import classNames from './Files.css'; -function runPrism(code) { +function runPrism(code: string): {|__html: string|} { return {__html: Prism.highlight(code, Prism.languages.javascript)}; } -export default class Code extends React.PureComponent { +type Props = {| + code: ?string, +|}; + +export default class Code extends React.PureComponent { render() { const code = this.props.code || '// File is empty'; return ( diff --git a/js/components/FileTree.js b/js/components/FileTree.js index d0bbe0d..11a8bb5 100644 --- a/js/components/FileTree.js +++ b/js/components/FileTree.js @@ -1,12 +1,27 @@ +// @flow + +import React from 'react'; +import nullthrows from 'nullthrows'; + +import type {TreeNode} from '../buildTree'; import classNames from './Files.css'; -export default class FileTree extends React.Component { +type Props = {| + selectedDir: $ReadOnlyArray, + selectedFile: ?string, + tree: TreeNode, + + onSelectDir: (path: $ReadOnlyArray) => void, + onSelectFile: (path: string) => void, +|}; + +export default class FileTree extends React.PureComponent { render() { const selectedPath = this.props.selectedDir; let selectedNode = this.props.tree; selectedPath.forEach(piece => { - selectedNode = selectedNode.children.get(piece); + selectedNode = nullthrows(selectedNode.children.get(piece)); }); const nodes = []; @@ -50,7 +65,14 @@ export default class FileTree extends React.Component { } } -class DirNode extends React.Component { +type DirNodeProps = {| + name: string, + path: $ReadOnlyArray, + + onSelect: (path: $ReadOnlyArray) => void, +|} + +class DirNode extends React.Component { render() { return (
  • {this.props.name}/
  • @@ -63,7 +85,15 @@ class DirNode extends React.Component { } } -class FileNode extends React.Component { +type FileNodeProps = {| + name: string, + node: TreeNode, + selectedFile: ?string, + + onSelect: (path: string) => void, +|}; + +class FileNode extends React.Component { render() { let name = this.props.name; if (this.props.selectedFile === this.props.node.path) { diff --git a/js/components/Files.js b/js/components/Files.js index 21da28b..b208919 100644 --- a/js/components/Files.js +++ b/js/components/Files.js @@ -1,10 +1,23 @@ +// @flow + +import React from 'react'; + import classNames from './Files.css'; import Code from './Code'; import FileTree from './FileTree'; import buildTree from '../buildTree'; -export default class Files extends React.Component { +type Props = {| + files: Map, +|}; + +type State = {| + selectedFile: ?string, + selectedDir: $ReadOnlyArray, +|}; + +export default class Files extends React.Component { state = { selectedDir: [], selectedFile: null, @@ -38,11 +51,11 @@ export default class Files extends React.Component { : '/' + this.state.selectedDir.join('/') + '/'; } - _onSelectDir = (path) => { + _onSelectDir = (path: $ReadOnlyArray) => { this.setState({selectedDir: path}); } - _onSelectFile = (path) => { + _onSelectFile = (path: string) => { this.setState({selectedFile: path}); } } diff --git a/js/externals/prism.js b/js/externals/prism.js new file mode 100644 index 0000000..9572514 --- /dev/null +++ b/js/externals/prism.js @@ -0,0 +1,2 @@ +// Loaded from CDN +module.exports = Prism; diff --git a/js/externals/react-dom.js b/js/externals/react-dom.js new file mode 100644 index 0000000..d877afc --- /dev/null +++ b/js/externals/react-dom.js @@ -0,0 +1,2 @@ +// Loaded from CDN +module.exports = ReactDOM; diff --git a/js/externals/react.js b/js/externals/react.js new file mode 100644 index 0000000..c3fc40d --- /dev/null +++ b/js/externals/react.js @@ -0,0 +1,2 @@ +// Loaded from CDN +module.exports = React; diff --git a/js/externals/source-map.js b/js/externals/source-map.js new file mode 100644 index 0000000..39317fd --- /dev/null +++ b/js/externals/source-map.js @@ -0,0 +1,2 @@ +// Loaded from CDN +module.exports = sourceMap; diff --git a/js/getFilesFromSourceMap.js b/js/getFilesFromSourceMap.js index 4538ce9..a2646bc 100644 --- a/js/getFilesFromSourceMap.js +++ b/js/getFilesFromSourceMap.js @@ -1,4 +1,10 @@ -export default function getFilesFromSourceMap(file) { +// @flow + +import sourceMap from 'source-map'; + +export default function getFilesFromSourceMap( + file: File +): Promise> { return new Promise((resolve, reject) => { const fileReader = new FileReader(); fileReader.onload = () => { diff --git a/js/index.js b/js/index.js index 6733664..2730f1d 100644 --- a/js/index.js +++ b/js/index.js @@ -1,6 +1,13 @@ +// @flow + +import React from 'react'; +import ReactDOM from 'react-dom'; +import sourceMap from 'source-map'; +import nullthrows from 'nullthrows'; + import App from './components/App'; sourceMap.SourceMapConsumer.initialize({ 'lib/mappings.wasm': 'https://unpkg.com/source-map@0.7.3/lib/mappings.wasm', }); -ReactDOM.render(, document.getElementById('app')); +ReactDOM.render(, nullthrows(document.getElementById('app'))); diff --git a/package.json b/package.json index caa3604..25f992e 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,23 @@ "build": "parcel build ./index.html", "watch": "parcel ./index.html" }, + "alias": { + "prismjs": "./js/externals/prism", + "react": "./js/externals/react", + "react-dom": "./js/externals/react-dom", + "source-map": "./js/externals/source-map" + }, "devDependencies": { "autoprefixer": "^9.1.3", + "babel-preset-flow": "^6.23.0", "babel-preset-react-app": "^3.1.2", + "flow-bin": "^0.80.0", + "nullthrows": "^1.0.2", "parcel-bundler": "^1.9.7", "postcss-modules": "^1.3.2", + "prismjs": "^1.15.0", + "react": "^16.0.0", + "react-dom": "^16.4.2", "sanitize.css": "^7.0.1", "source-map": "^0.7.3" } diff --git a/yarn.lock b/yarn.lock index a386095..f7a434d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -99,6 +99,10 @@ array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -689,7 +693,7 @@ babel-preset-env@^1.7.0: babel-preset-flow@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + resolved "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" @@ -1088,6 +1092,14 @@ cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" +clipboard@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz#a12481e1c13d8a50f5f036b0560fe5d16d74e46a" + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -1227,6 +1239,10 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + core-js@^2.4.0, core-js@^2.5.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -1550,6 +1566,10 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -1681,6 +1701,12 @@ encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -1840,6 +1866,18 @@ fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" +fbjs@^0.8.16: + version "0.8.17" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + filesize@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -1857,6 +1895,10 @@ flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +flow-bin@^0.80.0: + version "0.80.0" + resolved "https://registry.npmjs.org/flow-bin/-/flow-bin-0.80.0.tgz#04cc1ee626a6f50786f78170c92ebe1745235403" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1955,6 +1997,12 @@ globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + dependencies: + delegate "^3.1.2" + graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2097,7 +2145,7 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -iconv-lite@^0.4.4: +iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: @@ -2307,6 +2355,10 @@ is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" @@ -2357,6 +2409,13 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + js-base64@^2.1.9: version "2.4.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" @@ -2487,7 +2546,7 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: @@ -2662,6 +2721,13 @@ nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@^0.7.1: version "0.7.6" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" @@ -2771,6 +2837,10 @@ nth-check@^1.0.1: dependencies: boolbase "~1.0.0" +nullthrows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.0.2.tgz#1252d901884ab2e909f0a2ca49facf0af60d6300" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -3555,6 +3625,12 @@ prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" +prismjs@^1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" + optionalDependencies: + clipboard "^2.0.0" + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -3567,6 +3643,19 @@ process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.6.0: + version "15.6.2" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -3646,6 +3735,24 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-dom@^16.4.2: + version "16.4.2" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +react@^16.0.0: + version "16.4.2" + resolved "https://registry.npmjs.org/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -3825,6 +3932,10 @@ sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +select@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" @@ -3889,7 +4000,7 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -4216,6 +4327,10 @@ timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" +tiny-emitter@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" + tiny-inflate@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" @@ -4276,6 +4391,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +ua-parser-js@^0.7.18: + version "0.7.18" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + unicode-trie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" @@ -4377,6 +4496,10 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +whatwg-fetch@>=0.10.0: + version "2.0.4" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"