diff --git a/.gitignore b/.gitignore
index af8a6a6..6897440 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
node_modules
dist
.DS_Store
-coverage/
\ No newline at end of file
+coverage/
+*.log
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..6835724
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,3 @@
+test/
+dist/
+!test/transformers.test.ts
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..f3fc57b
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "singleQuote": true,
+ "printWidth": 120,
+ "tabWidth": 4,
+ "trailingComma": "all"
+}
diff --git a/.travis.yml b/.travis.yml
index 0d26c0d..57e0f7f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,3 @@
language: node_js
-node_js: 7
-cache:
- directories:
- - node_modules
\ No newline at end of file
+node_js: stable
+cache: yarn
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 81d50c3..fff8a01 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -7,15 +7,13 @@
"env": {
"NODE_ENV": "test"
},
- "externalConsole": false,
+ "console": "internalConsole",
"name": "Run Tests",
- "outDir": "${workspaceRoot}/dist",
- "preLaunchTask": "compile",
+ "outFiles": ["${workspaceRoot}/dist"],
+ "preLaunchTask": "tsc",
"program": "${workspaceRoot}/node_modules/.bin/jest",
"request": "launch",
- "runtimeArgs": [
-
- ],
+ "runtimeArgs": [],
"runtimeExecutable": null,
"sourceMaps": true,
"stopOnEntry": false,
@@ -28,4 +26,4 @@
"port": 5858
}
]
-}
\ No newline at end of file
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..a1e2ab6
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,16 @@
+{
+ "files.exclude": {
+ "**/.git": true,
+ "**/.svn": true,
+ "**/.hg": true,
+ "**/CVS": true,
+ "**/.DS_Store": true,
+ "**/node_modules": true,
+ "**/dist": true
+ },
+ "search.exclude": {
+ "**/node_modules": true,
+ "**/dist": true
+ },
+ "typescript.tsdk": "node_modules/typescript/lib"
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 926b1dd..319e8a4 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -7,4 +7,4 @@
"args": ["-p", "."],
"showOutput": "silent",
"problemMatcher": "$tsc"
-}
\ No newline at end of file
+}
diff --git a/LICENSE.md b/LICENSE.md
index 906b9c0..806595a 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,182 +1,181 @@
-
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
@@ -187,16 +186,16 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright 2014 Lyft, Inc.
+Copyright 2014 Lyft, Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/README.md b/README.md
index 5ca3147..535d695 100644
--- a/README.md
+++ b/README.md
@@ -4,60 +4,71 @@
Transforms React code written in JavaScript to TypeScript.
-## Features:
+[**🖥 Download the VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=mohsen1.react-javascript-to-typescript-transform-vscode)
-* Proxies `PropTypes` to `React.Component` generic type and removes PropTypes
-* Provides state typing for `React.Component` based on initial state and `setState()` calls in the component
-* Hoist large interfaces for props and state out of `React.Component
` into declared types
-* Convert functional components with `PropTypes` property to TypeScript and uses propTypes to generate function type declaration
+## Features:
+* Proxies `PropTypes` to `React.Component` generic type and removes PropTypes
+* Provides state typing for `React.Component` based on initial state and `setState()` calls in the component
+* Hoist large interfaces for props and state out of `React.Component
` into declared types
+* Convert functional components with `PropTypes` property to TypeScript and uses propTypes to generate function type declaration
## Example
**input**
+
```jsx
class MyComponent extends React.Component {
- static propTypes = {
- prop1: React.PropTypes.string.isRequired,
- prop2: React.PropTypes.number
- }
- constructor() {
- super();
- this.state = { foo: 1, bar: 'str' };
- }
- render() {
- return
{this.state.foo}, {this.state.bar}, {this.state.baz}
- }
- onClick() {
- this.setState({ baz: 3 })
- }
+ static propTypes = {
+ prop1: React.PropTypes.string.isRequired,
+ prop2: React.PropTypes.number,
+ };
+ constructor() {
+ super();
+ this.state = { foo: 1, bar: 'str' };
+ }
+ render() {
+ return (
+
+ {this.state.foo}, {this.state.bar}, {this.state.baz}
+
+ );
+ }
+ onClick() {
+ this.setState({ baz: 3 });
+ }
}
```
**output**
+
```tsx
type MyComponentProps = {
- prop1: string;
- prop2?: number;
-}
+ prop1: string;
+ prop2?: number;
+};
type MyComponentState = {
- foo: number;
- bar: string;
- baz: number;
-}
+ foo: number;
+ bar: string;
+ baz: number;
+};
class MyComponent extends React.Component {
- constructor() {
- super();
- this.state = { foo: 1, bar: 'str' };
- }
- render() {
- return {this.state.foo}, {this.state.bar}, {this.state.baz}
- }
- onClick() {
- this.setState({ baz: 3 })
- }
+ constructor() {
+ super();
+ this.state = { foo: 1, bar: 'str' };
+ }
+ render() {
+ return (
+
+ {this.state.foo}, {this.state.bar}, {this.state.baz}
+
+ );
+ }
+ onClick() {
+ this.setState({ baz: 3 });
+ }
}
```
@@ -73,10 +84,10 @@ npm install -g react-js-to-ts
react-js-to-ts my-react-js-file.js
```
-
### VSCode plugin
-[Download from VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=mohsen1.react-javascript-to-typescript-transform-vscode#review-details)
+details
+[Download from VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=mohsen1.react-javascript-to-typescript-transform-vscode#overview)
## Development
@@ -91,13 +102,14 @@ npm test
#### Watch mode
Pass `-w` to `npm test`
+
```
npm test -- -w
```
#### Only a single test case
-Pass `-t` with transform name and case name space separated to `npm test`
+Pass `-t` with transform name and case name space separated to `npm test`
```
npm test -- -t "react-js-make-props-and-state-transform propless-stateless"
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index b87d3a2..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,2019 +0,0 @@
-{
- "name": "react-js-to-ts",
- "version": "1.0.0-alpha-5",
- "lockfileVersion": 1,
- "dependencies": {
- "@types/chalk": {
- "version": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
- "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
- "dev": true
- },
- "@types/commander": {
- "version": "https://registry.npmjs.org/@types/commander/-/commander-2.9.0.tgz",
- "integrity": "sha1-3QevH8NddoM+DaJupnor4Ii1+vw=",
- "dev": true
- },
- "@types/glob": {
- "version": "https://registry.npmjs.org/@types/glob/-/glob-5.0.30.tgz",
- "integrity": "sha1-ECZAnFYlqGiQdGAoCNCCsoZ7ilE=",
- "dev": true
- },
- "@types/jest": {
- "version": "https://registry.npmjs.org/@types/jest/-/jest-19.2.3.tgz",
- "integrity": "sha1-YXSAQOhYmokd/C7B0Wot10SCmA4=",
- "dev": true
- },
- "@types/minimatch": {
- "version": "https://registry.npmjs.org/@types/minimatch/-/minimatch-2.0.29.tgz",
- "integrity": "sha1-UALhT3Xi1x5WQoHfBDHIwbSio2o=",
- "dev": true
- },
- "@types/node": {
- "version": "https://registry.npmjs.org/@types/node/-/node-7.0.22.tgz",
- "integrity": "sha1-RZP02Ci91hKSlHjqQMZ7T0A8olU=",
- "dev": true
- },
- "@types/react": {
- "version": "https://registry.npmjs.org/@types/react/-/react-15.0.24.tgz",
- "integrity": "sha1-inUpncN5Bt8yfBjKkYv5elXnEjs=",
- "dev": true
- },
- "abab": {
- "version": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz",
- "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=",
- "dev": true
- },
- "acorn": {
- "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz",
- "integrity": "sha1-7c2jvZN+dVZBDULtWGD2c5nHlMA=",
- "dev": true
- },
- "acorn-globals": {
- "version": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
- "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
- "dev": true
- },
- "ajv": {
- "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
- "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
- "dev": true
- },
- "align-text": {
- "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "dev": true
- },
- "amdefine": {
- "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true
- },
- "ansi-escapes": {
- "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
- "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
- "dev": true
- },
- "ansi-regex": {
- "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "anymatch": {
- "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
- "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
- "dev": true
- },
- "append-transform": {
- "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
- "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
- "dev": true
- },
- "argparse": {
- "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
- "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
- "dev": true
- },
- "arr-diff": {
- "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "dev": true
- },
- "arr-flatten": {
- "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz",
- "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=",
- "dev": true
- },
- "array-equal": {
- "version": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
- "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
- "dev": true
- },
- "array-unique": {
- "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true
- },
- "arrify": {
- "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "asn1": {
- "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
- "dev": true
- },
- "assert-plus": {
- "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
- "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
- "dev": true
- },
- "async": {
- "version": "https://registry.npmjs.org/async/-/async-2.4.1.tgz",
- "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=",
- "dev": true
- },
- "asynckit": {
- "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "aws-sign2": {
- "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
- "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
- "dev": true
- },
- "aws4": {
- "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
- "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
- "dev": true
- },
- "babel-code-frame": {
- "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
- "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
- "dev": true
- },
- "babel-core": {
- "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz",
- "integrity": "sha1-jEKFZNzh4fQfszfsNPTDsCK1rYM=",
- "dev": true
- },
- "babel-generator": {
- "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz",
- "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=",
- "dev": true
- },
- "babel-helpers": {
- "version": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true
- },
- "babel-jest": {
- "version": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz",
- "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=",
- "dev": true
- },
- "babel-messages": {
- "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "dev": true
- },
- "babel-plugin-istanbul": {
- "version": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.3.tgz",
- "integrity": "sha1-buYoBBDc9Zx3R1GMPf2YaAlY8QI=",
- "dev": true
- },
- "babel-plugin-jest-hoist": {
- "version": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz",
- "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=",
- "dev": true
- },
- "babel-plugin-transform-es2015-modules-commonjs": {
- "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz",
- "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=",
- "dev": true
- },
- "babel-plugin-transform-strict-mode": {
- "version": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
- "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
- "dev": true
- },
- "babel-preset-jest": {
- "version": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz",
- "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=",
- "dev": true
- },
- "babel-register": {
- "version": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz",
- "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=",
- "dev": true
- },
- "babel-runtime": {
- "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
- "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
- "dev": true
- },
- "babel-template": {
- "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz",
- "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=",
- "dev": true
- },
- "babel-traverse": {
- "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz",
- "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=",
- "dev": true
- },
- "babel-types": {
- "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz",
- "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=",
- "dev": true
- },
- "babylon": {
- "version": "https://registry.npmjs.org/babylon/-/babylon-6.17.1.tgz",
- "integrity": "sha1-F/FP3fNhtpWYH+Z5OF5PHAHr2G8=",
- "dev": true
- },
- "balanced-match": {
- "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
- "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
- },
- "bcrypt-pbkdf": {
- "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "dev": true,
- "optional": true
- },
- "boom": {
- "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
- "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
- "dev": true
- },
- "brace-expansion": {
- "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
- "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k="
- },
- "braces": {
- "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true
- },
- "browser-resolve": {
- "version": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
- "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
- "dev": true,
- "dependencies": {
- "resolve": {
- "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
- "dev": true
- }
- }
- },
- "bser": {
- "version": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz",
- "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=",
- "dev": true
- },
- "builtin-modules": {
- "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
- "dev": true
- },
- "callsites": {
- "version": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
- "dev": true
- },
- "camelcase": {
- "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true,
- "optional": true
- },
- "caseless": {
- "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "center-align": {
- "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "dev": true,
- "optional": true
- },
- "chalk": {
- "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true
- },
- "ci-info": {
- "version": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz",
- "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=",
- "dev": true
- },
- "cliui": {
- "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "dev": true,
- "optional": true,
- "dependencies": {
- "wordwrap": {
- "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "dev": true,
- "optional": true
- }
- }
- },
- "co": {
- "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
- "dev": true
- },
- "code-point-at": {
- "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
- },
- "color-convert": {
- "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz",
- "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=",
- "dev": true
- },
- "color-name": {
- "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz",
- "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=",
- "dev": true
- },
- "colors": {
- "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
- "dev": true
- },
- "combined-stream": {
- "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
- "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
- "dev": true
- },
- "commander": {
- "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
- "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q="
- },
- "concat-map": {
- "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "content-type-parser": {
- "version": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz",
- "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=",
- "dev": true
- },
- "convert-source-map": {
- "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
- "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
- "dev": true
- },
- "core-js": {
- "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
- "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
- "dev": true
- },
- "cross-spawn": {
- "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
- "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
- "dev": true
- },
- "cryptiles": {
- "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
- "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
- "dev": true
- },
- "cssom": {
- "version": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
- "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
- "dev": true
- },
- "cssstyle": {
- "version": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
- "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
- "dev": true
- },
- "dashdash": {
- "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "dependencies": {
- "assert-plus": {
- "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "debug": {
- "version": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
- "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
- "dev": true
- },
- "decamelize": {
- "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "deep-is": {
- "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "default-require-extensions": {
- "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
- "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
- "dev": true
- },
- "delayed-stream": {
- "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "detect-indent": {
- "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true
- },
- "diff": {
- "version": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
- "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
- "dev": true
- },
- "ecc-jsbn": {
- "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "dev": true,
- "optional": true
- },
- "errno": {
- "version": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz",
- "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=",
- "dev": true
- },
- "error-ex": {
- "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
- "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "escodegen": {
- "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
- "dev": true,
- "dependencies": {
- "esprima": {
- "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
- "dev": true
- },
- "source-map": {
- "version": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
- "dev": true,
- "optional": true
- }
- }
- },
- "esprima": {
- "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
- },
- "estraverse": {
- "version": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
- "dev": true
- },
- "esutils": {
- "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "exec-sh": {
- "version": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz",
- "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=",
- "dev": true
- },
- "execa": {
- "version": "https://registry.npmjs.org/execa/-/execa-0.5.1.tgz",
- "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=",
- "dev": true
- },
- "expand-brackets": {
- "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true
- },
- "expand-range": {
- "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true
- },
- "extend": {
- "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
- "dev": true
- },
- "extglob": {
- "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true
- },
- "extsprintf": {
- "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
- "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fb-watchman": {
- "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz",
- "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=",
- "dev": true
- },
- "filename-regex": {
- "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true
- },
- "fileset": {
- "version": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
- "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
- "dev": true
- },
- "fill-range": {
- "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "dev": true
- },
- "find-up": {
- "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true
- },
- "for-in": {
- "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "dev": true
- },
- "forever-agent": {
- "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
- "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
- "dev": true
- },
- "fs-extra": {
- "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
- "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
- "dev": true
- },
- "fs.realpath": {
- "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "get-caller-file": {
- "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
- "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
- "dev": true
- },
- "get-stream": {
- "version": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
- "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
- "dev": true
- },
- "getpass": {
- "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "dependencies": {
- "assert-plus": {
- "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "glob": {
- "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU="
- },
- "glob-all": {
- "version": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz",
- "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=",
- "dev": true,
- "dependencies": {
- "minimist": {
- "version": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz",
- "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=",
- "dev": true
- },
- "yargs": {
- "version": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz",
- "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=",
- "dev": true
- }
- }
- },
- "glob-base": {
- "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true
- },
- "glob-parent": {
- "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true
- },
- "globals": {
- "version": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz",
- "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=",
- "dev": true
- },
- "graceful-fs": {
- "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
- "dev": true
- },
- "graceful-readlink": {
- "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
- },
- "growly": {
- "version": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
- "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
- "dev": true
- },
- "handlebars": {
- "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz",
- "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=",
- "dev": true,
- "dependencies": {
- "async": {
- "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- },
- "source-map": {
- "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "dev": true
- }
- }
- },
- "har-schema": {
- "version": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
- "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
- "dev": true
- },
- "har-validator": {
- "version": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
- "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
- "dev": true
- },
- "has-ansi": {
- "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true
- },
- "has-flag": {
- "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
- "dev": true
- },
- "hawk": {
- "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
- "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
- "dev": true
- },
- "hoek": {
- "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
- "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
- "dev": true
- },
- "home-or-tmp": {
- "version": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
- "dev": true
- },
- "hosted-git-info": {
- "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz",
- "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=",
- "dev": true
- },
- "html-encoding-sniffer": {
- "version": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz",
- "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=",
- "dev": true
- },
- "http-signature": {
- "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
- "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
- "dev": true
- },
- "iconv-lite": {
- "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
- "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=",
- "dev": true
- },
- "inflight": {
- "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
- },
- "inherits": {
- "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "invariant": {
- "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
- "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
- "dev": true
- },
- "invert-kv": {
- "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
- "dev": true
- },
- "is-arrayish": {
- "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true
- },
- "is-buffer": {
- "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
- "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
- "dev": true
- },
- "is-builtin-module": {
- "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
- "dev": true
- },
- "is-ci": {
- "version": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz",
- "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=",
- "dev": true
- },
- "is-dotfile": {
- "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
- "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=",
- "dev": true
- },
- "is-equal-shallow": {
- "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "dev": true
- },
- "is-extendable": {
- "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-finite": {
- "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true
- },
- "is-glob": {
- "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true
- },
- "is-number": {
- "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true
- },
- "is-posix-bracket": {
- "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "dev": true
- },
- "is-primitive": {
- "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "dev": true
- },
- "is-stream": {
- "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
- },
- "is-typedarray": {
- "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-utf8": {
- "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "isarray": {
- "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true
- },
- "isstream": {
- "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "istanbul-api": {
- "version": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.8.tgz",
- "integrity": "sha1-qETlXG+a7uKS5/QpQhlvYLI9yT4=",
- "dev": true
- },
- "istanbul-lib-coverage": {
- "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz",
- "integrity": "sha1-ysoZ3srvNSW11jMdcB8/O3rUhSg=",
- "dev": true
- },
- "istanbul-lib-hook": {
- "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.6.tgz",
- "integrity": "sha1-wIZtHoHPLVMZJJUQEx/Bbe5JIx8=",
- "dev": true
- },
- "istanbul-lib-instrument": {
- "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz",
- "integrity": "sha1-Fp4xvGLHeIUamUOd2Zw8wSGE02A=",
- "dev": true
- },
- "istanbul-lib-report": {
- "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.0.tgz",
- "integrity": "sha1-RExOzKmvqTz1hPVrEPGVv3aMB3A=",
- "dev": true,
- "dependencies": {
- "supports-color": {
- "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
- "dev": true
- }
- }
- },
- "istanbul-lib-source-maps": {
- "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.0.tgz",
- "integrity": "sha1-jHcG1Jfib+62rz4MKP1bBmlZjQ4=",
- "dev": true
- },
- "istanbul-reports": {
- "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.0.tgz",
- "integrity": "sha1-HvO3lYiSGc+1+tFjZfbOEI1fjGY=",
- "dev": true
- },
- "jest": {
- "version": "https://registry.npmjs.org/jest/-/jest-20.0.3.tgz",
- "integrity": "sha1-5P0FTE8RcKEWoAdh2kz9tz8c3DM=",
- "dev": true,
- "dependencies": {
- "jest-cli": {
- "version": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.3.tgz",
- "integrity": "sha1-/ojdu3qfOhbQ7VUzmgokJPfw02E=",
- "dev": true
- }
- }
- },
- "jest-changed-files": {
- "version": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz",
- "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=",
- "dev": true
- },
- "jest-config": {
- "version": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.3.tgz",
- "integrity": "sha1-qTTyfup2SRWAHN2ib2+O7CrHkmY=",
- "dev": true
- },
- "jest-diff": {
- "version": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz",
- "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=",
- "dev": true
- },
- "jest-docblock": {
- "version": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz",
- "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=",
- "dev": true
- },
- "jest-environment-jsdom": {
- "version": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz",
- "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=",
- "dev": true
- },
- "jest-environment-node": {
- "version": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz",
- "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=",
- "dev": true
- },
- "jest-haste-map": {
- "version": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.3.tgz",
- "integrity": "sha1-Y3fVN+rzTrX3USGmkcrj/egrqXE=",
- "dev": true
- },
- "jest-jasmine2": {
- "version": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.3.tgz",
- "integrity": "sha1-GMTp0CnaftGucnxVMABk0aBUKXQ=",
- "dev": true
- },
- "jest-matcher-utils": {
- "version": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz",
- "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=",
- "dev": true
- },
- "jest-matchers": {
- "version": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz",
- "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=",
- "dev": true
- },
- "jest-message-util": {
- "version": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz",
- "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=",
- "dev": true
- },
- "jest-mock": {
- "version": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz",
- "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=",
- "dev": true
- },
- "jest-regex-util": {
- "version": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz",
- "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=",
- "dev": true
- },
- "jest-resolve": {
- "version": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.3.tgz",
- "integrity": "sha1-N1MHqkD3hTLUD/ixfVMAsVGfjdQ=",
- "dev": true
- },
- "jest-resolve-dependencies": {
- "version": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz",
- "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=",
- "dev": true
- },
- "jest-runtime": {
- "version": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.3.tgz",
- "integrity": "sha1-3d0iu8Qp4m5qltGs1GylVxSwklI=",
- "dev": true,
- "dependencies": {
- "strip-bom": {
- "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- }
- }
- },
- "jest-snapshot": {
- "version": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz",
- "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=",
- "dev": true
- },
- "jest-util": {
- "version": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz",
- "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=",
- "dev": true
- },
- "jest-validate": {
- "version": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz",
- "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=",
- "dev": true
- },
- "jodid25519": {
- "version": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
- "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=",
- "dev": true,
- "optional": true
- },
- "js-tokens": {
- "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
- "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=",
- "dev": true
- },
- "js-yaml": {
- "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz",
- "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=",
- "dev": true
- },
- "jsbn": {
- "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true,
- "optional": true
- },
- "jsdom": {
- "version": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
- "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=",
- "dev": true
- },
- "jsesc": {
- "version": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- },
- "json-schema": {
- "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-stable-stringify": {
- "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "json5": {
- "version": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "jsonfile": {
- "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.0.tgz",
- "integrity": "sha1-kufHRE5f/V+jLmqa6LhQNN+DR9A=",
- "dev": true
- },
- "jsonify": {
- "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
- "dev": true
- },
- "jsprim": {
- "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
- "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
- "dev": true,
- "dependencies": {
- "assert-plus": {
- "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "kind-of": {
- "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true
- },
- "lazy-cache": {
- "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "dev": true,
- "optional": true
- },
- "lcid": {
- "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "dev": true
- },
- "leven": {
- "version": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
- "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
- "dev": true
- },
- "levn": {
- "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true
- },
- "load-json-file": {
- "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dev": true
- },
- "locate-path": {
- "version": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true
- },
- "lodash": {
- "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
- "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
- "dev": true
- },
- "longest": {
- "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
- "dev": true
- },
- "loose-envify": {
- "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
- "dev": true
- },
- "lru-cache": {
- "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz",
- "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=",
- "dev": true
- },
- "make-error": {
- "version": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz",
- "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=",
- "dev": true
- },
- "makeerror": {
- "version": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
- "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
- "dev": true
- },
- "mem": {
- "version": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
- "dev": true
- },
- "merge": {
- "version": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
- "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=",
- "dev": true
- },
- "micromatch": {
- "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true
- },
- "mime-db": {
- "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
- "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=",
- "dev": true
- },
- "mime-types": {
- "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
- "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
- "dev": true
- },
- "mimic-fn": {
- "version": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
- "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
- "dev": true
- },
- "minimatch": {
- "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM="
- },
- "minimist": {
- "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- },
- "mkdirp": {
- "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "dev": true
- },
- "ms": {
- "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "natural-compare": {
- "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "node-int64": {
- "version": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
- "dev": true
- },
- "node-notifier": {
- "version": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz",
- "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=",
- "dev": true
- },
- "normalize-package-data": {
- "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz",
- "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=",
- "dev": true
- },
- "normalize-path": {
- "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true
- },
- "npm-run-path": {
- "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "dev": true
- },
- "number-is-nan": {
- "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
- },
- "nwmatcher": {
- "version": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.0.tgz",
- "integrity": "sha1-tDiTYhcOfvl5jDx3FtgOvAEG/M8=",
- "dev": true
- },
- "oauth-sign": {
- "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
- "dev": true
- },
- "object-assign": {
- "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "object.omit": {
- "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "dev": true
- },
- "once": {
- "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
- },
- "optimist": {
- "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "dev": true
- },
- "optionator": {
- "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "dev": true,
- "dependencies": {
- "wordwrap": {
- "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
- }
- }
- },
- "os-homedir": {
- "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-locale": {
- "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dev": true
- },
- "os-tmpdir": {
- "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
- },
- "p-finally": {
- "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true
- },
- "p-limit": {
- "version": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
- "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
- "dev": true
- },
- "p-locate": {
- "version": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true
- },
- "p-map": {
- "version": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz",
- "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=",
- "dev": true
- },
- "parse-glob": {
- "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "dev": true
- },
- "parse-json": {
- "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true
- },
- "parse5": {
- "version": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
- "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
- "dev": true
- },
- "path-exists": {
- "version": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-key": {
- "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
- },
- "path-parse": {
- "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
- "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
- "dev": true
- },
- "path-type": {
- "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dev": true
- },
- "performance-now": {
- "version": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
- "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
- "dev": true
- },
- "pify": {
- "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "pinkie": {
- "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "dev": true
- },
- "pinkie-promise": {
- "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "dev": true
- },
- "pkg-dir": {
- "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
- "dev": true
- },
- "prelude-ls": {
- "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "preserve": {
- "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true
- },
- "pretty-format": {
- "version": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz",
- "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=",
- "dev": true,
- "dependencies": {
- "ansi-styles": {
- "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.0.0.tgz",
- "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=",
- "dev": true
- }
- }
- },
- "private": {
- "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
- "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
- "dev": true
- },
- "prr": {
- "version": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
- "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=",
- "dev": true
- },
- "pseudomap": {
- "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
- "dev": true
- },
- "punycode": {
- "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- },
- "qs": {
- "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
- "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
- "dev": true
- },
- "randomatic": {
- "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
- "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=",
- "dev": true
- },
- "read-pkg": {
- "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dev": true
- },
- "read-pkg-up": {
- "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "dependencies": {
- "find-up": {
- "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true
- },
- "path-exists": {
- "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dev": true
- }
- }
- },
- "regenerator-runtime": {
- "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
- "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
- "dev": true
- },
- "regex-cache": {
- "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
- "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
- "dev": true
- },
- "remove-trailing-separator": {
- "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz",
- "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=",
- "dev": true
- },
- "repeat-element": {
- "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
- "dev": true
- },
- "repeat-string": {
- "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "repeating": {
- "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true
- },
- "request": {
- "version": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
- "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
- "dev": true
- },
- "require-directory": {
- "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
- },
- "require-main-filename": {
- "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
- "dev": true
- },
- "resolve": {
- "version": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz",
- "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=",
- "dev": true
- },
- "right-align": {
- "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "dev": true,
- "optional": true
- },
- "rimraf": {
- "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
- "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
- "dev": true
- },
- "safe-buffer": {
- "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
- "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
- "dev": true
- },
- "sane": {
- "version": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz",
- "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=",
- "dev": true,
- "dependencies": {
- "bser": {
- "version": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz",
- "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=",
- "dev": true
- },
- "fb-watchman": {
- "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz",
- "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=",
- "dev": true
- },
- "minimist": {
- "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- }
- }
- },
- "sax": {
- "version": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz",
- "integrity": "sha1-/YYxojvHgmvvXYcb24c3jJVkeCg=",
- "dev": true
- },
- "semver": {
- "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
- "dev": true
- },
- "set-blocking": {
- "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "shellwords": {
- "version": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz",
- "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=",
- "dev": true
- },
- "signal-exit": {
- "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
- },
- "slash": {
- "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- },
- "sntp": {
- "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
- "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
- "dev": true
- },
- "source-map": {
- "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
- "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
- "dev": true
- },
- "source-map-support": {
- "version": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz",
- "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=",
- "dev": true
- },
- "spdx-correct": {
- "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
- "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
- "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
- "dev": true
- },
- "spdx-license-ids": {
- "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
- "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
- "dev": true
- },
- "sprintf-js": {
- "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "sshpk": {
- "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz",
- "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=",
- "dev": true,
- "dependencies": {
- "assert-plus": {
- "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "string-length": {
- "version": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz",
- "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=",
- "dev": true
- },
- "string-width": {
- "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true
- },
- "stringstream": {
- "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
- "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
- "dev": true
- },
- "strip-ansi": {
- "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true
- },
- "strip-bom": {
- "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true
- },
- "strip-eof": {
- "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
- "dev": true
- },
- "strip-json-comments": {
- "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- },
- "supports-color": {
- "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "symbol-tree": {
- "version": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
- "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
- "dev": true
- },
- "test-exclude": {
- "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.0.tgz",
- "integrity": "sha1-BMpwtzkN04yY1KADoXOAbKeZHJE=",
- "dev": true
- },
- "throat": {
- "version": "https://registry.npmjs.org/throat/-/throat-3.0.0.tgz",
- "integrity": "sha1-58ZMhny7OEXxCHdkL3tgBVuOwNY=",
- "dev": true
- },
- "tmpl": {
- "version": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
- "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
- "dev": true
- },
- "to-fast-properties": {
- "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- },
- "tough-cookie": {
- "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
- "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
- "dev": true
- },
- "tr46": {
- "version": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
- "dev": true
- },
- "trim-right": {
- "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
- },
- "ts-jest": {
- "version": "https://registry.npmjs.org/ts-jest/-/ts-jest-20.0.4.tgz",
- "integrity": "sha1-/+OYfUjIdizXtq6DUY0gPsoWdhg=",
- "dev": true,
- "dependencies": {
- "camelcase": {
- "version": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- },
- "cliui": {
- "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "dev": true,
- "dependencies": {
- "string-width": {
- "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true
- }
- }
- },
- "load-json-file": {
- "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "dev": true
- },
- "os-locale": {
- "version": "https://registry.npmjs.org/os-locale/-/os-locale-2.0.0.tgz",
- "integrity": "sha1-FZGN7VEFIrge565aMJ1U9jn8OaQ=",
- "dev": true
- },
- "path-type": {
- "version": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "dev": true
- },
- "read-pkg": {
- "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "dev": true
- },
- "read-pkg-up": {
- "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "dev": true
- },
- "string-width": {
- "version": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
- "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=",
- "dev": true,
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- }
- }
- },
- "strip-bom": {
- "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "which-module": {
- "version": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "yargs": {
- "version": "https://registry.npmjs.org/yargs/-/yargs-8.0.1.tgz",
- "integrity": "sha1-Qg73XoQMFFeoCtzKm8b6OEneUao=",
- "dev": true
- },
- "yargs-parser": {
- "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
- "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
- "dev": true
- }
- }
- },
- "ts-node": {
- "version": "https://registry.npmjs.org/ts-node/-/ts-node-3.0.4.tgz",
- "integrity": "sha1-oUdevyT9Ti7i+6ixqhYFuXe95QY=",
- "dev": true,
- "dependencies": {
- "minimist": {
- "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- }
- }
- },
- "tsconfig": {
- "version": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz",
- "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=",
- "dev": true,
- "dependencies": {
- "strip-bom": {
- "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- }
- }
- },
- "tslib": {
- "version": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz",
- "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=",
- "dev": true
- },
- "tslint": {
- "version": "https://registry.npmjs.org/tslint/-/tslint-5.3.2.tgz",
- "integrity": "sha1-5WRZ+wlacwfxA7hAUhdPXju+9u0=",
- "dev": true
- },
- "tsutils": {
- "version": "https://registry.npmjs.org/tsutils/-/tsutils-2.0.0.tgz",
- "integrity": "sha1-rgykiktDG1wE5PcRqSJ6ouN+LgQ=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true
- },
- "tweetnacl": {
- "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true,
- "optional": true
- },
- "type-check": {
- "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true
- },
- "typescript": {
- "version": "https://registry.npmjs.org/typescript/-/typescript-2.3.3.tgz",
- "integrity": "sha1-ljnzw7QBSOjKl/4IpR3RiRu2viI="
- },
- "uglify-js": {
- "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.27.tgz",
- "integrity": "sha1-R3h/kSsPJC5bmENDvo416V9pTJw=",
- "dev": true,
- "optional": true,
- "dependencies": {
- "yargs": {
- "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "dev": true,
- "optional": true
- }
- }
- },
- "uglify-to-browserify": {
- "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "dev": true,
- "optional": true
- },
- "universalify": {
- "version": "https://registry.npmjs.org/universalify/-/universalify-0.1.0.tgz",
- "integrity": "sha1-nrHEZR3rzGcMyU8adXYjMruWd3g=",
- "dev": true
- },
- "user-home": {
- "version": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
- "dev": true
- },
- "uuid": {
- "version": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
- "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=",
- "dev": true
- },
- "v8flags": {
- "version": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
- "dev": true
- },
- "validate-npm-package-license": {
- "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
- "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
- "dev": true
- },
- "verror": {
- "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
- "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
- "dev": true
- },
- "walker": {
- "version": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
- "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
- "dev": true
- },
- "watch": {
- "version": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz",
- "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=",
- "dev": true
- },
- "webidl-conversions": {
- "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz",
- "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=",
- "dev": true
- },
- "whatwg-encoding": {
- "version": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz",
- "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=",
- "dev": true
- },
- "whatwg-url": {
- "version": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
- "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=",
- "dev": true,
- "dependencies": {
- "webidl-conversions": {
- "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
- "dev": true
- }
- }
- },
- "which": {
- "version": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
- "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
- "dev": true
- },
- "which-module": {
- "version": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
- "dev": true
- },
- "window-size": {
- "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true,
- "optional": true
- },
- "wordwrap": {
- "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
- "dev": true
- },
- "worker-farm": {
- "version": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.3.1.tgz",
- "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=",
- "dev": true
- },
- "wrap-ansi": {
- "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true
- },
- "wrappy": {
- "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "xml-name-validator": {
- "version": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
- "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=",
- "dev": true
- },
- "xtend": {
- "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
- },
- "y18n": {
- "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
- },
- "yallist": {
- "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
- "dev": true
- },
- "yargs": {
- "version": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
- "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
- "dev": true,
- "dependencies": {
- "camelcase": {
- "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- },
- "cliui": {
- "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "dev": true
- }
- }
- },
- "yargs-parser": {
- "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
- "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
- "dev": true,
- "dependencies": {
- "camelcase": {
- "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- }
- }
- },
- "yn": {
- "version": "https://registry.npmjs.org/yn/-/yn-1.3.0.tgz",
- "integrity": "sha1-GwgSq7jYBdSJZvjfOF3J2syaGdg=",
- "dev": true
- }
- }
-}
diff --git a/package.json b/package.json
index fa67c9d..55994ac 100644
--- a/package.json
+++ b/package.json
@@ -1,50 +1,60 @@
{
- "name": "react-js-to-ts",
- "version": "1.2.0",
- "description": "Convert React code from JavaScript to TypeScript",
- "main": "dist/index.js",
- "scripts": {
- "pretest": "npm run build",
- "test": "jest",
- "coverage": "jest --coverage",
- "posttest": "npm run lint",
- "prelint": "npm run clean",
- "lint": "tslint --type-check --project tsconfig.json --format codeFrame --exclude test/**/*.tsx",
- "prepublish": "npm run build",
- "clean": "rm -rf dist",
- "prebuild": "npm run clean",
- "build": "tsc --pretty"
- },
- "jest": {
- "mapCoverage": true,
- "transform": {
- ".ts": "/node_modules/ts-jest/preprocessor.js"
+ "name": "react-js-to-ts",
+ "version": "1.4.0",
+ "description": "Convert React code from JavaScript to TypeScript",
+ "main": "dist/index.js",
+ "scripts": {
+ "pretest": "npm run build",
+ "test": "jest",
+ "coverage": "jest --coverage",
+ "posttest": "npm run lint",
+ "prelint": "npm run clean",
+ "lint": "tslint --project tsconfig.json --format codeFrame --exclude test/**/*.tsx",
+ "prepublish": "npm run build",
+ "clean": "rm -rf dist",
+ "prebuild": "npm run clean",
+ "build": "tsc --pretty",
+ "precommit": "lint-staged",
+ "prettier": "prettier --write *.{js,json,css,md,ts,tsx}"
},
- "testRegex": "test/runner.ts",
- "moduleFileExtensions": [
- "ts",
- "js"
- ]
- },
- "bin": "dist/cli.js",
- "author": "Mohsen Azimi ",
- "license": "Apache-2.0",
- "dependencies": {
- "chalk": "^1.1.3",
- "commander": "^2.10.0",
- "glob": "^7.1.2",
- "typescript": "^2.4.0"
- },
- "devDependencies": {
- "@types/chalk": "^0.4.31",
- "@types/commander": "^2.9.1",
- "@types/glob": "^5.0.30",
- "@types/jest": "^20.0.2",
- "@types/node": "^8.0.2",
- "@types/react": "^15.0.31",
- "jest": "^20.0.4",
- "ts-jest": "^20.0.6",
- "ts-node": "^3.1.0",
- "tslint": "^5.2.0"
- }
+ "jest": {
+ "transform": {
+ ".ts": "/node_modules/ts-jest/preprocessor.js"
+ },
+ "testRegex": "(/tests/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
+ "moduleFileExtensions": ["ts", "js"]
+ },
+ "lint-staged": {
+ "*.{js,json,css,md,ts,tsx}": ["node_modules/.bin/prettier --write", "git add"]
+ },
+ "bin": "dist/cli.js",
+ "author": "Mohsen Azimi ",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "commander": "^2.15.1",
+ "detect-indent": "^5.0.0",
+ "glob": "^7.1.2",
+ "lodash": "^4.17.10",
+ "prettier": "^1.12.1",
+ "typescript": "2.8.3"
+ },
+ "devDependencies": {
+ "@types/chalk": "^2.2.0",
+ "@types/commander": "^2.9.1",
+ "@types/detect-indent": "^5.0.0",
+ "@types/glob": "^5.0.35",
+ "@types/jest": "^22.2.3",
+ "@types/lodash": "^4.14.109",
+ "@types/node": "^10.1.2",
+ "@types/prettier": "^1.12.2",
+ "@types/react": "^16.3.14",
+ "dedent": "^0.7.0",
+ "husky": "^0.14.3",
+ "jest": "^22.4.4",
+ "lint-staged": "^7.1.1",
+ "ts-jest": "^22.4.6",
+ "ts-node": "^6.0.3",
+ "tslint": "^5.10.0"
+ }
}
diff --git a/src/cli.ts b/src/cli.ts
index 42ba40e..779f0a9 100644
--- a/src/cli.ts
+++ b/src/cli.ts
@@ -4,31 +4,95 @@ import * as program from 'commander';
import * as glob from 'glob';
import * as fs from 'fs';
import * as path from 'path';
+import * as prettier from 'prettier';
import { run } from '.';
+import { CompilationOptions } from './compiler';
+
+function resolveGlobs(globPatterns: string[]): string[] {
+ const files: string[] = [];
+ function addFile(file: string) {
+ file = path.resolve(file);
+ if (files.indexOf(file) === -1) {
+ files.push(file);
+ }
+ }
+ globPatterns.forEach(pattern => {
+ if (/[{}*?+\[\]]/.test(pattern)) {
+ // Smells like globs
+ glob.sync(pattern, {}).forEach(file => {
+ addFile(file);
+ });
+ } else {
+ addFile(pattern);
+ }
+ });
+ return files;
+}
program
.version('1.0.0')
+ .option('--arrow-parens ', 'Include parentheses around a sole arrow function parameter.', 'avoid')
+ .option('--no-bracket-spacing', 'Do not print spaces between brackets.', false)
+ .option('--jsx-bracket-same-line', 'Put > on the last line instead of at a new line.', false)
+ .option('--print-width ', 'The line length where Prettier will try wrap.', 80)
+ .option('--prose-wrap How to wrap prose. (markdown)', 'preserve')
+ .option('--no-semi', 'Do not print semicolons, except at the beginning of lines which may need them', false)
+ .option('--single-quote', 'Use single quotes instead of double quotes.', false)
+ .option('--tab-width ', 'Number of spaces per indentation level.', 2)
+ .option('--trailing-comma ', 'Print trailing commas wherever possible when multi-line.', 'none')
+ .option('--use-tabs', 'Indent with tabs instead of spaces.', false)
+ .option('--ignore-prettier-errors', 'Ignore (but warn about) errors in Prettier', false)
+ .option('--keep-original-files', 'Keep original files', false)
+ .option('--keep-temporary-files', 'Keep temporary files', false)
.usage('[options] ')
- .command('* ')
- .action((globPattern) => {
- if (!globPattern) {
- throw new Error('You must provide a file name or glob pattern to transform');
+ .command('* [glob/filename...]')
+ .action((globPatterns: string[]) => {
+ const prettierOptions: prettier.Options = {
+ arrowParens: program.arrowParens,
+ bracketSpacing: !program.noBracketSpacing,
+ jsxBracketSameLine: !!program.jsxBracketSameLine,
+ printWidth: parseInt(program.printWidth, 10),
+ proseWrap: program.proseWrap,
+ semi: !program.noSemi,
+ singleQuote: !!program.singleQuote,
+ tabWidth: parseInt(program.tabWidth, 10),
+ trailingComma: program.trailingComma,
+ useTabs: !!program.useTabs,
+ };
+ const compilationOptions: CompilationOptions = {
+ ignorePrettierErrors: !!program.ignorePrettierErrors,
+ };
+ const files = resolveGlobs(globPatterns);
+ if (!files.length) {
+ throw new Error('Nothing to do. You must provide file names or glob patterns to transform.');
}
- const files = glob.sync(globPattern, {});
- for (const file of files) {
- const filePath = path.resolve(file);
+ let errors = false;
+ for (const filePath of files) {
+ console.log(`Transforming ${filePath}...`);
const newPath = filePath.replace(/\.jsx?$/, '.tsx');
-
+ const temporaryPath = filePath.replace(/\.jsx?$/, `_js2ts_${+new Date()}.tsx`);
try {
- fs.renameSync(filePath, newPath);
- const result = run(newPath);
+ fs.copyFileSync(filePath, temporaryPath);
+ const result = run(temporaryPath, prettierOptions, compilationOptions);
fs.writeFileSync(newPath, result);
- } catch(error) {
- console.warn(`Failed to convert ${file}`);
+ if (!program.keepOriginalFiles) {
+ fs.unlinkSync(filePath);
+ }
+ } catch (error) {
+ console.warn(`Failed to convert ${filePath}`);
console.warn(error);
+ errors = true;
+ }
+ if (!program.keepTemporaryFiles) {
+ if (fs.existsSync(temporaryPath)) {
+ fs.unlinkSync(temporaryPath);
+ }
}
}
+ if (errors) {
+ process.exit(1);
+ }
});
program.parse(process.argv);
diff --git a/src/compiler.ts b/src/compiler.ts
index 6b5b0d9..4953a7c 100644
--- a/src/compiler.ts
+++ b/src/compiler.ts
@@ -1,20 +1,43 @@
+import * as os from 'os';
+import * as fs from 'fs';
import * as ts from 'typescript';
-import * as chalk from 'chalk';
+import chalk from 'chalk';
+import * as _ from 'lodash';
+import * as prettier from 'prettier';
+import * as detectIndent from 'detect-indent';
import { TransformFactoryFactory } from '.';
+export interface CompilationOptions {
+ ignorePrettierErrors: boolean;
+}
+
+const DEFAULT_COMPILATION_OPTIONS: CompilationOptions = {
+ ignorePrettierErrors: false,
+};
+
+export { DEFAULT_COMPILATION_OPTIONS };
+
/**
* Compile and return result TypeScript
* @param filePath Path to file to compile
*/
-export function compile(filePath: string, factoryFactories: TransformFactoryFactory[]) {
+export function compile(
+ filePath: string,
+ factoryFactories: TransformFactoryFactory[],
+ incomingPrettierOptions: prettier.Options = {},
+ compilationOptions: CompilationOptions = DEFAULT_COMPILATION_OPTIONS,
+) {
const compilerOptions: ts.CompilerOptions = {
target: ts.ScriptTarget.ES2017,
module: ts.ModuleKind.ES2015,
};
const program = ts.createProgram([filePath], compilerOptions);
- const sourceFiles = program.getSourceFiles().filter(sf => !sf.isDeclarationFile);
+ // `program.getSourceFiles()` will include those imported files,
+ // like: `import * as a from './file-a'`.
+ // We should only transform current file.
+ const sourceFiles = program.getSourceFiles().filter(sf => sf.fileName === filePath);
const typeChecker = program.getTypeChecker();
const result = ts.transform(
@@ -22,21 +45,96 @@ export function compile(filePath: string, factoryFactories: TransformFactoryFact
factoryFactories.map(factoryFactory => factoryFactory(typeChecker), compilerOptions),
);
-
if (result.diagnostics && result.diagnostics.length) {
- console.log(chalk.yellow(`
+ console.log(
+ chalk.yellow(`
======================= Diagnostics for ${filePath} =======================
- `));
+ `),
+ );
for (const diag of result.diagnostics) {
if (diag.file && diag.start) {
const pos = diag.file.getLineAndCharacterOfPosition(diag.start);
- console.log(`(${pos.line}, ${pos.character}) ${diag.messageText}`)
+ console.log(`(${pos.line}, ${pos.character}) ${diag.messageText}`);
}
}
}
- const printer = ts.createPrinter()
+ const printer = ts.createPrinter();
// TODO: fix the index 0 access... What if program have multiple source files?
- return printer.printNode(ts.EmitHint.SourceFile, result.transformed[0], sourceFiles[0]);
+ const printed = printer.printNode(ts.EmitHint.SourceFile, result.transformed[0], sourceFiles[0]);
+
+ const inputSource = fs.readFileSync(filePath, 'utf-8');
+ const prettierOptions = getPrettierOptions(filePath, inputSource, incomingPrettierOptions);
+
+ try {
+ return prettier.format(printed, prettierOptions);
+ } catch (prettierError) {
+ if (compilationOptions.ignorePrettierErrors) {
+ console.warn(`Prettier failed for ${filePath} (ignorePrettierErrors is on):`);
+ console.warn(prettierError);
+ return printed;
+ }
+ throw prettierError;
+ }
+}
+
+/**
+ * Get Prettier options based on style of a JavaScript
+ * @param filePath Path to source file
+ * @param source Body of a JavaScript
+ * @param options Existing prettier option
+ */
+export function getPrettierOptions(filePath: string, source: string, options: prettier.Options): prettier.Options {
+ const resolvedOptions = prettier.resolveConfig.sync(filePath);
+ if (resolvedOptions) {
+ _.defaults(resolvedOptions, options);
+ return resolvedOptions;
+ }
+ const { amount: indentAmount, type: indentType } = detectIndent(source);
+ const sourceWidth = getCodeWidth(source, 80);
+ const semi = getUseOfSemi(source);
+ const quotations = getQuotation(source);
+
+ _.defaults(Object.assign({}, options), {
+ tabWidth: indentAmount,
+ useTabs: indentType && indentType === 'tab',
+ printWidth: sourceWidth,
+ semi,
+ singleQuote: quotations === 'single',
+ });
+
+ return options;
+}
+
+/**
+ * Given body of a source file, return its code width
+ * @param source
+ */
+function getCodeWidth(source: string, defaultWidth: number): number {
+ return source.split(os.EOL).reduce((result, line) => Math.max(result, line.length), defaultWidth);
+}
+
+/**
+ * Detect if a source file is using semicolon
+ * @todo: use an actual parser. This is not a proper implementation
+ * @param source
+ * @return true if code is using semicolons
+ */
+function getUseOfSemi(source: string): boolean {
+ return source.indexOf(';') !== -1;
+}
+
+/**
+ * Detect if a source file is using single quotes or double quotes
+ * @todo use an actual parser. This is not a proper implementation
+ * @param source
+ */
+function getQuotation(source: string): 'single' | 'double' {
+ const numberOfSingleQuotes = (source.match(/\'/g) || []).length;
+ const numberOfDoubleQuotes = (source.match(/\"/g) || []).length;
+ if (numberOfSingleQuotes > numberOfDoubleQuotes) {
+ return 'single';
+ }
+ return 'double';
}
diff --git a/src/helpers/build-prop-type-interface.ts b/src/helpers/build-prop-type-interface.ts
new file mode 100644
index 0000000..df0730a
--- /dev/null
+++ b/src/helpers/build-prop-type-interface.ts
@@ -0,0 +1,188 @@
+import * as ts from 'typescript';
+
+/**
+ * Build props interface from propTypes object
+ * @example
+ * {
+ * foo: React.PropTypes.string.isRequired
+ * }
+ *
+ * becomes
+ * {
+ * foo: string;
+ * }
+ * @param objectLiteral
+ */
+export function buildInterfaceFromPropTypeObjectLiteral(objectLiteral: ts.ObjectLiteralExpression) {
+ const members = objectLiteral.properties
+ // We only need to process PropertyAssignment:
+ // {
+ // a: 123 // PropertyAssignment
+ // }
+ //
+ // filter out:
+ // {
+ // a() {}, // MethodDeclaration
+ // b, // ShorthandPropertyAssignment
+ // ...c, // SpreadAssignment
+ // get d() {}, // AccessorDeclaration
+ // }
+ .filter(ts.isPropertyAssignment)
+ // Ignore children, React types have it
+ .filter(property => property.name.getText() !== 'children')
+ .map(propertyAssignment => {
+ const name = propertyAssignment.name.getText();
+ const initializer = propertyAssignment.initializer;
+ const isRequired = isPropTypeRequired(initializer);
+ const typeExpression = isRequired
+ ? // We have guaranteed the type in `isPropTypeRequired()`
+ (initializer as ts.PropertyAccessExpression).expression
+ : initializer;
+ const typeValue = getTypeFromReactPropTypeExpression(typeExpression);
+
+ return ts.createPropertySignature(
+ [],
+ name,
+ isRequired ? undefined : ts.createToken(ts.SyntaxKind.QuestionToken),
+ typeValue,
+ undefined,
+ );
+ });
+
+ return ts.createTypeLiteralNode(members);
+}
+
+/**
+ * Turns React.PropTypes.* into TypeScript type value
+ *
+ * @param node React propTypes value
+ */
+function getTypeFromReactPropTypeExpression(node: ts.Expression): ts.TypeNode {
+ let result = null;
+ if (ts.isPropertyAccessExpression(node)) {
+ /**
+ * PropTypes.array,
+ * PropTypes.bool,
+ * PropTypes.func,
+ * PropTypes.number,
+ * PropTypes.object,
+ * PropTypes.string,
+ * PropTypes.symbol, (ignore)
+ * PropTypes.node,
+ * PropTypes.element,
+ * PropTypes.any,
+ */
+ const text = node.getText().replace(/React\.PropTypes\./, '');
+
+ if (/string/.test(text)) {
+ result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
+ } else if (/any/.test(text)) {
+ result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
+ } else if (/array/.test(text)) {
+ result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
+ } else if (/bool/.test(text)) {
+ result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);
+ } else if (/number/.test(text)) {
+ result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);
+ } else if (/object/.test(text)) {
+ result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword);
+ } else if (/node/.test(text)) {
+ result = ts.createTypeReferenceNode('React.ReactNode', []);
+ } else if (/element/.test(text)) {
+ result = ts.createTypeReferenceNode('JSX.Element', []);
+ } else if (/func/.test(text)) {
+ const arrayOfAny = ts.createParameter(
+ [],
+ [],
+ ts.createToken(ts.SyntaxKind.DotDotDotToken),
+ 'args',
+ undefined,
+ ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)),
+ undefined,
+ );
+ result = ts.createFunctionTypeNode([], [arrayOfAny], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
+ }
+ } else if (ts.isCallExpression(node)) {
+ /**
+ * PropTypes.instanceOf(), (ignore)
+ * PropTypes.oneOf(), // only support oneOf([1, 2]), oneOf(['a', 'b'])
+ * PropTypes.oneOfType(),
+ * PropTypes.arrayOf(),
+ * PropTypes.objectOf(),
+ * PropTypes.shape(),
+ */
+ const text = node.expression.getText();
+ if (/oneOf$/.test(text)) {
+ const argument = node.arguments[0];
+ if (ts.isArrayLiteralExpression(argument)) {
+ if (argument.elements.every(elm => ts.isStringLiteral(elm) || ts.isNumericLiteral(elm))) {
+ result = ts.createUnionTypeNode(
+ (argument.elements as ts.NodeArray).map(elm =>
+ ts.createLiteralTypeNode(elm),
+ ),
+ );
+ }
+ }
+ } else if (/oneOfType$/.test(text)) {
+ const argument = node.arguments[0];
+ if (ts.isArrayLiteralExpression(argument)) {
+ result = ts.createUnionOrIntersectionTypeNode(
+ ts.SyntaxKind.UnionType,
+ argument.elements.map(elm => getTypeFromReactPropTypeExpression(elm)),
+ );
+ }
+ } else if (/arrayOf$/.test(text)) {
+ const argument = node.arguments[0];
+ if (argument) {
+ result = ts.createArrayTypeNode(getTypeFromReactPropTypeExpression(argument));
+ }
+ } else if (/objectOf$/.test(text)) {
+ const argument = node.arguments[0];
+ if (argument) {
+ result = ts.createTypeLiteralNode([
+ ts.createIndexSignature(
+ undefined,
+ undefined,
+ [
+ ts.createParameter(
+ undefined,
+ undefined,
+ undefined,
+ 'key',
+ undefined,
+ ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
+ ),
+ ],
+ getTypeFromReactPropTypeExpression(argument),
+ ),
+ ]);
+ }
+ } else if (/shape$/.test(text)) {
+ const argument = node.arguments[0];
+ if (ts.isObjectLiteralExpression(argument)) {
+ return buildInterfaceFromPropTypeObjectLiteral(argument);
+ }
+ }
+ }
+
+ /**
+ * customProp,
+ * anything others
+ */
+ if (result === null) {
+ result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
+ }
+
+ return result;
+}
+
+/**
+ * Decide if node is required
+ * @param node React propTypes member node
+ */
+function isPropTypeRequired(node: ts.Expression) {
+ if (!ts.isPropertyAccessExpression(node)) return false;
+
+ const text = node.getText().replace(/React\.PropTypes\./, '');
+ return /\.isRequired/.test(text);
+}
diff --git a/src/helpers/index.ts b/src/helpers/index.ts
index 42e54e4..04a2c29 100644
--- a/src/helpers/index.ts
+++ b/src/helpers/index.ts
@@ -1,7 +1,7 @@
import * as ts from 'typescript';
-import * as kinds from './isKind';
+import * as _ from 'lodash';
-export * from './isKind';
+export * from './build-prop-type-interface';
/**
* If a class declaration a react class?
@@ -52,10 +52,12 @@ export function isReactComponent(classDeclaration: ts.ClassDeclaration, typeChec
* @param clause
*/
export function isReactHeritageClause(clause: ts.HeritageClause) {
- return clause.token === ts.SyntaxKind.ExtendsKeyword &&
+ return (
+ clause.token === ts.SyntaxKind.ExtendsKeyword &&
clause.types.length === 1 &&
- kinds.isExpressionWithTypeArguments(clause.types[0]) &&
- /Component/.test(clause.types[0].expression.getText());
+ ts.isExpressionWithTypeArguments(clause.types[0]) &&
+ /Component/.test(clause.types[0].expression.getText())
+ );
}
/**
@@ -65,11 +67,13 @@ export function isReactHeritageClause(clause: ts.HeritageClause) {
* @param statement
*/
export function isReactPropTypeAssignmentStatement(statement: ts.Statement): statement is ts.ExpressionStatement {
- return kinds.isExpressionStatement(statement)
- && kinds.isBinaryExpression(statement.expression)
- && statement.expression.operatorToken.kind === ts.SyntaxKind.FirstAssignment
- && kinds.isPropertyAccessExpression(statement.expression.left)
- && /\.propTypes$|\.propTypes\..+$/.test(statement.expression.left.getText())
+ return (
+ ts.isExpressionStatement(statement) &&
+ ts.isBinaryExpression(statement.expression) &&
+ statement.expression.operatorToken.kind === ts.SyntaxKind.FirstAssignment &&
+ ts.isPropertyAccessExpression(statement.expression.left) &&
+ /\.propTypes$|\.propTypes\..+$/.test(statement.expression.left.getText())
+ );
}
/**
@@ -80,7 +84,7 @@ export function hasStaticModifier(classMember: ts.ClassElement) {
if (!classMember.modifiers) {
return false;
}
- const staticModifier = find(classMember.modifiers, (modifier) => {
+ const staticModifier = _.find(classMember.modifiers, modifier => {
return modifier.kind == ts.SyntaxKind.StaticKeyword;
});
return staticModifier !== undefined;
@@ -93,43 +97,61 @@ export function hasStaticModifier(classMember: ts.ClassElement) {
*/
export function isPropTypesMember(classMember: ts.ClassElement, sourceFile: ts.SourceFile) {
try {
- return classMember.name !== undefined && classMember.name.getFullText(sourceFile) !== 'propTypes'
+ const name =
+ classMember.name !== undefined && ts.isIdentifier(classMember.name) ? classMember.name.escapedText : null;
+ return name === 'propTypes';
} catch (e) {
return false;
}
}
-// TODO: replace following functions with Lodash?
-// ---------------------------------------------------------------------------------------------------------
-
/**
- * Find an item in a collection with a matcher
- * @param collection
- * @param matcher
+ * Get component name off of a propType assignment statement
+ * @param propTypeAssignment
+ * @param sourceFile
*/
-export function find(collection: T[], matcher: (item: T) => boolean): T | undefined {
- for (const item of collection) {
- if (matcher(item)) { return item; }
- }
-
- return undefined;
+export function getComponentName(propTypeAssignment: ts.Statement, sourceFile: ts.SourceFile) {
+ const text = propTypeAssignment.getText(sourceFile);
+ return text.substr(0, text.indexOf('.'));
}
/**
- * Look in a collection and see if collection has a specific item
- * @param collection
- * @param matcher
+ * Convert react stateless function to arrow function
+ * @example
+ * Before:
+ * function Hello(message) {
+ * return {message}
+ * }
+ *
+ * After:
+ * const Hello = message => {
+ * return {message}
+ * }
*/
-export function has(collection: T[], matcher: (item: T) => boolean): boolean {
- if (!collection || !collection.length) {
- return false;
- }
-
- for (const item of collection) {
- if (matcher(item)) { return true; }
- }
-
- return false;
+export function convertReactStatelessFunctionToArrowFunction(
+ statelessFunc: ts.FunctionDeclaration | ts.VariableStatement,
+) {
+ if (ts.isVariableStatement(statelessFunc)) return statelessFunc;
+
+ const funcName = statelessFunc.name || 'Component';
+ const funcBody = statelessFunc.body || ts.createBlock([]);
+
+ const initializer = ts.createArrowFunction(
+ undefined,
+ undefined,
+ statelessFunc.parameters,
+ undefined,
+ undefined,
+ funcBody,
+ );
+
+ return ts.createVariableStatement(
+ statelessFunc.modifiers,
+ ts.createVariableDeclarationList(
+ [ts.createVariableDeclaration(funcName, undefined, initializer)],
+ ts.NodeFlags.Const,
+ ),
+ );
}
/**
@@ -138,10 +160,12 @@ export function has(collection: T[], matcher: (item: T) => boolean): boolean
* @param afterItem
* @param newItem
*/
-export function insertAfter(collection: T[], afterItem: T, newItem: T) {
- const index = collection.indexOf(afterItem) + 1;
+export function insertAfter(collection: ArrayLike, afterItem: T, newItem: T) {
+ const index = _.indexOf(collection, afterItem) + 1;
- return collection.slice(0, index).concat(newItem).concat(collection.slice(index));
+ return _.slice(collection, 0, index)
+ .concat(newItem)
+ .concat(_.slice(collection, index));
}
/**
@@ -150,10 +174,12 @@ export function insertAfter(collection: T[], afterItem: T, newItem: T) {
* @param beforeItem
* @param newItem
*/
-export function insertBefore(collection: T[], beforeItem: T, newItem: T) {
- const index = collection.indexOf(beforeItem);
+export function insertBefore(collection: ArrayLike, beforeItem: T, newItems: T | T[]) {
+ const index = _.indexOf(collection, beforeItem);
- return collection.slice(0, index).concat(newItem).concat(collection.slice(index));
+ return _.slice(collection, 0, index)
+ .concat(newItems)
+ .concat(_.slice(collection, index));
}
/**
@@ -162,10 +188,11 @@ export function insertBefore(collection: T[], beforeItem: T, newItem: T) {
* @param item
* @param newItem
*/
-export function replaceItem(collection: T[], item: T, newItem: T) {
- const index = collection.indexOf(item);
-
- return collection.slice(0, index).concat(newItem).concat(collection.slice(index + 1));
+export function replaceItem(collection: ArrayLike, item: T, newItem: T) {
+ const index = _.indexOf(collection, item);
+ return _.slice(collection, 0, index)
+ .concat(newItem)
+ .concat(_.slice(collection, index + 1));
}
/**
@@ -174,8 +201,7 @@ export function replaceItem(collection: T[], item: T, newItem: T) {
* @param item
* @param newItem
*/
-export function removeItem(collection: T[], item: T) {
- const index = collection.indexOf(item);
-
- return collection.slice(0, index).concat(collection.slice(index + 1));
+export function removeItem(collection: ArrayLike, item: T) {
+ const index = _.indexOf(collection, item);
+ return _.slice(collection, 0, index).concat(_.slice(collection, index + 1));
}
diff --git a/src/helpers/isKind.ts b/src/helpers/isKind.ts
deleted file mode 100644
index 8756ad9..0000000
--- a/src/helpers/isKind.ts
+++ /dev/null
@@ -1,1185 +0,0 @@
-import * as ts from 'typescript';
-
-/**
- * Return true if node is `EndOfFileToken`
- * @param node A TypeScript node
- */
-export function isEndOfFileToken(node: ts.Node): node is ts.EndOfFileToken {
- return node.kind === ts.SyntaxKind.EndOfFileToken;
-}
-
-/**
- * Return true if node is `NumericLiteral`
- * @param node A TypeScript node
- */
-export function isNumericLiteral(node: ts.Node): node is ts.NumericLiteral {
- return node.kind === ts.SyntaxKind.NumericLiteral;
-}
-
-/**
- * Return true if node is `StringLiteral`
- * @param node A TypeScript node
- */
-export function isStringLiteral(node: ts.Node): node is ts.StringLiteral {
- return node.kind === ts.SyntaxKind.StringLiteral;
-}
-
-/**
- * Return true if node is `JsxText`
- * @param node A TypeScript node
- */
-export function isJsxText(node: ts.Node): node is ts.JsxText {
- return node.kind === ts.SyntaxKind.JsxText;
-}
-
-/**
- * Return true if node is `RegularExpressionLiteral`
- * @param node A TypeScript node
- */
-export function isRegularExpressionLiteral(node: ts.Node): node is ts.RegularExpressionLiteral {
- return node.kind === ts.SyntaxKind.RegularExpressionLiteral;
-}
-
-/**
- * Return true if node is `NoSubstitutionTemplateLiteral`
- * @param node A TypeScript node
- */
-export function isNoSubstitutionTemplateLiteral(node: ts.Node): node is ts.NoSubstitutionTemplateLiteral {
- return node.kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral;
-}
-
-/**
- * Return true if node is `TemplateHead`
- * @param node A TypeScript node
- */
-export function isTemplateHead(node: ts.Node): node is ts.TemplateHead {
- return node.kind === ts.SyntaxKind.TemplateHead;
-}
-
-/**
- * Return true if node is `TemplateMiddle`
- * @param node A TypeScript node
- */
-export function isTemplateMiddle(node: ts.Node): node is ts.TemplateMiddle {
- return node.kind === ts.SyntaxKind.TemplateMiddle;
-}
-
-/**
- * Return true if node is `TemplateTail`
- * @param node A TypeScript node
- */
-export function isTemplateTail(node: ts.Node): node is ts.TemplateTail {
- return node.kind === ts.SyntaxKind.TemplateTail;
-}
-
-/**
- * Return true if node is `DotDotDotToken`
- * @param node A TypeScript node
- */
-export function isDotDotDotToken(node: ts.Node): node is ts.DotDotDotToken {
- return node.kind === ts.SyntaxKind.DotDotDotToken;
-}
-
-/**
- * Return true if node is `EqualsGreaterThanToken`
- * @param node A TypeScript node
- */
-export function isEqualsGreaterThanToken(node: ts.Node): node is ts.EqualsGreaterThanToken {
- return node.kind === ts.SyntaxKind.EqualsGreaterThanToken;
-}
-
-/**
- * Return true if node is `AsteriskToken`
- * @param node A TypeScript node
- */
-export function isAsteriskToken(node: ts.Node): node is ts.AsteriskToken {
- return node.kind === ts.SyntaxKind.AsteriskToken;
-}
-
-/**
- * Return true if node is `QuestionToken`
- * @param node A TypeScript node
- */
-export function isQuestionToken(node: ts.Node): node is ts.QuestionToken {
- return node.kind === ts.SyntaxKind.QuestionToken;
-}
-
-/**
- * Return true if node is `ColonToken`
- * @param node A TypeScript node
- */
-export function isColonToken(node: ts.Node): node is ts.ColonToken {
- return node.kind === ts.SyntaxKind.ColonToken;
-}
-
-/**
- * Return true if node is `AtToken`
- * @param node A TypeScript node
- */
-export function isAtToken(node: ts.Node): node is ts.AtToken {
- return node.kind === ts.SyntaxKind.AtToken;
-}
-
-/**
- * Return true if node is `EqualsToken`
- * @param node A TypeScript node
- */
-export function isEqualsToken(node: ts.Node): node is ts.EqualsToken {
- return node.kind === ts.SyntaxKind.EqualsToken;
-}
-
-/**
- * Return true if node is `Identifier`
- * @param node A TypeScript node
- */
-export function isIdentifier(node: ts.Node): node is ts.Identifier {
- return node.kind === ts.SyntaxKind.Identifier;
-}
-
-/**
- * Return true if node is `QualifiedName`
- * @param node A TypeScript node
- */
-export function isQualifiedName(node: ts.Node): node is ts.QualifiedName {
- return node.kind === ts.SyntaxKind.QualifiedName;
-}
-
-/**
- * Return true if node is `ComputedPropertyName`
- * @param node A TypeScript node
- */
-export function isComputedPropertyName(node: ts.Node): node is ts.ComputedPropertyName {
- return node.kind === ts.SyntaxKind.ComputedPropertyName;
-}
-
-/**
- * Return true if node is `Decorator`
- * @param node A TypeScript node
- */
-export function isDecorator(node: ts.Node): node is ts.Decorator {
- return node.kind === ts.SyntaxKind.Decorator;
-}
-
-/**
- * Return true if node is `PropertySignature`
- * @param node A TypeScript node
- */
-export function isPropertySignature(node: ts.Node): node is ts.PropertySignature {
- return node.kind === ts.SyntaxKind.PropertySignature;
-}
-
-/**
- * Return true if node is `PropertyDeclaration`
- * @param node A TypeScript node
- */
-export function isPropertyDeclaration(node: ts.Node): node is ts.PropertyDeclaration {
- return node.kind === ts.SyntaxKind.PropertyDeclaration;
-}
-
-/**
- * Return true if node is `MethodSignature`
- * @param node A TypeScript node
- */
-export function isMethodSignature(node: ts.Node): node is ts.MethodSignature {
- return node.kind === ts.SyntaxKind.MethodSignature;
-}
-
-/**
- * Return true if node is `MethodDeclaration`
- * @param node A TypeScript node
- */
-export function isMethodDeclaration(node: ts.Node): node is ts.MethodDeclaration {
- return node.kind === ts.SyntaxKind.MethodDeclaration;
-}
-
-/**
- * Return true if node is `ObjectBindingPattern`
- * @param node A TypeScript node
- */
-export function isObjectBindingPattern(node: ts.Node): node is ts.ObjectBindingPattern {
- return node.kind === ts.SyntaxKind.ObjectBindingPattern;
-}
-
-/**
- * Return true if node is `ArrayBindingPattern`
- * @param node A TypeScript node
- */
-export function isArrayBindingPattern(node: ts.Node): node is ts.ArrayBindingPattern {
- return node.kind === ts.SyntaxKind.ArrayBindingPattern;
-}
-
-/**
- * Return true if node is `BindingElement`
- * @param node A TypeScript node
- */
-export function isBindingElement(node: ts.Node): node is ts.BindingElement {
- return node.kind === ts.SyntaxKind.BindingElement;
-}
-
-/**
- * Return true if node is `ArrayLiteralExpression`
- * @param node A TypeScript node
- */
-export function isArrayLiteralExpression(node: ts.Node): node is ts.ArrayLiteralExpression {
- return node.kind === ts.SyntaxKind.ArrayLiteralExpression;
-}
-
-/**
- * Return true if node is `ObjectLiteralExpression`
- * @param node A TypeScript node
- */
-export function isObjectLiteralExpression(node: ts.Node): node is ts.ObjectLiteralExpression {
- return node.kind === ts.SyntaxKind.ObjectLiteralExpression;
-}
-
-/**
- * Return true if node is `PropertyAccessExpression`
- * @param node A TypeScript node
- */
-export function isPropertyAccessExpression(node: ts.Node): node is ts.PropertyAccessExpression {
- return node.kind === ts.SyntaxKind.PropertyAccessExpression;
-}
-
-/**
- * Return true if node is `ElementAccessExpression`
- * @param node A TypeScript node
- */
-export function isElementAccessExpression(node: ts.Node): node is ts.ElementAccessExpression {
- return node.kind === ts.SyntaxKind.ElementAccessExpression;
-}
-
-/**
- * Return true if node is `CallExpression`
- * @param node A TypeScript node
- */
-export function isCallExpression(node: ts.Node): node is ts.CallExpression {
- return node.kind === ts.SyntaxKind.CallExpression;
-}
-
-/**
- * Return true if node is `NewExpression`
- * @param node A TypeScript node
- */
-export function isNewExpression(node: ts.Node): node is ts.NewExpression {
- return node.kind === ts.SyntaxKind.NewExpression;
-}
-
-/**
- * Return true if node is `TaggedTemplateExpression`
- * @param node A TypeScript node
- */
-export function isTaggedTemplateExpression(node: ts.Node): node is ts.TaggedTemplateExpression {
- return node.kind === ts.SyntaxKind.TaggedTemplateExpression;
-}
-
-/**
- * Return true if node is `ParenthesizedExpression`
- * @param node A TypeScript node
- */
-export function isParenthesizedExpression(node: ts.Node): node is ts.ParenthesizedExpression {
- return node.kind === ts.SyntaxKind.ParenthesizedExpression;
-}
-
-/**
- * Return true if node is `FunctionExpression`
- * @param node A TypeScript node
- */
-export function isFunctionExpression(node: ts.Node): node is ts.FunctionExpression {
- return node.kind === ts.SyntaxKind.FunctionExpression;
-}
-
-/**
- * Return true if node is `ArrowFunction`
- * @param node A TypeScript node
- */
-export function isArrowFunction(node: ts.Node): node is ts.ArrowFunction {
- return node.kind === ts.SyntaxKind.ArrowFunction;
-}
-
-/**
- * Return true if node is `DeleteExpression`
- * @param node A TypeScript node
- */
-export function isDeleteExpression(node: ts.Node): node is ts.DeleteExpression {
- return node.kind === ts.SyntaxKind.DeleteExpression;
-}
-
-/**
- * Return true if node is `TypeOfExpression`
- * @param node A TypeScript node
- */
-export function isTypeOfExpression(node: ts.Node): node is ts.TypeOfExpression {
- return node.kind === ts.SyntaxKind.TypeOfExpression;
-}
-
-/**
- * Return true if node is `VoidExpression`
- * @param node A TypeScript node
- */
-export function isVoidExpression(node: ts.Node): node is ts.VoidExpression {
- return node.kind === ts.SyntaxKind.VoidExpression;
-}
-
-/**
- * Return true if node is `AwaitExpression`
- * @param node A TypeScript node
- */
-export function isAwaitExpression(node: ts.Node): node is ts.AwaitExpression {
- return node.kind === ts.SyntaxKind.AwaitExpression;
-}
-
-/**
- * Return true if node is `PrefixUnaryExpression`
- * @param node A TypeScript node
- */
-export function isPrefixUnaryExpression(node: ts.Node): node is ts.PrefixUnaryExpression {
- return node.kind === ts.SyntaxKind.PrefixUnaryExpression;
-}
-
-/**
- * Return true if node is `PostfixUnaryExpression`
- * @param node A TypeScript node
- */
-export function isPostfixUnaryExpression(node: ts.Node): node is ts.PostfixUnaryExpression {
- return node.kind === ts.SyntaxKind.PostfixUnaryExpression;
-}
-
-/**
- * Return true if node is `BinaryExpression`
- * @param node A TypeScript node
- */
-export function isBinaryExpression(node: ts.Node): node is ts.BinaryExpression {
- return node.kind === ts.SyntaxKind.BinaryExpression;
-}
-
-/**
- * Return true if node is `ConditionalExpression`
- * @param node A TypeScript node
- */
-export function isConditionalExpression(node: ts.Node): node is ts.ConditionalExpression {
- return node.kind === ts.SyntaxKind.ConditionalExpression;
-}
-
-/**
- * Return true if node is `TemplateExpression`
- * @param node A TypeScript node
- */
-export function isTemplateExpression(node: ts.Node): node is ts.TemplateExpression {
- return node.kind === ts.SyntaxKind.TemplateExpression;
-}
-
-/**
- * Return true if node is `YieldExpression`
- * @param node A TypeScript node
- */
-export function isYieldExpression(node: ts.Node): node is ts.YieldExpression {
- return node.kind === ts.SyntaxKind.YieldExpression;
-}
-
-/**
- * Return true if node is `SpreadElement`
- * @param node A TypeScript node
- */
-export function isSpreadElement(node: ts.Node): node is ts.SpreadElement {
- return node.kind === ts.SyntaxKind.SpreadElement;
-}
-
-/**
- * Return true if node is `ClassExpression`
- * @param node A TypeScript node
- */
-export function isClassExpression(node: ts.Node): node is ts.ClassExpression {
- return node.kind === ts.SyntaxKind.ClassExpression;
-}
-
-/**
- * Return true if node is `OmittedExpression`
- * @param node A TypeScript node
- */
-export function isOmittedExpression(node: ts.Node): node is ts.OmittedExpression {
- return node.kind === ts.SyntaxKind.OmittedExpression;
-}
-
-/**
- * Return true if node is `ExpressionWithTypeArguments`
- * @param node A TypeScript node
- */
-export function isExpressionWithTypeArguments(node: ts.Node): node is ts.ExpressionWithTypeArguments {
- return node.kind === ts.SyntaxKind.ExpressionWithTypeArguments;
-}
-
-/**
- * Return true if node is `AsExpression`
- * @param node A TypeScript node
- */
-export function isAsExpression(node: ts.Node): node is ts.AsExpression {
- return node.kind === ts.SyntaxKind.AsExpression;
-}
-
-/**
- * Return true if node is `NonNullExpression`
- * @param node A TypeScript node
- */
-export function isNonNullExpression(node: ts.Node): node is ts.NonNullExpression {
- return node.kind === ts.SyntaxKind.NonNullExpression;
-}
-
-/**
- * Return true if node is `MetaProperty`
- * @param node A TypeScript node
- */
-export function isMetaProperty(node: ts.Node): node is ts.MetaProperty {
- return node.kind === ts.SyntaxKind.MetaProperty;
-}
-
-/**
- * Return true if node is `TemplateSpan`
- * @param node A TypeScript node
- */
-export function isTemplateSpan(node: ts.Node): node is ts.TemplateSpan {
- return node.kind === ts.SyntaxKind.TemplateSpan;
-}
-
-/**
- * Return true if node is `SemicolonClassElement`
- * @param node A TypeScript node
- */
-export function isSemicolonClassElement(node: ts.Node): node is ts.SemicolonClassElement {
- return node.kind === ts.SyntaxKind.SemicolonClassElement;
-}
-
-/**
- * Return true if node is `Block`
- * @param node A TypeScript node
- */
-export function isBlock(node: ts.Node): node is ts.Block {
- return node.kind === ts.SyntaxKind.Block;
-}
-
-/**
- * Return true if node is `VariableStatement`
- * @param node A TypeScript node
- */
-export function isVariableStatement(node: ts.Node): node is ts.VariableStatement {
- return node.kind === ts.SyntaxKind.VariableStatement;
-}
-
-/**
- * Return true if node is `EmptyStatement`
- * @param node A TypeScript node
- */
-export function isEmptyStatement(node: ts.Node): node is ts.EmptyStatement {
- return node.kind === ts.SyntaxKind.EmptyStatement;
-}
-
-/**
- * Return true if node is `ExpressionStatement`
- * @param node A TypeScript node
- */
-export function isExpressionStatement(node: ts.Node): node is ts.ExpressionStatement {
- return node.kind === ts.SyntaxKind.ExpressionStatement;
-}
-
-/**
- * Return true if node is `IfStatement`
- * @param node A TypeScript node
- */
-export function isIfStatement(node: ts.Node): node is ts.IfStatement {
- return node.kind === ts.SyntaxKind.IfStatement;
-}
-
-/**
- * Return true if node is `DoStatement`
- * @param node A TypeScript node
- */
-export function isDoStatement(node: ts.Node): node is ts.DoStatement {
- return node.kind === ts.SyntaxKind.DoStatement;
-}
-
-/**
- * Return true if node is `WhileStatement`
- * @param node A TypeScript node
- */
-export function isWhileStatement(node: ts.Node): node is ts.WhileStatement {
- return node.kind === ts.SyntaxKind.WhileStatement;
-}
-
-/**
- * Return true if node is `ForStatement`
- * @param node A TypeScript node
- */
-export function isForStatement(node: ts.Node): node is ts.ForStatement {
- return node.kind === ts.SyntaxKind.ForStatement;
-}
-
-/**
- * Return true if node is `ForInStatement`
- * @param node A TypeScript node
- */
-export function isForInStatement(node: ts.Node): node is ts.ForInStatement {
- return node.kind === ts.SyntaxKind.ForInStatement;
-}
-
-/**
- * Return true if node is `ForOfStatement`
- * @param node A TypeScript node
- */
-export function isForOfStatement(node: ts.Node): node is ts.ForOfStatement {
- return node.kind === ts.SyntaxKind.ForOfStatement;
-}
-
-/**
- * Return true if node is `ContinueStatement`
- * @param node A TypeScript node
- */
-export function isContinueStatement(node: ts.Node): node is ts.ContinueStatement {
- return node.kind === ts.SyntaxKind.ContinueStatement;
-}
-
-/**
- * Return true if node is `BreakStatement`
- * @param node A TypeScript node
- */
-export function isBreakStatement(node: ts.Node): node is ts.BreakStatement {
- return node.kind === ts.SyntaxKind.BreakStatement;
-}
-
-/**
- * Return true if node is `ReturnStatement`
- * @param node A TypeScript node
- */
-export function isReturnStatement(node: ts.Node): node is ts.ReturnStatement {
- return node.kind === ts.SyntaxKind.ReturnStatement;
-}
-
-/**
- * Return true if node is `WithStatement`
- * @param node A TypeScript node
- */
-export function isWithStatement(node: ts.Node): node is ts.WithStatement {
- return node.kind === ts.SyntaxKind.WithStatement;
-}
-
-/**
- * Return true if node is `SwitchStatement`
- * @param node A TypeScript node
- */
-export function isSwitchStatement(node: ts.Node): node is ts.SwitchStatement {
- return node.kind === ts.SyntaxKind.SwitchStatement;
-}
-
-/**
- * Return true if node is `LabeledStatement`
- * @param node A TypeScript node
- */
-export function isLabeledStatement(node: ts.Node): node is ts.LabeledStatement {
- return node.kind === ts.SyntaxKind.LabeledStatement;
-}
-
-/**
- * Return true if node is `ThrowStatement`
- * @param node A TypeScript node
- */
-export function isThrowStatement(node: ts.Node): node is ts.ThrowStatement {
- return node.kind === ts.SyntaxKind.ThrowStatement;
-}
-
-/**
- * Return true if node is `TryStatement`
- * @param node A TypeScript node
- */
-export function isTryStatement(node: ts.Node): node is ts.TryStatement {
- return node.kind === ts.SyntaxKind.TryStatement;
-}
-
-/**
- * Return true if node is `DebuggerStatement`
- * @param node A TypeScript node
- */
-export function isDebuggerStatement(node: ts.Node): node is ts.DebuggerStatement {
- return node.kind === ts.SyntaxKind.DebuggerStatement;
-}
-
-/**
- * Return true if node is `VariableDeclaration`
- * @param node A TypeScript node
- */
-export function isVariableDeclaration(node: ts.Node): node is ts.VariableDeclaration {
- return node.kind === ts.SyntaxKind.VariableDeclaration;
-}
-
-/**
- * Return true if node is `VariableDeclarationList`
- * @param node A TypeScript node
- */
-export function isVariableDeclarationList(node: ts.Node): node is ts.VariableDeclarationList {
- return node.kind === ts.SyntaxKind.VariableDeclarationList;
-}
-
-/**
- * Return true if node is `FunctionDeclaration`
- * @param node A TypeScript node
- */
-export function isFunctionDeclaration(node: ts.Node): node is ts.FunctionDeclaration {
- return node.kind === ts.SyntaxKind.FunctionDeclaration;
-}
-
-/**
- * Return true if node is `ClassDeclaration`
- * @param node A TypeScript node
- */
-export function isClassDeclaration(node: ts.Node): node is ts.ClassDeclaration {
- return node.kind === ts.SyntaxKind.ClassDeclaration;
-}
-
-/**
- * Return true if node is `InterfaceDeclaration`
- * @param node A TypeScript node
- */
-export function isInterfaceDeclaration(node: ts.Node): node is ts.InterfaceDeclaration {
- return node.kind === ts.SyntaxKind.InterfaceDeclaration;
-}
-
-/**
- * Return true if node is `TypeAliasDeclaration`
- * @param node A TypeScript node
- */
-export function isTypeAliasDeclaration(node: ts.Node): node is ts.TypeAliasDeclaration {
- return node.kind === ts.SyntaxKind.TypeAliasDeclaration;
-}
-
-/**
- * Return true if node is `EnumDeclaration`
- * @param node A TypeScript node
- */
-export function isEnumDeclaration(node: ts.Node): node is ts.EnumDeclaration {
- return node.kind === ts.SyntaxKind.EnumDeclaration;
-}
-
-/**
- * Return true if node is `ModuleDeclaration`
- * @param node A TypeScript node
- */
-export function isModuleDeclaration(node: ts.Node): node is ts.ModuleDeclaration {
- return node.kind === ts.SyntaxKind.ModuleDeclaration;
-}
-
-/**
- * Return true if node is `ModuleBlock`
- * @param node A TypeScript node
- */
-export function isModuleBlock(node: ts.Node): node is ts.ModuleBlock {
- return node.kind === ts.SyntaxKind.ModuleBlock;
-}
-
-/**
- * Return true if node is `CaseBlock`
- * @param node A TypeScript node
- */
-export function isCaseBlock(node: ts.Node): node is ts.CaseBlock {
- return node.kind === ts.SyntaxKind.CaseBlock;
-}
-
-/**
- * Return true if node is `NamespaceExportDeclaration`
- * @param node A TypeScript node
- */
-export function isNamespaceExportDeclaration(node: ts.Node): node is ts.NamespaceExportDeclaration {
- return node.kind === ts.SyntaxKind.NamespaceExportDeclaration;
-}
-
-/**
- * Return true if node is `ImportEqualsDeclaration`
- * @param node A TypeScript node
- */
-export function isImportEqualsDeclaration(node: ts.Node): node is ts.ImportEqualsDeclaration {
- return node.kind === ts.SyntaxKind.ImportEqualsDeclaration;
-}
-
-/**
- * Return true if node is `ImportDeclaration`
- * @param node A TypeScript node
- */
-export function isImportDeclaration(node: ts.Node): node is ts.ImportDeclaration {
- return node.kind === ts.SyntaxKind.ImportDeclaration;
-}
-
-/**
- * Return true if node is `ImportClause`
- * @param node A TypeScript node
- */
-export function isImportClause(node: ts.Node): node is ts.ImportClause {
- return node.kind === ts.SyntaxKind.ImportClause;
-}
-
-/**
- * Return true if node is `NamespaceImport`
- * @param node A TypeScript node
- */
-export function isNamespaceImport(node: ts.Node): node is ts.NamespaceImport {
- return node.kind === ts.SyntaxKind.NamespaceImport;
-}
-
-/**
- * Return true if node is `NamedImports`
- * @param node A TypeScript node
- */
-export function isNamedImports(node: ts.Node): node is ts.NamedImports {
- return node.kind === ts.SyntaxKind.NamedImports;
-}
-
-/**
- * Return true if node is `ImportSpecifier`
- * @param node A TypeScript node
- */
-export function isImportSpecifier(node: ts.Node): node is ts.ImportSpecifier {
- return node.kind === ts.SyntaxKind.ImportSpecifier;
-}
-
-/**
- * Return true if node is `ExportAssignment`
- * @param node A TypeScript node
- */
-export function isExportAssignment(node: ts.Node): node is ts.ExportAssignment {
- return node.kind === ts.SyntaxKind.ExportAssignment;
-}
-
-/**
- * Return true if node is `ExportDeclaration`
- * @param node A TypeScript node
- */
-export function isExportDeclaration(node: ts.Node): node is ts.ExportDeclaration {
- return node.kind === ts.SyntaxKind.ExportDeclaration;
-}
-
-/**
- * Return true if node is `NamedExports`
- * @param node A TypeScript node
- */
-export function isNamedExports(node: ts.Node): node is ts.NamedExports {
- return node.kind === ts.SyntaxKind.NamedExports;
-}
-
-/**
- * Return true if node is `ExportSpecifier`
- * @param node A TypeScript node
- */
-export function isExportSpecifier(node: ts.Node): node is ts.ExportSpecifier {
- return node.kind === ts.SyntaxKind.ExportSpecifier;
-}
-
-/**
- * Return true if node is `MissingDeclaration`
- * @param node A TypeScript node
- */
-export function isMissingDeclaration(node: ts.Node): node is ts.MissingDeclaration {
- return node.kind === ts.SyntaxKind.MissingDeclaration;
-}
-
-/**
- * Return true if node is `ExternalModuleReference`
- * @param node A TypeScript node
- */
-export function isExternalModuleReference(node: ts.Node): node is ts.ExternalModuleReference {
- return node.kind === ts.SyntaxKind.ExternalModuleReference;
-}
-
-/**
- * Return true if node is `JsxElement`
- * @param node A TypeScript node
- */
-export function isJsxElement(node: ts.Node): node is ts.JsxElement {
- return node.kind === ts.SyntaxKind.JsxElement;
-}
-
-/**
- * Return true if node is `JsxSelfClosingElement`
- * @param node A TypeScript node
- */
-export function isJsxSelfClosingElement(node: ts.Node): node is ts.JsxSelfClosingElement {
- return node.kind === ts.SyntaxKind.JsxSelfClosingElement;
-}
-
-/**
- * Return true if node is `JsxOpeningElement`
- * @param node A TypeScript node
- */
-export function isJsxOpeningElement(node: ts.Node): node is ts.JsxOpeningElement {
- return node.kind === ts.SyntaxKind.JsxOpeningElement;
-}
-
-/**
- * Return true if node is `JsxClosingElement`
- * @param node A TypeScript node
- */
-export function isJsxClosingElement(node: ts.Node): node is ts.JsxClosingElement {
- return node.kind === ts.SyntaxKind.JsxClosingElement;
-}
-
-/**
- * Return true if node is `JsxAttribute`
- * @param node A TypeScript node
- */
-export function isJsxAttribute(node: ts.Node): node is ts.JsxAttribute {
- return node.kind === ts.SyntaxKind.JsxAttribute;
-}
-
-/**
- * Return true if node is `JsxAttributes`
- * @param node A TypeScript node
- */
-export function isJsxAttributes(node: ts.Node): node is ts.JsxAttributes {
- return node.kind === ts.SyntaxKind.JsxAttributes;
-}
-
-/**
- * Return true if node is `JsxSpreadAttribute`
- * @param node A TypeScript node
- */
-export function isJsxSpreadAttribute(node: ts.Node): node is ts.JsxSpreadAttribute {
- return node.kind === ts.SyntaxKind.JsxSpreadAttribute;
-}
-
-/**
- * Return true if node is `JsxExpression`
- * @param node A TypeScript node
- */
-export function isJsxExpression(node: ts.Node): node is ts.JsxExpression {
- return node.kind === ts.SyntaxKind.JsxExpression;
-}
-
-/**
- * Return true if node is `CaseClause`
- * @param node A TypeScript node
- */
-export function isCaseClause(node: ts.Node): node is ts.CaseClause {
- return node.kind === ts.SyntaxKind.CaseClause;
-}
-
-/**
- * Return true if node is `DefaultClause`
- * @param node A TypeScript node
- */
-export function isDefaultClause(node: ts.Node): node is ts.DefaultClause {
- return node.kind === ts.SyntaxKind.DefaultClause;
-}
-
-/**
- * Return true if node is `HeritageClause`
- * @param node A TypeScript node
- */
-export function isHeritageClause(node: ts.Node): node is ts.HeritageClause {
- return node.kind === ts.SyntaxKind.HeritageClause;
-}
-
-/**
- * Return true if node is `CatchClause`
- * @param node A TypeScript node
- */
-export function isCatchClause(node: ts.Node): node is ts.CatchClause {
- return node.kind === ts.SyntaxKind.CatchClause;
-}
-
-/**
- * Return true if node is `PropertyAssignment`
- * @param node A TypeScript node
- */
-export function isPropertyAssignment(node: ts.Node): node is ts.PropertyAssignment {
- return node.kind === ts.SyntaxKind.PropertyAssignment;
-}
-
-/**
- * Return true if node is `ShorthandPropertyAssignment`
- * @param node A TypeScript node
- */
-export function isShorthandPropertyAssignment(node: ts.Node): node is ts.ShorthandPropertyAssignment {
- return node.kind === ts.SyntaxKind.ShorthandPropertyAssignment;
-}
-
-/**
- * Return true if node is `SpreadAssignment`
- * @param node A TypeScript node
- */
-export function isSpreadAssignment(node: ts.Node): node is ts.SpreadAssignment {
- return node.kind === ts.SyntaxKind.SpreadAssignment;
-}
-
-/**
- * Return true if node is `EnumMember`
- * @param node A TypeScript node
- */
-export function isEnumMember(node: ts.Node): node is ts.EnumMember {
- return node.kind === ts.SyntaxKind.EnumMember;
-}
-
-/**
- * Return true if node is `SourceFile`
- * @param node A TypeScript node
- */
-export function isSourceFile(node: ts.Node): node is ts.SourceFile {
- return node.kind === ts.SyntaxKind.SourceFile;
-}
-
-/**
- * Return true if node is `Bundle`
- * @param node A TypeScript node
- */
-export function isBundle(node: ts.Node): node is ts.Bundle {
- return node.kind === ts.SyntaxKind.Bundle;
-}
-
-/**
- * Return true if node is `JSDocTypeExpression`
- * @param node A TypeScript node
- */
-export function isJSDocTypeExpression(node: ts.Node): node is ts.JSDocTypeExpression {
- return node.kind === ts.SyntaxKind.JSDocTypeExpression;
-}
-
-/**
- * Return true if node is `JSDocAllType`
- * @param node A TypeScript node
- */
-export function isJSDocAllType(node: ts.Node): node is ts.JSDocAllType {
- return node.kind === ts.SyntaxKind.JSDocAllType;
-}
-
-/**
- * Return true if node is `JSDocUnknownType`
- * @param node A TypeScript node
- */
-export function isJSDocUnknownType(node: ts.Node): node is ts.JSDocUnknownType {
- return node.kind === ts.SyntaxKind.JSDocUnknownType;
-}
-
-/**
- * Return true if node is `JSDocArrayType`
- * @param node A TypeScript node
- */
-export function isJSDocArrayType(node: ts.Node): node is ts.JSDocArrayType {
- return node.kind === ts.SyntaxKind.JSDocArrayType;
-}
-
-/**
- * Return true if node is `JSDocUnionType`
- * @param node A TypeScript node
- */
-export function isJSDocUnionType(node: ts.Node): node is ts.JSDocUnionType {
- return node.kind === ts.SyntaxKind.JSDocUnionType;
-}
-
-/**
- * Return true if node is `JSDocTupleType`
- * @param node A TypeScript node
- */
-export function isJSDocTupleType(node: ts.Node): node is ts.JSDocTupleType {
- return node.kind === ts.SyntaxKind.JSDocTupleType;
-}
-
-/**
- * Return true if node is `JSDocNullableType`
- * @param node A TypeScript node
- */
-export function isJSDocNullableType(node: ts.Node): node is ts.JSDocNullableType {
- return node.kind === ts.SyntaxKind.JSDocNullableType;
-}
-
-/**
- * Return true if node is `JSDocNonNullableType`
- * @param node A TypeScript node
- */
-export function isJSDocNonNullableType(node: ts.Node): node is ts.JSDocNonNullableType {
- return node.kind === ts.SyntaxKind.JSDocNonNullableType;
-}
-
-/**
- * Return true if node is `JSDocRecordType`
- * @param node A TypeScript node
- */
-export function isJSDocRecordType(node: ts.Node): node is ts.JSDocRecordType {
- return node.kind === ts.SyntaxKind.JSDocRecordType;
-}
-
-/**
- * Return true if node is `JSDocRecordMember`
- * @param node A TypeScript node
- */
-export function isJSDocRecordMember(node: ts.Node): node is ts.JSDocRecordMember {
- return node.kind === ts.SyntaxKind.JSDocRecordMember;
-}
-
-/**
- * Return true if node is `JSDocTypeReference`
- * @param node A TypeScript node
- */
-export function isJSDocTypeReference(node: ts.Node): node is ts.JSDocTypeReference {
- return node.kind === ts.SyntaxKind.JSDocTypeReference;
-}
-
-/**
- * Return true if node is `JSDocOptionalType`
- * @param node A TypeScript node
- */
-export function isJSDocOptionalType(node: ts.Node): node is ts.JSDocOptionalType {
- return node.kind === ts.SyntaxKind.JSDocOptionalType;
-}
-
-/**
- * Return true if node is `JSDocFunctionType`
- * @param node A TypeScript node
- */
-export function isJSDocFunctionType(node: ts.Node): node is ts.JSDocFunctionType {
- return node.kind === ts.SyntaxKind.JSDocFunctionType;
-}
-
-/**
- * Return true if node is `JSDocVariadicType`
- * @param node A TypeScript node
- */
-export function isJSDocVariadicType(node: ts.Node): node is ts.JSDocVariadicType {
- return node.kind === ts.SyntaxKind.JSDocVariadicType;
-}
-
-/**
- * Return true if node is `JSDocConstructorType`
- * @param node A TypeScript node
- */
-export function isJSDocConstructorType(node: ts.Node): node is ts.JSDocConstructorType {
- return node.kind === ts.SyntaxKind.JSDocConstructorType;
-}
-
-/**
- * Return true if node is `JSDocThisType`
- * @param node A TypeScript node
- */
-export function isJSDocThisType(node: ts.Node): node is ts.JSDocThisType {
- return node.kind === ts.SyntaxKind.JSDocThisType;
-}
-
-/**
- * Return true if node is `JSDocTag`
- * @param node A TypeScript node
- */
-export function isJSDocTag(node: ts.Node): node is ts.JSDocTag {
- return node.kind === ts.SyntaxKind.JSDocTag;
-}
-
-/**
- * Return true if node is `JSDocAugmentsTag`
- * @param node A TypeScript node
- */
-export function isJSDocAugmentsTag(node: ts.Node): node is ts.JSDocAugmentsTag {
- return node.kind === ts.SyntaxKind.JSDocAugmentsTag;
-}
-
-/**
- * Return true if node is `JSDocParameterTag`
- * @param node A TypeScript node
- */
-export function isJSDocParameterTag(node: ts.Node): node is ts.JSDocParameterTag {
- return node.kind === ts.SyntaxKind.JSDocParameterTag;
-}
-
-/**
- * Return true if node is `JSDocReturnTag`
- * @param node A TypeScript node
- */
-export function isJSDocReturnTag(node: ts.Node): node is ts.JSDocReturnTag {
- return node.kind === ts.SyntaxKind.JSDocReturnTag;
-}
-
-/**
- * Return true if node is `JSDocTypeTag`
- * @param node A TypeScript node
- */
-export function isJSDocTypeTag(node: ts.Node): node is ts.JSDocTypeTag {
- return node.kind === ts.SyntaxKind.JSDocTypeTag;
-}
-
-/**
- * Return true if node is `JSDocTemplateTag`
- * @param node A TypeScript node
- */
-export function isJSDocTemplateTag(node: ts.Node): node is ts.JSDocTemplateTag {
- return node.kind === ts.SyntaxKind.JSDocTemplateTag;
-}
-
-/**
- * Return true if node is `JSDocTypedefTag`
- * @param node A TypeScript node
- */
-export function isJSDocTypedefTag(node: ts.Node): node is ts.JSDocTypedefTag {
- return node.kind === ts.SyntaxKind.JSDocTypedefTag;
-}
-
-/**
- * Return true if node is `JSDocPropertyTag`
- * @param node A TypeScript node
- */
-export function isJSDocPropertyTag(node: ts.Node): node is ts.JSDocPropertyTag {
- return node.kind === ts.SyntaxKind.JSDocPropertyTag;
-}
-
-/**
- * Return true if node is `JSDocTypeLiteral`
- * @param node A TypeScript node
- */
-export function isJSDocTypeLiteral(node: ts.Node): node is ts.JSDocTypeLiteral {
- return node.kind === ts.SyntaxKind.JSDocTypeLiteral;
-}
-
-/**
- * Return true if node is `JSDocLiteralType`
- * @param node A TypeScript node
- */
-export function isJSDocLiteralType(node: ts.Node): node is ts.JSDocLiteralType {
- return node.kind === ts.SyntaxKind.JSDocLiteralType;
-}
-
-/**
- * Return true if node is `SyntaxList`
- * @param node A TypeScript node
- */
-export function isSyntaxList(node: ts.Node): node is ts.SyntaxList {
- return node.kind === ts.SyntaxKind.SyntaxList;
-}
-
-/**
- * Return true if node is `NotEmittedStatement`
- * @param node A TypeScript node
- */
-export function isNotEmittedStatement(node: ts.Node): node is ts.NotEmittedStatement {
- return node.kind === ts.SyntaxKind.NotEmittedStatement;
-}
-
-/**
- * Return true if node is `PartiallyEmittedExpression`
- * @param node A TypeScript node
- */
-export function isPartiallyEmittedExpression(node: ts.Node): node is ts.PartiallyEmittedExpression {
- return node.kind === ts.SyntaxKind.PartiallyEmittedExpression;
-}
-
-/**
- * Return true if node is `IntersectionTypeNode`
- * @param node A TypeScript node
- */
-export function isIntersectionTypeNode(node: ts.TypeNode): node is ts.IntersectionTypeNode {
- return node.kind === ts.SyntaxKind.IntersectionType;
-}
-
-/**
- * Return true if node is `LiteralTypeNode`
- * @param node A TypeScript node
- */
-export function isTypeLiteralNode(node: ts.TypeNode): node is ts.LiteralTypeNode {
- return node.kind === ts.SyntaxKind.TypeLiteral;
-}
-
-/**
- * Return true if node is `GetAccessorDeclaration`
- * @param node A TypeScript node
- */
-export function isGetAccessorDeclaration(node: ts.Node): node is ts.GetAccessorDeclaration {
- return node.kind === ts.SyntaxKind.GetAccessor;
-}
diff --git a/src/index.ts b/src/index.ts
index 5d6d524..5c26c27 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,50 +1,46 @@
import * as ts from 'typescript';
+import * as prettier from 'prettier';
-import { compile } from './compiler';
-import {
- reactJSMakePropsAndStateInterfaceTransformFactoryFactory,
-} from './transforms/react-js-make-props-and-state-transform';
-import {
- reactHoistGenericsTransformFactoryFactory,
-} from './transforms/react-hoist-generics-transform';
-import {
- reactRemovePropTypesAssignmentTransformFactoryFactory,
-} from './transforms/react-remove-prop-types-assignment-transform';
-import {
- reactMovePropTypesToClassTransformFactoryFactory,
-} from './transforms/react-move-prop-types-to-class-transform';
-import {
- collapseIntersectionInterfacesTransformFactoryFactory,
-} from './transforms/collapse-intersection-interfaces-transform';
-import {
- reactRemoveStaticPropTypesMemberTransformFactoryFactory,
-} from './transforms/react-remove-static-prop-types-member-transform';
+import { compile, CompilationOptions, DEFAULT_COMPILATION_OPTIONS } from './compiler';
+import { reactJSMakePropsAndStateInterfaceTransformFactoryFactory } from './transforms/react-js-make-props-and-state-transform';
+import { reactRemovePropTypesAssignmentTransformFactoryFactory } from './transforms/react-remove-prop-types-assignment-transform';
+import { reactMovePropTypesToClassTransformFactoryFactory } from './transforms/react-move-prop-types-to-class-transform';
+import { collapseIntersectionInterfacesTransformFactoryFactory } from './transforms/collapse-intersection-interfaces-transform';
+import { reactRemoveStaticPropTypesMemberTransformFactoryFactory } from './transforms/react-remove-static-prop-types-member-transform';
+import { reactStatelessFunctionMakePropsTransformFactoryFactory } from './transforms/react-stateless-function-make-props-transform';
+import { reactRemovePropTypesImportTransformFactoryFactory } from './transforms/react-remove-prop-types-import';
export {
reactMovePropTypesToClassTransformFactoryFactory,
reactJSMakePropsAndStateInterfaceTransformFactoryFactory,
- reactHoistGenericsTransformFactoryFactory,
+ reactStatelessFunctionMakePropsTransformFactoryFactory,
collapseIntersectionInterfacesTransformFactoryFactory,
reactRemovePropTypesAssignmentTransformFactoryFactory,
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
+ reactRemovePropTypesImportTransformFactoryFactory,
compile,
};
export const allTransforms = [
reactMovePropTypesToClassTransformFactoryFactory,
reactJSMakePropsAndStateInterfaceTransformFactoryFactory,
- reactHoistGenericsTransformFactoryFactory,
+ reactStatelessFunctionMakePropsTransformFactoryFactory,
collapseIntersectionInterfacesTransformFactoryFactory,
reactRemovePropTypesAssignmentTransformFactoryFactory,
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
+ reactRemovePropTypesImportTransformFactoryFactory,
];
-export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory;
+export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory;
/**
* Run React JavaScript to TypeScript transform for file at `filePath`
* @param filePath
*/
-export function run(filePath: string): string {
- return compile(filePath, allTransforms);
-}
\ No newline at end of file
+export function run(
+ filePath: string,
+ prettierOptions: prettier.Options = {},
+ compilationOptions: CompilationOptions = DEFAULT_COMPILATION_OPTIONS,
+): string {
+ return compile(filePath, allTransforms, prettierOptions, compilationOptions);
+}
diff --git a/src/transforms/collapse-intersection-interfaces-transform.ts b/src/transforms/collapse-intersection-interfaces-transform.ts
index f04a9d1..cca02a4 100644
--- a/src/transforms/collapse-intersection-interfaces-transform.ts
+++ b/src/transforms/collapse-intersection-interfaces-transform.ts
@@ -1,4 +1,5 @@
import * as ts from 'typescript';
+import * as _ from 'lodash';
import * as helpers from '../helpers';
@@ -13,8 +14,8 @@ import * as helpers from '../helpers';
* type Foo = {foo: string; bar: number;}
*/
export function collapseIntersectionInterfacesTransformFactoryFactory(
- typeChecker: ts.TypeChecker,
- ): ts.TransformerFactory {
+ typeChecker: ts.TypeChecker,
+): ts.TransformerFactory {
return function collapseIntersectionInterfacesTransformFactory(context: ts.TransformationContext) {
return function collapseIntersectionInterfacesTransform(sourceFile: ts.SourceFile) {
const visited = ts.visitEachChild(sourceFile, visitor, context);
@@ -23,7 +24,7 @@ export function collapseIntersectionInterfacesTransformFactoryFactory(
return visited;
function visitor(node: ts.Node) {
- if (helpers.isTypeAliasDeclaration(node)) {
+ if (ts.isTypeAliasDeclaration(node)) {
return visitTypeAliasDeclaration(node);
}
@@ -31,26 +32,121 @@ export function collapseIntersectionInterfacesTransformFactoryFactory(
}
function visitTypeAliasDeclaration(node: ts.TypeAliasDeclaration) {
- if (
- helpers.isIntersectionTypeNode(node.type)
- && node.type.types.every((type) => helpers.isTypeLiteralNode(type))
- ) {
- const allMembers = node.type.types
- .map((type: ts.TypeLiteralNode) => type.members)
- .reduce((all, members) => ts.createNodeArray(all.concat(members)), ts.createNodeArray([]));
-
+ if (ts.isIntersectionTypeNode(node.type)) {
return ts.createTypeAliasDeclaration(
[],
[],
node.name.text,
[],
- ts.createTypeLiteralNode(allMembers),
+ visitIntersectionTypeNode(node.type),
);
}
return node;
}
- }
- }
-}
+ function visitIntersectionTypeNode(node: ts.IntersectionTypeNode) {
+ // Only intersection of type literals can be colapsed.
+ // We are currently ignoring intersections such as `{foo: string} & {bar: string} & TypeRef`
+ // TODO: handle mix of type references and multiple literal types
+ if (!node.types.every(typeNode => ts.isTypeLiteralNode(typeNode))) {
+ return node;
+ }
+
+ // We need cast `node.type.types` to `ts.NodeArray`
+ // because TypeScript can't figure out `node.type.types.every(ts.isTypeLiteralNode)`
+ const types = node.types as ts.NodeArray;
+
+ // Build a map of member names to all of types found in intersectioning type literals
+ // For instance {foo: string, bar: number} & { foo: number } will result in a map like this:
+ // Map {
+ // 'foo' => Set { 'string', 'number' },
+ // 'bar' => Set { 'number' }
+ // }
+ const membersMap = new Map>();
+
+ // A sepecial member of type literal nodes is index signitures which don't have a name
+ // We use this symbol to track it in our members map
+ const INDEX_SIGNITUTRE_MEMBER = Symbol('Index signiture member');
+
+ // Keep a reference of first index signiture member parameters. (ignore rest)
+ let indexMemberParameter: ts.NodeArray | null = null;
+
+ // Iterate through all of type literal nodes members and add them to the members map
+ types.forEach(typeNode => {
+ typeNode.members.forEach(member => {
+ if (ts.isIndexSignatureDeclaration(member)) {
+ if (member.type !== undefined) {
+ if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) {
+ membersMap.get(INDEX_SIGNITUTRE_MEMBER)!.add(member.type);
+ } else {
+ indexMemberParameter = member.parameters;
+ membersMap.set(INDEX_SIGNITUTRE_MEMBER, new Set([member.type]));
+ }
+ }
+ } else if (ts.isPropertySignature(member)) {
+ if (member.type !== undefined) {
+ let memberName = member.name.getText(sourceFile);
+
+ // For unknown reasons, member.name.getText() is returning nothing in some cases
+ // This is probably because previous transformers did something with the AST that
+ // index of text string of member identifier is lost
+ // TODO: investigate
+ if (!memberName) {
+ memberName = (member.name as any).escapedText;
+ }
+
+ if (membersMap.has(memberName)) {
+ membersMap.get(memberName)!.add(member.type);
+ } else {
+ membersMap.set(memberName, new Set([member.type]));
+ }
+ }
+ }
+ });
+ });
+
+ // Result type literal members list
+ const finalMembers: Array = [];
+
+ // Put together the map into a type literal that has member per each map entery and type of that
+ // member is a union of all types in vlues for that member name in members map
+ // if a member has only one type, create a simple type literal for it
+ for (const [name, types] of membersMap.entries()) {
+ if (typeof name === 'symbol') {
+ continue;
+ }
+ // if for this name there is only one type found use the first type, otherwise make a union of all types
+ let resultType = types.size === 1 ? Array.from(types)[0] : createUnionType(Array.from(types));
+
+ finalMembers.push(ts.createPropertySignature([], name, undefined, resultType, undefined));
+ }
+
+ // Handle index signiture member
+ if (membersMap.has(INDEX_SIGNITUTRE_MEMBER)) {
+ const indexTypes = Array.from(membersMap.get(INDEX_SIGNITUTRE_MEMBER)!);
+ let indexType = indexTypes[0];
+ if (indexTypes.length > 1) {
+ indexType = createUnionType(indexTypes);
+ }
+ const indexSigniture = ts.createIndexSignature([], [], indexMemberParameter!, indexType);
+ finalMembers.push(indexSigniture);
+ }
+
+ // Generate one single type literal node
+ return ts.createTypeLiteralNode(finalMembers);
+ }
+
+ /**
+ * Create a union type from multiple type nodes
+ * @param types
+ */
+ function createUnionType(types: ts.TypeNode[]) {
+ // first dedupe literal types
+ // TODO: this only works if all types are primitive types like string or number
+ const uniqueTypes = _.uniqBy(types, type => type.kind);
+ return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.UnionType, uniqueTypes);
+ }
+ };
+ };
+}
diff --git a/src/transforms/react-hoist-generics-transform.ts b/src/transforms/react-hoist-generics-transform.ts
deleted file mode 100644
index b2aa4c3..0000000
--- a/src/transforms/react-hoist-generics-transform.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import * as ts from 'typescript';
-
-import * as helpers from '../helpers';
-
-/**
- * Hoist generics to top of a class declarations in a React component
- *
- * @example
- * Before:
- * class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {}
- *
- * After
- * type SomeComponentProps = {foo: number;};
- * type SomeComponentState = {bar: string;};
- * class SomeComponent extends React.Component {}
- */
-export function reactHoistGenericsTransformFactoryFactory(typeChecker: ts.TypeChecker): ts.TransformerFactory {
- return function reactHoistGenericsTransformFactory(context: ts.TransformationContext) {
- return function reactHoistGenericsTransform(node: ts.SourceFile) {
- return visitSourceFile(node);
- };
- };
-
- function visitSourceFile(sourceFile: ts.SourceFile) {
-
- for (const statement of sourceFile.statements) {
- if (helpers.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) {
- return hoist(statement, sourceFile);
- }
- }
-
- return sourceFile;
- }
-}
-
-/**
- * Hoist props and state generic types
- * @param reactClass
- * @param sourceFile
- */
-function hoist(reactClass: ts.ClassDeclaration, sourceFile: ts.SourceFile) {
- if (!reactClass.heritageClauses) {
- return reactClass;
- }
- const className = reactClass && reactClass.name && reactClass.name.getText(sourceFile);
- const reactHeritageClauses = helpers.find(reactClass.heritageClauses, helpers.isReactHeritageClause);
-
- if (reactHeritageClauses === undefined || !reactHeritageClauses.types == undefined) {
- return reactClass;
- }
- const [reactType] = reactHeritageClauses.types;
- if (reactType.typeArguments === undefined || reactType.typeArguments.length < 2) {
- return reactClass;
- }
-
- const [propType, stateType] = reactType.typeArguments;
- const propTypeName = `${className}Props`;
- const stateTypeName = `${className}State`;
- const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType);
- const stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType);
- const propTypeRef = ts.createTypeReferenceNode(propTypeName, []);
- const stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []);
- const newClassStatement = insertTypeRefs(reactClass, propTypeRef, stateTypeRef);
-
- let statements = helpers.insertBefore(sourceFile.statements, reactClass, propTypeDeclaration)
- statements = helpers.insertAfter(statements, propTypeDeclaration, stateTypeDeclaration);
- statements = helpers.replaceItem(statements, reactClass, newClassStatement);
-
- return ts.updateSourceFileNode(sourceFile, statements);
-}
-
-/**
- * Replace props and state types in a React component with type references
- *
- * @example
- * input
- * ```
- * class MyComp extends React.Component<{}, {}> {}
- * ```
- *
- * output
- * ```
- * class MyComp extends React.Component {}
- * ```
- *
- * @param reactClassDeclaration A React class declaration
- * @param propTypeRef React Props type reference
- * @param stateTypeRef React State type reference
- */
-function insertTypeRefs(
- reactClassDeclaration: ts.ClassDeclaration,
- propTypeRef: ts.TypeReferenceNode,
- stateTypeRef: ts.TypeReferenceNode,
-) {
- if (reactClassDeclaration.heritageClauses === undefined) {
- return reactClassDeclaration;
- }
- const reactHeritageClause = helpers.find(reactClassDeclaration.heritageClauses, helpers.isReactHeritageClause);
-
- if (reactHeritageClause === undefined) {
- return reactClassDeclaration;
- }
-
- const [reactExpression] = reactHeritageClause.types;
- const newReactExpression = ts.updateExpressionWithTypeArguments(
- reactExpression,
- [propTypeRef, stateTypeRef],
- reactExpression.expression,
- );
- const newHeritageClauses = ts.updateHeritageClause(reactHeritageClause, [newReactExpression]);
-
- return ts.updateClassDeclaration(
- reactClassDeclaration,
- reactClassDeclaration.decorators,
- reactClassDeclaration.modifiers,
- reactClassDeclaration.name,
- reactClassDeclaration.typeParameters,
- helpers.replaceItem(reactClassDeclaration.heritageClauses, reactHeritageClause, newHeritageClauses),
- reactClassDeclaration.members,
- );
-}
diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts
index 8f6b9f6..c61d193 100644
--- a/src/transforms/react-js-make-props-and-state-transform.ts
+++ b/src/transforms/react-js-make-props-and-state-transform.ts
@@ -1,8 +1,8 @@
import * as ts from 'typescript';
-
+import * as _ from 'lodash';
import * as helpers from '../helpers';
-export type Factory = ts.TransformerFactory;
+export type Factory = ts.TransformerFactory;
/**
* Get transform for transforming React code originally written in JS which does not have
@@ -12,297 +12,250 @@ export type Factory = ts.TransformerFactory;
export function reactJSMakePropsAndStateInterfaceTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
return function reactJSMakePropsAndStateInterfaceTransformFactory(context: ts.TransformationContext) {
return function reactJSMakePropsAndStateInterfaceTransform(sourceFile: ts.SourceFile) {
- const visited = ts.visitEachChild(sourceFile, visitor, context);
+ const visited = visitSourceFile(sourceFile, typeChecker);
ts.addEmitHelpers(visited, context.readEmitHelpers());
return visited;
+ };
+ };
+}
+
+function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) {
+ let newSourceFile = sourceFile;
+ for (const statement of sourceFile.statements) {
+ if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) {
+ newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker);
+ }
+ }
+
+ return newSourceFile;
+}
+
+function visitReactClassDeclaration(
+ classDeclaration: ts.ClassDeclaration,
+ sourceFile: ts.SourceFile,
+ typeChecker: ts.TypeChecker,
+) {
+ if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) {
+ return sourceFile;
+ }
+ const className = classDeclaration && classDeclaration.name && classDeclaration.name.getText(sourceFile);
+ const propType = getPropsTypeOfReactComponentClass(classDeclaration, sourceFile);
+ const stateType = getStateTypeOfReactComponentClass(classDeclaration, typeChecker);
+ const shouldMakePropTypeDeclaration = propType.members.length > 0;
+ const shouldMakeStateTypeDeclaration = !isStateTypeMemberEmpty(stateType);
+ const propTypeName = `${className}Props`;
+ const stateTypeName = `${className}State`;
+ const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType);
+ const stateTypeDeclaration = ts.createTypeAliasDeclaration([], [], stateTypeName, [], stateType);
+ const propTypeRef = ts.createTypeReferenceNode(propTypeName, []);
+ const stateTypeRef = ts.createTypeReferenceNode(stateTypeName, []);
+
+ const newClassDeclaration = getNewReactClassDeclaration(
+ classDeclaration,
+ shouldMakePropTypeDeclaration ? propTypeRef : propType,
+ shouldMakeStateTypeDeclaration ? stateTypeRef : stateType,
+ );
+
+ const allTypeDeclarations = [];
+ if (shouldMakePropTypeDeclaration) allTypeDeclarations.push(propTypeDeclaration);
+ if (shouldMakeStateTypeDeclaration) allTypeDeclarations.push(stateTypeDeclaration);
+
+ let statements = helpers.insertBefore(sourceFile.statements, classDeclaration, allTypeDeclarations);
+ statements = helpers.replaceItem(statements, classDeclaration, newClassDeclaration);
+ return ts.updateSourceFileNode(sourceFile, statements);
+}
+
+function getNewReactClassDeclaration(
+ classDeclaration: ts.ClassDeclaration,
+ propTypeRef: ts.TypeNode,
+ stateTypeRef: ts.TypeNode,
+) {
+ if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) {
+ return classDeclaration;
+ }
+
+ const firstHeritageClause = classDeclaration.heritageClauses[0];
+
+ const newFirstHeritageClauseTypes = helpers.replaceItem(
+ firstHeritageClause.types,
+ firstHeritageClause.types[0],
+ ts.updateExpressionWithTypeArguments(
+ firstHeritageClause.types[0],
+ [propTypeRef, stateTypeRef],
+ firstHeritageClause.types[0].expression,
+ ),
+ );
+
+ const newHeritageClauses = helpers.replaceItem(
+ classDeclaration.heritageClauses,
+ firstHeritageClause,
+ ts.updateHeritageClause(firstHeritageClause, newFirstHeritageClauseTypes),
+ );
+
+ return ts.updateClassDeclaration(
+ classDeclaration,
+ classDeclaration.decorators,
+ classDeclaration.modifiers,
+ classDeclaration.name,
+ classDeclaration.typeParameters,
+ newHeritageClauses,
+ classDeclaration.members,
+ );
+}
+
+function getPropsTypeOfReactComponentClass(
+ classDeclaration: ts.ClassDeclaration,
+ sourceFile: ts.SourceFile,
+): ts.TypeLiteralNode {
+ const staticPropTypesMember = _.find(classDeclaration.members, member => {
+ return (
+ ts.isPropertyDeclaration(member) &&
+ helpers.hasStaticModifier(member) &&
+ helpers.isPropTypesMember(member, sourceFile)
+ );
+ });
+
+ if (
+ staticPropTypesMember !== undefined &&
+ ts.isPropertyDeclaration(staticPropTypesMember) && // check to satisfy type checker
+ staticPropTypesMember.initializer &&
+ ts.isObjectLiteralExpression(staticPropTypesMember.initializer)
+ ) {
+ return helpers.buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer);
+ }
+
+ const staticPropTypesGetterMember = _.find(classDeclaration.members, member => {
+ return (
+ ts.isGetAccessorDeclaration(member) &&
+ helpers.hasStaticModifier(member) &&
+ helpers.isPropTypesMember(member, sourceFile)
+ );
+ });
+
+ if (
+ staticPropTypesGetterMember !== undefined &&
+ ts.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker
+ ) {
+ const returnStatement = _.find(staticPropTypesGetterMember.body!.statements, statement =>
+ ts.isReturnStatement(statement),
+ );
+ if (
+ returnStatement !== undefined &&
+ ts.isReturnStatement(returnStatement) && // check to satisfy typechecker
+ returnStatement.expression &&
+ ts.isObjectLiteralExpression(returnStatement.expression)
+ ) {
+ return helpers.buildInterfaceFromPropTypeObjectLiteral(returnStatement.expression);
+ }
+ }
+
+ return ts.createTypeLiteralNode([]);
+}
+
+function getStateTypeOfReactComponentClass(
+ classDeclaration: ts.ClassDeclaration,
+ typeChecker: ts.TypeChecker,
+): ts.TypeNode {
+ const initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker);
+ const initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword;
+ const collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker);
+ if (!collectedStateTypes.length && initialStateIsVoid) {
+ return ts.createTypeLiteralNode([]);
+ }
+ if (!initialStateIsVoid) {
+ collectedStateTypes.push(initialState);
+ }
+
+ return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes);
+}
- function visitor(node: ts.Node) {
- if (helpers.isClassDeclaration(node)) {
- return visitClassDeclaration(node);
- }
-
- return node;
- }
-
- function visitClassDeclaration(classDeclaration: ts.ClassDeclaration) {
- if (!helpers.isReactComponent(classDeclaration, typeChecker)) {
- return classDeclaration;
- }
-
- if (!classDeclaration.heritageClauses || !classDeclaration.heritageClauses.length) {
- return classDeclaration;
- }
-
- const firstHeritageClauses = classDeclaration.heritageClauses[0];
- const expressionWithTypeArguments = firstHeritageClauses.types[0];
-
- firstHeritageClauses.types[0] = ts.updateExpressionWithTypeArguments(
- expressionWithTypeArguments,
- [
- getPropsTypeOfReactComponentClass(classDeclaration),
- getStateTypeOfReactComponentClass(classDeclaration),
- ],
- expressionWithTypeArguments.expression,
- )
-
- return ts.updateClassDeclaration(
- classDeclaration,
- classDeclaration.decorators,
- classDeclaration.modifiers,
- classDeclaration.name,
- classDeclaration.typeParameters,
- classDeclaration.heritageClauses,
- classDeclaration.members,
- );
-
- function getPropsTypeOfReactComponentClass(classDeclaration: ts.ClassDeclaration): ts.TypeNode {
- const staticPropTypesMember = helpers.find(classDeclaration.members, (member) => {
- return helpers.isPropertyDeclaration(member) &&
- helpers.hasStaticModifier(member) &&
- helpers.isPropTypesMember(member, sourceFile);
- });
-
- if (
- staticPropTypesMember !== undefined
- && helpers.isPropertyDeclaration(staticPropTypesMember) // check to satisfy type checker
- && staticPropTypesMember.initializer
- && helpers.isObjectLiteralExpression(staticPropTypesMember.initializer)
- ) {
- return buildInterfaceFromPropTypeObjectLiteral(staticPropTypesMember.initializer)
- }
-
- const staticPropTypesGetterMember = helpers.find(classDeclaration.members, (member) => {
- return helpers.isGetAccessorDeclaration(member) &&
- helpers.hasStaticModifier(member) &&
- helpers.isPropTypesMember(member, sourceFile);
- });
-
- if (
- staticPropTypesGetterMember !== undefined
- && helpers.isGetAccessorDeclaration(staticPropTypesGetterMember) // check to satisfy typechecker
- ) {
- const returnStatement = helpers.find(
- staticPropTypesGetterMember.body.statements,
- (statement) => helpers.isReturnStatement(statement),
- );
- if (
- returnStatement !== undefined
- && helpers.isReturnStatement(returnStatement) // check to satisfy typechecker
- && returnStatement.expression
- && helpers.isObjectLiteralExpression(returnStatement.expression)
- ) {
- return buildInterfaceFromPropTypeObjectLiteral(
- returnStatement.expression
- )
- }
- }
-
- return ts.createTypeLiteralNode([]);
- }
-
- function getStateTypeOfReactComponentClass(classDeclaration: ts.ClassDeclaration): ts.TypeNode {
- const initialState = getInitialStateFromClassDeclaration(classDeclaration, typeChecker);
- const initialStateIsVoid = initialState.kind === ts.SyntaxKind.VoidKeyword;
- const collectedStateTypes = getStateLookingForSetStateCalls(classDeclaration, typeChecker);
- if (!collectedStateTypes.length && initialStateIsVoid) {
- return ts.createTypeLiteralNode([]);
- }
- if (!initialStateIsVoid) {
- collectedStateTypes.push(initialState)
- }
-
- return ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.IntersectionType, collectedStateTypes);
- }
- }
-
- /**
- * Get initial state of a React component looking for state value initially set
- * @param classDeclaration
- * @param typeChecker
- */
- function getInitialStateFromClassDeclaration(
- classDeclaration: ts.ClassDeclaration,
- typeChecker: ts.TypeChecker,
- ): ts.TypeNode {
- // initial state class member
-
- const initialStateMember = helpers.find(classDeclaration.members, (member) => {
- try {
- return helpers.isPropertyDeclaration(member) &&
- member.name &&
- member.name.getText() === 'state';
- } catch(e) {
- return false;
- }
- });
-
- if (initialStateMember
- && helpers.isPropertyDeclaration(initialStateMember)
- && initialStateMember.initializer
- ) {
- const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!
-
- return typeChecker.typeToTypeNode(type);
- }
-
- // Initial state in constructor
- const constructor = helpers.find(
- classDeclaration.members,
- (member) => member.kind === ts.SyntaxKind.Constructor,
- ) as ts.ConstructorDeclaration | undefined;
-
- if (constructor && constructor.body) {
- for (const statement of constructor.body.statements) {
- if (
- helpers.isExpressionStatement(statement) &&
- helpers.isBinaryExpression(statement.expression) &&
- statement.expression.left.getText() === 'this.state'
- ) {
- return typeChecker.typeToTypeNode(
- typeChecker.getTypeAtLocation(statement.expression.right)
- );
- }
- }
- }
-
- // No initial state, fall back to void
- return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword);
- }
-
- /**
- * Look for setState() function calls to collect the state interface in a React class component
- * @param classDeclaration
- * @param typeChecker
- */
- function getStateLookingForSetStateCalls(
- classDeclaration: ts.ClassDeclaration,
- typeChecker: ts.TypeChecker,
- ): ts.TypeNode[] {
- const typeNodes: ts.TypeNode[] = [];
- for (const member of classDeclaration.members) {
- if (member && helpers.isMethodDeclaration(member) && member.body) {
- lookForSetState(member.body)
- }
- }
-
- return typeNodes;
-
- function lookForSetState(node: ts.Node) {
- ts.forEachChild(node, lookForSetState)
- if (
- helpers.isExpressionStatement(node) &&
- helpers.isCallExpression(node.expression) &&
- node.expression.expression.getText().match(/setState/)
- ) {
- const type = typeChecker.getTypeAtLocation(node.expression.arguments[0])
- typeNodes.push(typeChecker.typeToTypeNode(type));
- }
- }
- }
-
- /**
- * Build props interface from propTypes object
- * @example
- * {
- * foo: React.PropTypes.string.isRequired
- * }
- *
- * becomes
- * {
- * foo: string;
- * }
- * @param objectLiteral
- */
- function buildInterfaceFromPropTypeObjectLiteral(objectLiteral: ts.ObjectLiteralExpression) {
- const resultObjectLiteral = objectLiteral.properties.reduce(
- (result, propertyAssignment: ts.PropertyAssignment) => {
- const name = propertyAssignment.name.getText();
- if (!helpers.isPropertyAccessExpression(propertyAssignment.initializer)) {
- console.warn('Bad value for propType', name, 'at', propertyAssignment.getStart());
- return result;
- }
-
- // Ignore children, React types have it
- if (propertyAssignment.name.getText() === 'children') {
- return result;
- }
-
- // Ignore children, React types have it
- if (propertyAssignment.name.getText() === 'children') {
- return result;
- }
-
- const typeValue = getTypeFromReactPropTypeExpression(propertyAssignment.initializer);
- const isOptional = isPropTypeOptional(propertyAssignment.initializer);
- const propertySignature = ts.createPropertySignature(
- [],
- name,
- isOptional ? ts.createToken(ts.SyntaxKind.QuestionToken): undefined,
- typeValue,
- undefined,
- );
- result.members.push(propertySignature)
- return result;
- }, ts.createTypeLiteralNode([]));
-
-
- return resultObjectLiteral;
+/**
+ * Get initial state of a React component looking for state value initially set
+ * @param classDeclaration
+ * @param typeChecker
+ */
+function getInitialStateFromClassDeclaration(
+ classDeclaration: ts.ClassDeclaration,
+ typeChecker: ts.TypeChecker,
+): ts.TypeNode {
+ // initial state class member
+
+ const initialStateMember = _.find(classDeclaration.members, member => {
+ try {
+ return ts.isPropertyDeclaration(member) && member.name && member.name.getText() === 'state';
+ } catch (e) {
+ return false;
+ }
+ });
+
+ if (initialStateMember && ts.isPropertyDeclaration(initialStateMember) && initialStateMember.initializer) {
+ const type = typeChecker.getTypeAtLocation(initialStateMember.initializer)!;
+
+ return typeChecker.typeToTypeNode(type);
+ }
+
+ // Initial state in constructor
+ const constructor = _.find(classDeclaration.members, member => member.kind === ts.SyntaxKind.Constructor) as
+ | ts.ConstructorDeclaration
+ | undefined;
+
+ if (constructor && constructor.body) {
+ for (const statement of constructor.body.statements) {
+ if (
+ ts.isExpressionStatement(statement) &&
+ ts.isBinaryExpression(statement.expression) &&
+ statement.expression.left.getText() === 'this.state'
+ ) {
+ return typeChecker.typeToTypeNode(typeChecker.getTypeAtLocation(statement.expression.right));
}
+ }
+ }
- /**
- * Turns React.PropTypes.* into TypeScript type value
- *
- * @param node React propTypes value
- */
- function getTypeFromReactPropTypeExpression(node: ts.PropertyAccessExpression) {
- const text = node.getText().replace(/React\.PropTypes\./, '');
- let result = null;
- if (/string/.test(text)) {
- result = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
- } else if (/any/.test(text)) {
- result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
- } else if (/array/.test(text)) {
- result = ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
- } else if (/bool/.test(text)) {
- result = ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);
- } else if (/number/.test(text)) {
- result = ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);
- } else if (/object/.test(text)) {
- result = ts.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword);
- } else if (/node/.test(text)) {
- result = ts.createTypeReferenceNode('React.ReactNode', []);
- } else if (/element/.test(text)) {
- result = ts.createTypeReferenceNode('JSX.Element', []);
- } else if (/func/.test(text)) {
- const arrayOfAny = ts.createParameter(
- [],
- [],
- ts.createToken(ts.SyntaxKind.DotDotDotToken),
- 'args',
- undefined,
- ts.createArrayTypeNode(ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)),
- undefined,
- );
- result = ts.createFunctionTypeNode(
- [],
- [arrayOfAny],
- ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),
- );
- } else {
- result = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
- }
- return result;
- }
+ // No initial state, fall back to void
+ return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword);
+}
- /**
- * Decide if node is optional
- * @param node React propTypes member node
- */
- function isPropTypeOptional(node: ts.PropertyAccessExpression) {
- const text = node.getText().replace(/React\.PropTypes\./, '');
- return !/\.isRequired/.test(text)
- }
- };
- };
-};
+/**
+ * Look for setState() function calls to collect the state interface in a React class component
+ * @param classDeclaration
+ * @param typeChecker
+ */
+function getStateLookingForSetStateCalls(
+ classDeclaration: ts.ClassDeclaration,
+ typeChecker: ts.TypeChecker,
+): ts.TypeNode[] {
+ const typeNodes: ts.TypeNode[] = [];
+ for (const member of classDeclaration.members) {
+ if (member && ts.isMethodDeclaration(member) && member.body) {
+ lookForSetState(member.body);
+ }
+ }
+
+ return typeNodes;
+
+ function lookForSetState(node: ts.Node) {
+ ts.forEachChild(node, lookForSetState);
+ if (
+ ts.isExpressionStatement(node) &&
+ ts.isCallExpression(node.expression) &&
+ node.expression.expression.getText().match(/setState/)
+ ) {
+ const type = typeChecker.getTypeAtLocation(node.expression.arguments[0]);
+ typeNodes.push(typeChecker.typeToTypeNode(type));
+ }
+ }
+}
+
+function isStateTypeMemberEmpty(stateType: ts.TypeNode): boolean {
+ // Only need to handle TypeLiteralNode & IntersectionTypeNode
+ if (ts.isTypeLiteralNode(stateType)) {
+ return stateType.members.length === 0;
+ }
+
+ if (!ts.isIntersectionTypeNode(stateType)) {
+ return true;
+ }
+
+ return stateType.types.every(isStateTypeMemberEmpty);
+}
diff --git a/src/transforms/react-move-prop-types-to-class-transform.ts b/src/transforms/react-move-prop-types-to-class-transform.ts
index 327e011..d954a11 100644
--- a/src/transforms/react-move-prop-types-to-class-transform.ts
+++ b/src/transforms/react-move-prop-types-to-class-transform.ts
@@ -1,8 +1,9 @@
import * as ts from 'typescript';
+import * as _ from 'lodash';
import * as helpers from '../helpers';
-export type Factory = ts.TransformerFactory;
+export type Factory = ts.TransformerFactory;
/**
* Move Component.propTypes statements into class as a static member of the class
@@ -32,7 +33,9 @@ export type Factory = ts.TransformerFactory;
export function reactMovePropTypesToClassTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
return function reactMovePropTypesToClassTransformFactory(context: ts.TransformationContext) {
return function reactMovePropTypesToClassTransform(sourceFile: ts.SourceFile) {
- return visitSourceFile(sourceFile, typeChecker);
+ const visited = visitSourceFile(sourceFile, typeChecker);
+ ts.addEmitHelpers(visited, context.readEmitHelpers());
+ return visited;
};
};
}
@@ -46,50 +49,36 @@ function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker)
let statements = sourceFile.statements;
// Look for propType assignment statements
- const propTypeAssignments = statements.filter(
- (statement) => helpers.isReactPropTypeAssignmentStatement(statement)
+ const propTypeAssignments = statements.filter(statement =>
+ helpers.isReactPropTypeAssignmentStatement(statement),
) as ts.ExpressionStatement[];
-
for (const propTypeAssignment of propTypeAssignments) {
-
// Look for the class declarations with the same name
- const componentName = getComponentName(propTypeAssignment, sourceFile);
+ const componentName = helpers.getComponentName(propTypeAssignment, sourceFile);
- const classStatement = helpers.find(
+ const classStatement = (_.find(
statements,
- (statement) => helpers.isClassDeclaration(statement) &&
+ statement =>
+ ts.isClassDeclaration(statement) &&
statement.name !== undefined &&
statement.name.getText(sourceFile) === componentName,
- ) as {} as ts.ClassDeclaration; // Type weirdness
+ ) as {}) as ts.ClassDeclaration; // Type weirdness
// && helpers.isBinaryExpression(propTypeAssignment.expression) is redundant to satisfy the type checker
- if (classStatement && helpers.isBinaryExpression(propTypeAssignment.expression)) {
+ if (classStatement && ts.isBinaryExpression(propTypeAssignment.expression)) {
const newClassStatement = addStaticMemberToClass(
classStatement,
'propTypes',
propTypeAssignment.expression.right,
);
- statements = ts.createNodeArray(
- helpers.replaceItem(sourceFile.statements, classStatement, newClassStatement),
- );
+ statements = ts.createNodeArray(helpers.replaceItem(statements, classStatement, newClassStatement));
}
}
return ts.updateSourceFileNode(sourceFile, statements);
}
-
-/**
- * Get component name off of a propType assignment statement
- * @param propTypeAssignment
- * @param sourceFile
- */
-function getComponentName(propTypeAssignment: ts.Statement, sourceFile: ts.SourceFile) {
- const text = propTypeAssignment.getText(sourceFile);
- return text.substr(0, text.indexOf('.'));
-}
-
/**
* Insert a new static member into a class
* @param classDeclaration
@@ -97,7 +86,7 @@ function getComponentName(propTypeAssignment: ts.Statement, sourceFile: ts.Sourc
* @param value
*/
function addStaticMemberToClass(classDeclaration: ts.ClassDeclaration, name: string, value: ts.Expression) {
- const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword)
+ const staticModifier = ts.createToken(ts.SyntaxKind.StaticKeyword);
const propertyDeclaration = ts.createProperty([], [staticModifier], name, undefined, undefined, value);
return ts.updateClassDeclaration(
classDeclaration,
@@ -106,6 +95,6 @@ function addStaticMemberToClass(classDeclaration: ts.ClassDeclaration, name: str
classDeclaration.name,
classDeclaration.typeParameters,
ts.createNodeArray(classDeclaration.heritageClauses),
- ts.createNodeArray([propertyDeclaration, ...classDeclaration.members])
- )
+ ts.createNodeArray([propertyDeclaration, ...classDeclaration.members]),
+ );
}
diff --git a/src/transforms/react-remove-prop-types-assignment-transform.ts b/src/transforms/react-remove-prop-types-assignment-transform.ts
index f87b671..4b57fa9 100644
--- a/src/transforms/react-remove-prop-types-assignment-transform.ts
+++ b/src/transforms/react-remove-prop-types-assignment-transform.ts
@@ -2,7 +2,7 @@ import * as ts from 'typescript';
import * as helpers from '../helpers';
-export type Factory = ts.TransformerFactory;
+export type Factory = ts.TransformerFactory;
/**
* Remove Component.propTypes statements
@@ -15,13 +15,15 @@ export type Factory = ts.TransformerFactory;
* After
* class SomeComponent extends React.Component<{foo: number;}, {bar: string;}> {}
*/
-export function reactRemovePropTypesAssignmentTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory{
+export function reactRemovePropTypesAssignmentTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
return function reactRemovePropTypesAssignmentTransformFactory(context: ts.TransformationContext) {
return function reactRemovePropTypesAssignmentTransform(sourceFile: ts.SourceFile) {
- return ts.updateSourceFileNode(
+ const visited = ts.updateSourceFileNode(
sourceFile,
sourceFile.statements.filter(s => !helpers.isReactPropTypeAssignmentStatement(s)),
);
- }
- }
+ ts.addEmitHelpers(visited, context.readEmitHelpers());
+ return visited;
+ };
+ };
}
diff --git a/src/transforms/react-remove-prop-types-import.ts b/src/transforms/react-remove-prop-types-import.ts
new file mode 100644
index 0000000..8644b8c
--- /dev/null
+++ b/src/transforms/react-remove-prop-types-import.ts
@@ -0,0 +1,76 @@
+import * as ts from 'typescript';
+import * as _ from 'lodash';
+
+import * as helpers from '../helpers';
+
+export type Factory = ts.TransformerFactory;
+
+/**
+ * Remove `import PropTypes from 'prop-types'` or
+ * `import { PropTypes } from 'react'`
+ *
+ * @example
+ * Before:
+ * import PropTypes from 'prop-types'
+ * import React, { PropTypes } from 'react'
+ *
+ * After:
+ * import React from 'react'
+ */
+export function reactRemovePropTypesImportTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
+ return function reactRemovePropTypesImportTransformFactory(context: ts.TransformationContext) {
+ return function reactRemovePropTypesImportTransform(sourceFile: ts.SourceFile) {
+ const visited = ts.updateSourceFileNode(
+ sourceFile,
+ sourceFile.statements
+ .filter(s => {
+ return !(
+ ts.isImportDeclaration(s) &&
+ ts.isStringLiteral(s.moduleSpecifier) &&
+ s.moduleSpecifier.text === 'prop-types'
+ );
+ })
+ .map(updateReactImportIfNeeded),
+ );
+ ts.addEmitHelpers(visited, context.readEmitHelpers());
+ return visited;
+ };
+ };
+}
+
+function updateReactImportIfNeeded(statement: ts.Statement) {
+ if (
+ !ts.isImportDeclaration(statement) ||
+ !ts.isStringLiteral(statement.moduleSpecifier) ||
+ statement.moduleSpecifier.text !== 'react' ||
+ !statement.importClause ||
+ !statement.importClause.namedBindings ||
+ !ts.isNamedImports(statement.importClause.namedBindings)
+ ) {
+ return statement;
+ }
+
+ const namedBindings = statement.importClause.namedBindings;
+ const newNamedBindingElements = namedBindings.elements.filter(elm => elm.name.text !== 'PropTypes');
+
+ if (newNamedBindingElements.length === namedBindings.elements.length) {
+ // Means it has no 'PropTypes' named import
+ return statement;
+ }
+
+ const newImportClause = ts.updateImportClause(
+ statement.importClause,
+ statement.importClause.name,
+ newNamedBindingElements.length === 0
+ ? undefined
+ : ts.updateNamedImports(namedBindings, newNamedBindingElements),
+ );
+
+ return ts.updateImportDeclaration(
+ statement,
+ statement.decorators,
+ statement.modifiers,
+ newImportClause,
+ statement.moduleSpecifier,
+ );
+}
diff --git a/src/transforms/react-remove-static-prop-types-member-transform.ts b/src/transforms/react-remove-static-prop-types-member-transform.ts
index 6aa579d..7054884 100644
--- a/src/transforms/react-remove-static-prop-types-member-transform.ts
+++ b/src/transforms/react-remove-static-prop-types-member-transform.ts
@@ -2,7 +2,7 @@ import * as ts from 'typescript';
import * as helpers from '../helpers';
-export type Factory = ts.TransformerFactory;
+export type Factory = ts.TransformerFactory;
/**
* Remove static propTypes
@@ -21,10 +21,12 @@ export type Factory = ts.TransformerFactory;
export function reactRemoveStaticPropTypesMemberTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
return function reactRemoveStaticPropTypesMemberTransformFactory(context: ts.TransformationContext) {
return function reactRemoveStaticPropTypesMemberTransform(sourceFile: ts.SourceFile) {
- return ts.visitEachChild(sourceFile, visitor, context);
+ const visited = ts.visitEachChild(sourceFile, visitor, context);
+ ts.addEmitHelpers(visited, context.readEmitHelpers());
+ return visited;
function visitor(node: ts.Node) {
- if (helpers.isClassDeclaration(node) && helpers.isReactComponent(node, typeChecker)) {
+ if (ts.isClassDeclaration(node) && helpers.isReactComponent(node, typeChecker)) {
return ts.updateClassDeclaration(
node,
node.decorators,
@@ -32,29 +34,29 @@ export function reactRemoveStaticPropTypesMemberTransformFactoryFactory(typeChec
node.name,
node.typeParameters,
ts.createNodeArray(node.heritageClauses),
- node.members.filter((member) => {
+ node.members.filter(member => {
if (
- helpers.isPropertyDeclaration(member)
- && helpers.hasStaticModifier(member)
- && helpers.isPropTypesMember(member, sourceFile)
+ ts.isPropertyDeclaration(member) &&
+ helpers.hasStaticModifier(member) &&
+ helpers.isPropTypesMember(member, sourceFile)
) {
return false;
}
// propTypes getter
if (
- helpers.isGetAccessorDeclaration(member)
- && helpers.hasStaticModifier(member)
- && helpers.isPropTypesMember(member, sourceFile)
+ ts.isGetAccessorDeclaration(member) &&
+ helpers.hasStaticModifier(member) &&
+ helpers.isPropTypesMember(member, sourceFile)
) {
return false;
}
return true;
}),
- )
+ );
}
return node;
}
- }
- }
+ };
+ };
}
diff --git a/src/transforms/react-stateless-function-make-props-transform.ts b/src/transforms/react-stateless-function-make-props-transform.ts
new file mode 100644
index 0000000..0222cec
--- /dev/null
+++ b/src/transforms/react-stateless-function-make-props-transform.ts
@@ -0,0 +1,117 @@
+import * as ts from 'typescript';
+import * as _ from 'lodash';
+
+import * as helpers from '../helpers';
+
+export type Factory = ts.TransformerFactory;
+
+/**
+ * Transform react stateless components
+ *
+ * @example
+ * Before:
+ * const Hello = ({ message }) => {
+ * return hello {message}
+ * }
+ * // Or:
+ * // const Hello = ({ message }) => hello {message}
+ *
+ * Hello.propTypes = {
+ * message: React.PropTypes.string,
+ * }
+ *
+ * After:
+ * Type HelloProps = {
+ * message: string;
+ * }
+ *
+ * const Hello: React.SFC = ({ message }) => {
+ * return hello {message}
+ * }
+ *
+ * Hello.propTypes = {
+ * message: React.PropTypes.string,
+ * }
+ */
+export function reactStatelessFunctionMakePropsTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
+ return function reactStatelessFunctionMakePropsTransformFactory(context: ts.TransformationContext) {
+ return function reactStatelessFunctionMakePropsTransform(sourceFile: ts.SourceFile) {
+ const visited = visitSourceFile(sourceFile, typeChecker);
+ ts.addEmitHelpers(visited, context.readEmitHelpers());
+ return visited;
+ };
+ };
+}
+
+function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) {
+ // Look for propType assignment statements
+ const propTypeAssignments = sourceFile.statements.filter(statement =>
+ helpers.isReactPropTypeAssignmentStatement(statement),
+ ) as ts.ExpressionStatement[];
+
+ let newSourceFile = sourceFile;
+ for (const propTypeAssignment of propTypeAssignments) {
+ const componentName = helpers.getComponentName(propTypeAssignment, newSourceFile);
+
+ const funcComponent = (_.find(newSourceFile.statements, s => {
+ return (
+ (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) ||
+ (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName)
+ );
+ }) as {}) as ts.FunctionDeclaration | ts.VariableStatement; // Type weirdness
+
+ if (funcComponent) {
+ newSourceFile = visitReactStatelessComponent(funcComponent, propTypeAssignment, newSourceFile);
+ }
+ }
+
+ return newSourceFile;
+}
+
+function visitReactStatelessComponent(
+ component: ts.FunctionDeclaration | ts.VariableStatement,
+ propTypesExpressionStatement: ts.ExpressionStatement,
+ sourceFile: ts.SourceFile,
+) {
+ let arrowFuncComponent = helpers.convertReactStatelessFunctionToArrowFunction(component);
+ let componentName = arrowFuncComponent.declarationList.declarations[0].name.getText();
+ let componentInitializer = arrowFuncComponent.declarationList.declarations[0].initializer;
+
+ const propType = getPropTypesFromTypeAssignment(propTypesExpressionStatement);
+ const shouldMakePropTypeDeclaration = propType.members.length > 0;
+ const propTypeName = `${componentName}Props`;
+ const propTypeDeclaration = ts.createTypeAliasDeclaration([], [], propTypeName, [], propType);
+ const propTypeRef = ts.createTypeReferenceNode(propTypeName, []);
+
+ let componentType = ts.createTypeReferenceNode(ts.createQualifiedName(ts.createIdentifier('React'), 'SFC'), [
+ shouldMakePropTypeDeclaration ? propTypeRef : propType,
+ ]);
+
+ // replace component with ts stateless component
+ const typedComponent = ts.createVariableStatement(
+ arrowFuncComponent.modifiers,
+ ts.createVariableDeclarationList(
+ [ts.createVariableDeclaration(componentName, componentType, componentInitializer)],
+ arrowFuncComponent.declarationList.flags,
+ ),
+ );
+
+ let statements = shouldMakePropTypeDeclaration
+ ? helpers.insertBefore(sourceFile.statements, component, [propTypeDeclaration])
+ : sourceFile.statements;
+
+ statements = helpers.replaceItem(statements, component, typedComponent);
+ return ts.updateSourceFileNode(sourceFile, statements);
+}
+
+function getPropTypesFromTypeAssignment(propTypesExpressionStatement: ts.ExpressionStatement) {
+ if (
+ propTypesExpressionStatement !== undefined &&
+ ts.isBinaryExpression(propTypesExpressionStatement.expression) &&
+ ts.isObjectLiteralExpression(propTypesExpressionStatement.expression.right)
+ ) {
+ return helpers.buildInterfaceFromPropTypeObjectLiteral(propTypesExpressionStatement.expression.right);
+ }
+
+ return ts.createTypeLiteralNode([]);
+}
diff --git a/src/untyped-modules.d.ts b/src/untyped-modules.d.ts
new file mode 100644
index 0000000..f187021
--- /dev/null
+++ b/src/untyped-modules.d.ts
@@ -0,0 +1 @@
+declare module 'dedent';
diff --git a/test/collapse-intersection-interfaces-transform/advanced/output.tsx b/test/collapse-intersection-interfaces-transform/advanced/output.tsx
index a272d5a..a579223 100644
--- a/test/collapse-intersection-interfaces-transform/advanced/output.tsx
+++ b/test/collapse-intersection-interfaces-transform/advanced/output.tsx
@@ -1,7 +1,7 @@
type Foo = {
- foo: string;
- stuff: boolean;
- other: () => void;
- bar: number;
- [key: string]: number;
+ foo: string,
+ stuff: boolean,
+ other: () => void,
+ bar: number,
+ [key: string]: number,
};
diff --git a/test/collapse-intersection-interfaces-transform/multiple/input.tsx b/test/collapse-intersection-interfaces-transform/multiple/input.tsx
new file mode 100644
index 0000000..1854a03
--- /dev/null
+++ b/test/collapse-intersection-interfaces-transform/multiple/input.tsx
@@ -0,0 +1,3 @@
+type Foo = {foo: string} & {bar: number};
+
+type Bar = {foo: number} & {bar: string};
diff --git a/test/collapse-intersection-interfaces-transform/multiple/output.tsx b/test/collapse-intersection-interfaces-transform/multiple/output.tsx
new file mode 100644
index 0000000..f6d0c1d
--- /dev/null
+++ b/test/collapse-intersection-interfaces-transform/multiple/output.tsx
@@ -0,0 +1,8 @@
+type Foo = {
+ foo: string,
+ bar: number,
+};
+type Bar = {
+ foo: number,
+ bar: string,
+};
diff --git a/test/collapse-intersection-interfaces-transform/repeated/input.tsx b/test/collapse-intersection-interfaces-transform/repeated/input.tsx
new file mode 100644
index 0000000..2bfb4e6
--- /dev/null
+++ b/test/collapse-intersection-interfaces-transform/repeated/input.tsx
@@ -0,0 +1,5 @@
+type A = { foo: string; } & { foo: string; };
+
+type B = { foo: string; bar: number; } & { foo: number; bar: number; }
+
+type C = { foo: string; bar: number; } & { foo: number; bar: number; } & { foo: string; }
diff --git a/test/collapse-intersection-interfaces-transform/repeated/output.tsx b/test/collapse-intersection-interfaces-transform/repeated/output.tsx
new file mode 100644
index 0000000..5dc0eec
--- /dev/null
+++ b/test/collapse-intersection-interfaces-transform/repeated/output.tsx
@@ -0,0 +1,13 @@
+type A = {
+ foo: string,
+};
+
+type B = {
+ foo: string | number,
+ bar: number,
+};
+
+type C = {
+ foo: string | number,
+ bar: number,
+};
diff --git a/test/collapse-intersection-interfaces-transform/simple/output.tsx b/test/collapse-intersection-interfaces-transform/simple/output.tsx
index b845331..d4374e3 100644
--- a/test/collapse-intersection-interfaces-transform/simple/output.tsx
+++ b/test/collapse-intersection-interfaces-transform/simple/output.tsx
@@ -1,4 +1,4 @@
type Foo = {
- foo: string;
- bar: number;
-};
\ No newline at end of file
+ foo: string,
+ bar: number,
+};
diff --git a/test/end-to-end/basic/input.tsx b/test/end-to-end/basic/input.tsx
index 881a680..53750ee 100644
--- a/test/end-to-end/basic/input.tsx
+++ b/test/end-to-end/basic/input.tsx
@@ -1,7 +1,8 @@
+import PropTypes from 'prop-types';
import * as React from 'react';
export default class MyComponent extends React.Component {
render() {
return
;
}
-}
\ No newline at end of file
+}
diff --git a/test/end-to-end/basic/output.tsx b/test/end-to-end/basic/output.tsx
index c1c9a80..c98cfbd 100644
--- a/test/end-to-end/basic/output.tsx
+++ b/test/end-to-end/basic/output.tsx
@@ -1,9 +1,5 @@
import * as React from 'react';
-
-type MyComponentProps = {};
-type MyComponentState = {};
-
-export default class MyComponent extends React.Component {
+export default class MyComponent extends React.Component<{}, {}> {
render() {
return
;
}
diff --git a/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx b/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx
index 64338c6..95fae0f 100644
--- a/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx
+++ b/test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx
@@ -1,12 +1,11 @@
import * as React from 'react';
-
type MyComponentProps = {
- baz: string;
+ baz: string,
};
type MyComponentState = {
- dynamicState: number;
- foo: number;
- bar: string;
+ dynamicState: number,
+ foo: number,
+ bar: string,
};
export default class MyComponent extends React.Component {
state = { foo: 1, bar: 'str' };
diff --git a/test/end-to-end/initial-state-and-proprypes/output.tsx b/test/end-to-end/initial-state-and-proprypes/output.tsx
index 4a358b2..912e3b8 100644
--- a/test/end-to-end/initial-state-and-proprypes/output.tsx
+++ b/test/end-to-end/initial-state-and-proprypes/output.tsx
@@ -1,11 +1,10 @@
import * as React from 'react';
-
type MyComponentProps = {
- baz: string;
+ baz: string,
};
type MyComponentState = {
- foo: number;
- bar: string;
+ foo: number,
+ bar: string,
};
export default class MyComponent extends React.Component {
state = { foo: 1, bar: 'str' };
diff --git a/test/end-to-end/multiple-components/input.tsx b/test/end-to-end/multiple-components/input.tsx
new file mode 100644
index 0000000..9cb8345
--- /dev/null
+++ b/test/end-to-end/multiple-components/input.tsx
@@ -0,0 +1,34 @@
+const Hello = ({ message }) => {
+ return hello {message}
+};
+
+const Hey = ({ name }) => {
+ return hey, {name}
+}
+
+Hey.propTypes = {
+ message: React.PropTypes.string,
+}
+
+Hello.propTypes = {
+ message: React.PropTypes.string,
+}
+
+export default class MyComponent extends React.Component {
+ render() {
+ return ;
+ }
+
+ onclick() {
+ this.setState({foo: 1, bar: 2})
+ }
+}
+
+export class AnotherComponent extends React.Component {
+ static propTypes = {
+ foo: React.PropTypes.string.isRequired,
+ };
+ render() {
+ return
;
+ }
+}
diff --git a/test/end-to-end/multiple-components/output.tsx b/test/end-to-end/multiple-components/output.tsx
new file mode 100644
index 0000000..5495538
--- /dev/null
+++ b/test/end-to-end/multiple-components/output.tsx
@@ -0,0 +1,32 @@
+type HelloProps = {
+ message?: string,
+};
+const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
+type HeyProps = {
+ message?: string,
+};
+const Hey: React.SFC = ({ name }) => {
+ return hey, {name}
;
+};
+type MyComponentState = {
+ foo: number,
+ bar: number,
+};
+export default class MyComponent extends React.Component<{}, MyComponentState> {
+ render() {
+ return ;
+ }
+ onclick() {
+ this.setState({ foo: 1, bar: 2 });
+ }
+}
+type AnotherComponentProps = {
+ foo: string,
+};
+export class AnotherComponent extends React.Component {
+ render() {
+ return
;
+ }
+}
diff --git a/test/end-to-end/non-react/output.tsx b/test/end-to-end/non-react/output.tsx
index 9111b26..50db235 100644
--- a/test/end-to-end/non-react/output.tsx
+++ b/test/end-to-end/non-react/output.tsx
@@ -4,6 +4,5 @@ class Foo {
}
}
class Bar extends Foo {
- baz() {
- }
-}
\ No newline at end of file
+ baz() {}
+}
diff --git a/test/end-to-end/stateless-arrow-function/input.tsx b/test/end-to-end/stateless-arrow-function/input.tsx
new file mode 100644
index 0000000..9ddb8b7
--- /dev/null
+++ b/test/end-to-end/stateless-arrow-function/input.tsx
@@ -0,0 +1,7 @@
+const Hello = ({ message }) => {
+ return hello {message}
+};
+
+Hello.propTypes = {
+ message: React.PropTypes.string,
+}
diff --git a/test/end-to-end/stateless-arrow-function/output.tsx b/test/end-to-end/stateless-arrow-function/output.tsx
new file mode 100644
index 0000000..b80083c
--- /dev/null
+++ b/test/end-to-end/stateless-arrow-function/output.tsx
@@ -0,0 +1,6 @@
+type HelloProps = {
+ message?: string,
+};
+const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
diff --git a/test/end-to-end/stateless-function/input.tsx b/test/end-to-end/stateless-function/input.tsx
new file mode 100644
index 0000000..402c686
--- /dev/null
+++ b/test/end-to-end/stateless-function/input.tsx
@@ -0,0 +1,7 @@
+export function Hello({ message }) {
+ return hello {message}
+}
+
+Hello.propTypes = {
+ message: React.PropTypes.string,
+}
diff --git a/test/end-to-end/stateless-function/output.tsx b/test/end-to-end/stateless-function/output.tsx
new file mode 100644
index 0000000..2028009
--- /dev/null
+++ b/test/end-to-end/stateless-function/output.tsx
@@ -0,0 +1,6 @@
+type HelloProps = {
+ message?: string,
+};
+export const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
diff --git a/test/react-hoist-generics-transform/non-react/input.tsx b/test/react-hoist-generics-transform/non-react/input.tsx
deleted file mode 100644
index c0e4a28..0000000
--- a/test/react-hoist-generics-transform/non-react/input.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-interface IFoo {
-
-}
-class Foo {
-
-}
-
-class Bar extends Foo {
-
-}
-
-class Foo2 implements IFoo {
-
-}
-
-class Bar2 extends Foo implements IFoo {
-
-}
diff --git a/test/react-hoist-generics-transform/non-react/output.tsx b/test/react-hoist-generics-transform/non-react/output.tsx
deleted file mode 100644
index 8b8eec9..0000000
--- a/test/react-hoist-generics-transform/non-react/output.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-interface IFoo {
-
-}
-class Foo {
-
-}
-
-class Bar extends Foo {
-
-}
-
-class Foo2 implements IFoo {
-
-}
-
-class Bar2 extends Foo implements IFoo {
-
-}
diff --git a/test/react-hoist-generics-transform/propless-stateless/input.tsx b/test/react-hoist-generics-transform/propless-stateless/input.tsx
deleted file mode 100644
index ab0d702..0000000
--- a/test/react-hoist-generics-transform/propless-stateless/input.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import * as React from 'react';
-
-export default class MyComponent extends React.Component<{}, {}> {
- render() {
- return
;
- }
-}
diff --git a/test/react-hoist-generics-transform/propless-stateless/output.tsx b/test/react-hoist-generics-transform/propless-stateless/output.tsx
deleted file mode 100644
index 22548c4..0000000
--- a/test/react-hoist-generics-transform/propless-stateless/output.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import * as React from 'react';
-
-type MyComponentProps = {};
-type MyComponentState = {};
-export default class MyComponent extends React.Component {
- render() {
- return
;
- }
-}
diff --git a/test/react-hoist-generics-transform/props-and-state/input.tsx b/test/react-hoist-generics-transform/props-and-state/input.tsx
deleted file mode 100644
index c1e13db..0000000
--- a/test/react-hoist-generics-transform/props-and-state/input.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import * as React from 'react';
-
-export default class MyComponent extends React.Component<{foo: string; bar: object;}, {baz: string; [k: string]: string}> {
- render() {
- return
;
- }
-}
diff --git a/test/react-hoist-generics-transform/props-and-state/output.tsx b/test/react-hoist-generics-transform/props-and-state/output.tsx
deleted file mode 100644
index dbebeed..0000000
--- a/test/react-hoist-generics-transform/props-and-state/output.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import * as React from 'react';
-
-type MyComponentProps = {
- foo: string;
- bar: object;
-};
-type MyComponentState = {
- baz: string;
- [k: string]: string;
-};
-export default class MyComponent extends React.Component {
- render() {
- return
;
- }
-}
diff --git a/test/react-js-make-props-and-state-transform/multiple-components/input.tsx b/test/react-js-make-props-and-state-transform/multiple-components/input.tsx
new file mode 100644
index 0000000..179806b
--- /dev/null
+++ b/test/react-js-make-props-and-state-transform/multiple-components/input.tsx
@@ -0,0 +1,20 @@
+import * as React from 'react';
+
+export default class MyComponent extends React.Component {
+ render() {
+ return ;
+ }
+
+ onclick() {
+ this.setState({foo: 1, bar: 2})
+ }
+}
+
+export class AnotherComponent extends React.Component {
+ static propTypes = {
+ foo: React.PropTypes.string.isRequired,
+ };
+ render() {
+ return
;
+ }
+}
diff --git a/test/react-js-make-props-and-state-transform/multiple-components/output.tsx b/test/react-js-make-props-and-state-transform/multiple-components/output.tsx
new file mode 100644
index 0000000..c5fdde8
--- /dev/null
+++ b/test/react-js-make-props-and-state-transform/multiple-components/output.tsx
@@ -0,0 +1,21 @@
+import * as React from 'react';
+type MyComponentState = { foo: number, bar: number };
+export default class MyComponent extends React.Component<{}, MyComponentState> {
+ render() {
+ return ;
+ }
+ onclick() {
+ this.setState({ foo: 1, bar: 2 });
+ }
+}
+type AnotherComponentProps = {
+ foo: string,
+};
+export class AnotherComponent extends React.Component {
+ static propTypes = {
+ foo: React.PropTypes.string.isRequired,
+ };
+ render() {
+ return
;
+ }
+}
diff --git a/test/react-js-make-props-and-state-transform/non-react/output.tsx b/test/react-js-make-props-and-state-transform/non-react/output.tsx
index 8b8eec9..a0b04ce 100644
--- a/test/react-js-make-props-and-state-transform/non-react/output.tsx
+++ b/test/react-js-make-props-and-state-transform/non-react/output.tsx
@@ -1,18 +1,5 @@
-interface IFoo {
-
-}
-class Foo {
-
-}
-
-class Bar extends Foo {
-
-}
-
-class Foo2 implements IFoo {
-
-}
-
-class Bar2 extends Foo implements IFoo {
-
-}
+interface IFoo {}
+class Foo {}
+class Bar extends Foo {}
+class Foo2 implements IFoo {}
+class Bar2 extends Foo implements IFoo {}
diff --git a/test/react-js-make-props-and-state-transform/propless-stateless/output.tsx b/test/react-js-make-props-and-state-transform/propless-stateless/output.tsx
index ab0d702..c98cfbd 100644
--- a/test/react-js-make-props-and-state-transform/propless-stateless/output.tsx
+++ b/test/react-js-make-props-and-state-transform/propless-stateless/output.tsx
@@ -1,5 +1,4 @@
import * as React from 'react';
-
export default class MyComponent extends React.Component<{}, {}> {
render() {
return
;
diff --git a/test/react-js-make-props-and-state-transform/set-state-advanced/output.tsx b/test/react-js-make-props-and-state-transform/set-state-advanced/output.tsx
index a254578..f8dc221 100644
--- a/test/react-js-make-props-and-state-transform/set-state-advanced/output.tsx
+++ b/test/react-js-make-props-and-state-transform/set-state-advanced/output.tsx
@@ -1,17 +1,17 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{}, { foo: number; bar: number; } & { baz: number; } & { something: { big: number; here: string; of: { a: number; }[]; }; }> {
+type MyComponentState = { foo: number, bar: number } & { baz: number } & {
+ something: { big: number, here: string, of: { a: number }[] },
+};
+export default class MyComponent extends React.Component<{}, MyComponentState> {
render() {
- return ;
+ return ;
}
-
onclick() {
if (Math.random() > 0.5) {
this.setState({ foo: 1, bar: 2 });
}
this.otherMethod();
}
-
otherMethod() {
for (const foo of [1, 2, 3]) {
if (foo > 2) {
@@ -19,14 +19,13 @@ export default class MyComponent extends React.Component<{}, { foo: number; bar:
}
}
}
-
addLargeObjectToState() {
this.setState({
something: {
big: 123,
here: 'string',
- of: [{ a: 1 }, { a: 2 }]
- }
+ of: [{ a: 1 }, { a: 2 }],
+ },
});
}
}
diff --git a/test/react-js-make-props-and-state-transform/set-state-only/output.tsx b/test/react-js-make-props-and-state-transform/set-state-only/output.tsx
index 3795804..ef4e928 100644
--- a/test/react-js-make-props-and-state-transform/set-state-only/output.tsx
+++ b/test/react-js-make-props-and-state-transform/set-state-only/output.tsx
@@ -1,10 +1,9 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{}, { foo: number; bar: number; }> {
+type MyComponentState = { foo: number, bar: number };
+export default class MyComponent extends React.Component<{}, MyComponentState> {
render() {
- return ;
+ return ;
}
-
onclick() {
this.setState({ foo: 1, bar: 2 });
}
diff --git a/test/react-js-make-props-and-state-transform/state-in-class-member/output.tsx b/test/react-js-make-props-and-state-transform/state-in-class-member/output.tsx
index d9b4578..760b6bd 100644
--- a/test/react-js-make-props-and-state-transform/state-in-class-member/output.tsx
+++ b/test/react-js-make-props-and-state-transform/state-in-class-member/output.tsx
@@ -1,6 +1,6 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{}, { foo: number; }> {
+type MyComponentState = { foo: number };
+export default class MyComponent extends React.Component<{}, MyComponentState> {
state = { foo: 1 };
render() {
return
;
diff --git a/test/react-js-make-props-and-state-transform/state-in-constructor/output.tsx b/test/react-js-make-props-and-state-transform/state-in-constructor/output.tsx
index 0ee6051..338bd8d 100644
--- a/test/react-js-make-props-and-state-transform/state-in-constructor/output.tsx
+++ b/test/react-js-make-props-and-state-transform/state-in-constructor/output.tsx
@@ -1,11 +1,10 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{}, { foo: number; }> {
+type MyComponentState = { foo: number };
+export default class MyComponent extends React.Component<{}, MyComponentState> {
constructor(props, context) {
super(props, context);
this.state = { foo: 1 };
}
-
render() {
return
;
}
diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx
index 8f1e78d..b4206de 100644
--- a/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx
+++ b/test/react-js-make-props-and-state-transform/static-proptypes-getter-simple/output.tsx
@@ -1,8 +1,8 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{
- foo: string;
- }, {}> {
+type MyComponentProps = {
+ foo: string,
+};
+export default class MyComponent extends React.Component {
static get propTypes() {
return {
foo: React.PropTypes.string.isRequired,
diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-many-props/input.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-many-props/input.tsx
index 1e491c3..e54d2f4 100644
--- a/test/react-js-make-props-and-state-transform/static-proptypes-many-props/input.tsx
+++ b/test/react-js-make-props-and-state-transform/static-proptypes-many-props/input.tsx
@@ -12,6 +12,17 @@ export default class MyComponent extends React.Component {
string: React.PropTypes.string,
node: React.PropTypes.node,
element: React.PropTypes.element,
+ oneOf: React.PropTypes.oneOf(['a', 'b', 'c']),
+ oneOfType: React.PropTypes.oneOfType([
+ React.PropTypes.string,
+ React.PropTypes.number,
+ ]),
+ arrayOf: React.PropTypes.arrayOf(React.PropTypes.string),
+ objectOf: React.PropTypes.objectOf(React.PropTypes.string),
+ shape: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number,
+ }),
anyRequired: React.PropTypes.any.isRequired,
arrayRequired: React.PropTypes.array.isRequired,
boolRequired: React.PropTypes.bool.isRequired,
@@ -21,6 +32,17 @@ export default class MyComponent extends React.Component {
stringRequired: React.PropTypes.string.isRequired,
nodeRequired: React.PropTypes.node.isRequired,
elementRequired: React.PropTypes.element.isRequired,
+ oneOfRequired: React.PropTypes.oneOf(['a', 'b', 'c']).isRequired,
+ oneOfTypeRequired: React.PropTypes.oneOfType([
+ React.PropTypes.string,
+ React.PropTypes.number,
+ ]).isRequired,
+ arrayOfRequired: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
+ objectOfRequired: React.PropTypes.objectOf(React.PropTypes.string).isRequired,
+ shapeRequired: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number.isRequired,
+ }).isRequired,
};
render() {
return
;
diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx
index ed66ed3..7604480 100644
--- a/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx
+++ b/test/react-js-make-props-and-state-transform/static-proptypes-many-props/output.tsx
@@ -1,25 +1,45 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{
- any?: any;
- array?: any[];
- bool?: boolean;
- func?: (...args: any[]) => any;
- number?: number;
- object?: object;
- string?: string;
- node?: React.ReactNode;
- element?: JSX.Element;
- anyRequired: any;
- arrayRequired: any[];
- boolRequired: boolean;
- funcRequired: (...args: any[]) => any;
- numberRequired: number;
- objectRequired: object;
- stringRequired: string;
- nodeRequired: React.ReactNode;
- elementRequired: JSX.Element;
- }, {}> {
+type MyComponentProps = {
+ any?: any,
+ array?: any[],
+ bool?: boolean,
+ func?: (...args: any[]) => any,
+ number?: number,
+ object?: object,
+ string?: string,
+ node?: React.ReactNode,
+ element?: JSX.Element,
+ oneOf?: 'a' | 'b' | 'c',
+ oneOfType?: string | number,
+ arrayOf?: string[],
+ objectOf?: {
+ [key: string]: string,
+ },
+ shape?: {
+ color?: string,
+ fontSize?: number,
+ },
+ anyRequired: any,
+ arrayRequired: any[],
+ boolRequired: boolean,
+ funcRequired: (...args: any[]) => any,
+ numberRequired: number,
+ objectRequired: object,
+ stringRequired: string,
+ nodeRequired: React.ReactNode,
+ elementRequired: JSX.Element,
+ oneOfRequired: 'a' | 'b' | 'c',
+ oneOfTypeRequired: string | number,
+ arrayOfRequired: string[],
+ objectOfRequired: {
+ [key: string]: string,
+ },
+ shapeRequired: {
+ color?: string,
+ fontSize: number,
+ },
+};
+export default class MyComponent extends React.Component {
static propTypes = {
children: React.PropTypes.node,
any: React.PropTypes.any,
@@ -31,6 +51,14 @@ export default class MyComponent extends React.Component<{
string: React.PropTypes.string,
node: React.PropTypes.node,
element: React.PropTypes.element,
+ oneOf: React.PropTypes.oneOf(['a', 'b', 'c']),
+ oneOfType: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]),
+ arrayOf: React.PropTypes.arrayOf(React.PropTypes.string),
+ objectOf: React.PropTypes.objectOf(React.PropTypes.string),
+ shape: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number,
+ }),
anyRequired: React.PropTypes.any.isRequired,
arrayRequired: React.PropTypes.array.isRequired,
boolRequired: React.PropTypes.bool.isRequired,
@@ -40,6 +68,14 @@ export default class MyComponent extends React.Component<{
stringRequired: React.PropTypes.string.isRequired,
nodeRequired: React.PropTypes.node.isRequired,
elementRequired: React.PropTypes.element.isRequired,
+ oneOfRequired: React.PropTypes.oneOf(['a', 'b', 'c']).isRequired,
+ oneOfTypeRequired: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]).isRequired,
+ arrayOfRequired: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
+ objectOfRequired: React.PropTypes.objectOf(React.PropTypes.string).isRequired,
+ shapeRequired: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number.isRequired,
+ }).isRequired,
};
render() {
return
;
diff --git a/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx b/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx
index 2f06d43..1d7764e 100644
--- a/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx
+++ b/test/react-js-make-props-and-state-transform/static-proptypes-simple/output.tsx
@@ -1,8 +1,8 @@
import * as React from 'react';
-
-export default class MyComponent extends React.Component<{
- foo: string;
- }, {}> {
+type MyComponentProps = {
+ foo: string,
+};
+export default class MyComponent extends React.Component {
static propTypes = {
foo: React.PropTypes.string.isRequired,
};
diff --git a/test/react-move-prop-types-to-class-transform/multiple-components/input.tsx b/test/react-move-prop-types-to-class-transform/multiple-components/input.tsx
new file mode 100644
index 0000000..ca3b71d
--- /dev/null
+++ b/test/react-move-prop-types-to-class-transform/multiple-components/input.tsx
@@ -0,0 +1,19 @@
+class SomeComponent extends React.Component<{
+ foo: number;
+ }, {
+ bar: string;
+ }> {
+ render() {
+ return null;
+ }
+}
+SomeComponent.propTypes = { foo: React.PropTypes.string };
+
+class AnotherComponent extends React.Component<{
+ baz: number;
+}> {
+ render() {
+ return null;
+ }
+}
+AnotherComponent.propTypes = { baz: React.PropTypes.string };
diff --git a/test/react-move-prop-types-to-class-transform/multiple-components/output.tsx b/test/react-move-prop-types-to-class-transform/multiple-components/output.tsx
new file mode 100644
index 0000000..561bc3e
--- /dev/null
+++ b/test/react-move-prop-types-to-class-transform/multiple-components/output.tsx
@@ -0,0 +1,23 @@
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {
+ static propTypes = { foo: React.PropTypes.string };
+ render() {
+ return null;
+ }
+}
+SomeComponent.propTypes = { foo: React.PropTypes.string };
+class AnotherComponent extends React.Component<{
+ baz: number,
+}> {
+ static propTypes = { baz: React.PropTypes.string };
+ render() {
+ return null;
+ }
+}
+AnotherComponent.propTypes = { baz: React.PropTypes.string };
diff --git a/test/react-move-prop-types-to-class-transform/simple/output.tsx b/test/react-move-prop-types-to-class-transform/simple/output.tsx
index 005ab76..df8498f 100644
--- a/test/react-move-prop-types-to-class-transform/simple/output.tsx
+++ b/test/react-move-prop-types-to-class-transform/simple/output.tsx
@@ -1,12 +1,14 @@
-class SomeComponent extends React.Component<{
- foo: number;
- }, {
- bar: string;
- }> {
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {
static propTypes = { foo: React.PropTypes.string };
render() {
return null;
}
}
-
-SomeComponent.propTypes = { foo: React.PropTypes.string };
\ No newline at end of file
+SomeComponent.propTypes = { foo: React.PropTypes.string };
diff --git a/test/react-remove-prop-types-assignment-transform/functional-components/output.tsx b/test/react-remove-prop-types-assignment-transform/functional-components/output.tsx
index b7895a4..a2c1315 100644
--- a/test/react-remove-prop-types-assignment-transform/functional-components/output.tsx
+++ b/test/react-remove-prop-types-assignment-transform/functional-components/output.tsx
@@ -1,5 +1,2 @@
import * as React from 'react';
-
-function Foo() {
-
-}
+function Foo() {}
diff --git a/test/react-remove-prop-types-assignment-transform/multiple/input.tsx b/test/react-remove-prop-types-assignment-transform/multiple/input.tsx
index b5ce022..71e9e2f 100644
--- a/test/react-remove-prop-types-assignment-transform/multiple/input.tsx
+++ b/test/react-remove-prop-types-assignment-transform/multiple/input.tsx
@@ -1,8 +1,16 @@
class SomeComponent extends React.Component<{
- foo: number;
+ foo: string;
+ baz: string;
}, {
bar: string;
}> {
}
SomeComponent.propTypes = { foo: React.PropTypes.string };
-SomeComponent.propTypes.baz = React.PropTypes.string.isRequired;
\ No newline at end of file
+SomeComponent.propTypes.baz = React.PropTypes.string.isRequired;
+
+
+class AnotherComponent extends React.Component<{
+ lol: number;
+ }> {
+}
+AnotherComponent.propTypes = { lol: React.PropTypes.number };
diff --git a/test/react-remove-prop-types-assignment-transform/multiple/output.tsx b/test/react-remove-prop-types-assignment-transform/multiple/output.tsx
index 2f10f78..e9770db 100644
--- a/test/react-remove-prop-types-assignment-transform/multiple/output.tsx
+++ b/test/react-remove-prop-types-assignment-transform/multiple/output.tsx
@@ -1,6 +1,12 @@
-class SomeComponent extends React.Component<{
- foo: number;
- }, {
- bar: string;
- }> {
-}
\ No newline at end of file
+class SomeComponent extends React.Component<
+ {
+ foo: string,
+ baz: string,
+ },
+ {
+ bar: string,
+ },
+> {}
+class AnotherComponent extends React.Component<{
+ lol: number,
+}> {}
diff --git a/test/react-remove-prop-types-assignment-transform/simple/output.tsx b/test/react-remove-prop-types-assignment-transform/simple/output.tsx
index 2f10f78..f0cc47e 100644
--- a/test/react-remove-prop-types-assignment-transform/simple/output.tsx
+++ b/test/react-remove-prop-types-assignment-transform/simple/output.tsx
@@ -1,6 +1,8 @@
-class SomeComponent extends React.Component<{
- foo: number;
- }, {
- bar: string;
- }> {
-}
\ No newline at end of file
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {}
diff --git a/test/react-remove-prop-types-import/from-prop-types/input.tsx b/test/react-remove-prop-types-import/from-prop-types/input.tsx
new file mode 100644
index 0000000..97c16f2
--- /dev/null
+++ b/test/react-remove-prop-types-import/from-prop-types/input.tsx
@@ -0,0 +1,6 @@
+import PropTypes from 'prop-types'
+import React from 'react'
+
+export const Hello = ({ message }) => {
+ return hello {message}
+}
diff --git a/test/react-remove-prop-types-import/from-prop-types/output.tsx b/test/react-remove-prop-types-import/from-prop-types/output.tsx
new file mode 100644
index 0000000..b4a5929
--- /dev/null
+++ b/test/react-remove-prop-types-import/from-prop-types/output.tsx
@@ -0,0 +1,4 @@
+import React from 'react';
+export const Hello = ({ message }) => {
+ return hello {message}
;
+};
diff --git a/test/react-remove-prop-types-import/from-react-multi-named-import/input.tsx b/test/react-remove-prop-types-import/from-react-multi-named-import/input.tsx
new file mode 100644
index 0000000..23cd15f
--- /dev/null
+++ b/test/react-remove-prop-types-import/from-react-multi-named-import/input.tsx
@@ -0,0 +1,7 @@
+import React, { PropTypes, Component } from 'react';
+
+export class MyComponent extends Component {
+ render() {
+ return hello
;
+ }
+}
diff --git a/test/react-remove-prop-types-import/from-react-multi-named-import/output.tsx b/test/react-remove-prop-types-import/from-react-multi-named-import/output.tsx
new file mode 100644
index 0000000..106ed51
--- /dev/null
+++ b/test/react-remove-prop-types-import/from-react-multi-named-import/output.tsx
@@ -0,0 +1,6 @@
+import React, { Component } from 'react';
+export class MyComponent extends Component {
+ render() {
+ return hello
;
+ }
+}
diff --git a/test/react-remove-prop-types-import/from-react-simple/input.tsx b/test/react-remove-prop-types-import/from-react-simple/input.tsx
new file mode 100644
index 0000000..a9b9848
--- /dev/null
+++ b/test/react-remove-prop-types-import/from-react-simple/input.tsx
@@ -0,0 +1,5 @@
+import React, { PropTypes } from 'react'
+
+export const Hello = ({ message }) => {
+ return hello {message}
+}
diff --git a/test/react-remove-prop-types-import/from-react-simple/output.tsx b/test/react-remove-prop-types-import/from-react-simple/output.tsx
new file mode 100644
index 0000000..b4a5929
--- /dev/null
+++ b/test/react-remove-prop-types-import/from-react-simple/output.tsx
@@ -0,0 +1,4 @@
+import React from 'react';
+export const Hello = ({ message }) => {
+ return hello {message}
;
+};
diff --git a/test/react-remove-static-prop-types-member-transform/getter/output.tsx b/test/react-remove-static-prop-types-member-transform/getter/output.tsx
index 2f10f78..f0cc47e 100644
--- a/test/react-remove-static-prop-types-member-transform/getter/output.tsx
+++ b/test/react-remove-static-prop-types-member-transform/getter/output.tsx
@@ -1,6 +1,8 @@
-class SomeComponent extends React.Component<{
- foo: number;
- }, {
- bar: string;
- }> {
-}
\ No newline at end of file
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {}
diff --git a/test/react-remove-static-prop-types-member-transform/multiple-components/input.tsx b/test/react-remove-static-prop-types-member-transform/multiple-components/input.tsx
new file mode 100644
index 0000000..b8deaa2
--- /dev/null
+++ b/test/react-remove-static-prop-types-member-transform/multiple-components/input.tsx
@@ -0,0 +1,20 @@
+class SomeComponent extends React.Component<{
+ foo: number;
+ }, {
+ bar: string;
+ }> {
+ static propTypes = {
+ foo: React.PropTypes.string,
+ baz: React.PropTypes.string.isRequired,
+ };
+}
+
+class AnotherComponent extends React.Component<{
+ foo: number;
+ }, {
+ bar: string;
+ }> {
+ static propTypes = {
+ baz: React.PropTypes.string.isRequired,
+ };
+}
diff --git a/test/react-remove-static-prop-types-member-transform/multiple-components/output.tsx b/test/react-remove-static-prop-types-member-transform/multiple-components/output.tsx
new file mode 100644
index 0000000..6d90eb5
--- /dev/null
+++ b/test/react-remove-static-prop-types-member-transform/multiple-components/output.tsx
@@ -0,0 +1,16 @@
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {}
+class AnotherComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {}
diff --git a/test/react-remove-static-prop-types-member-transform/multiple/output.tsx b/test/react-remove-static-prop-types-member-transform/multiple/output.tsx
index 2f10f78..f0cc47e 100644
--- a/test/react-remove-static-prop-types-member-transform/multiple/output.tsx
+++ b/test/react-remove-static-prop-types-member-transform/multiple/output.tsx
@@ -1,6 +1,8 @@
-class SomeComponent extends React.Component<{
- foo: number;
- }, {
- bar: string;
- }> {
-}
\ No newline at end of file
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {}
diff --git a/test/react-remove-static-prop-types-member-transform/other-static-members/input.tsx b/test/react-remove-static-prop-types-member-transform/other-static-members/input.tsx
new file mode 100644
index 0000000..ed98022
--- /dev/null
+++ b/test/react-remove-static-prop-types-member-transform/other-static-members/input.tsx
@@ -0,0 +1,8 @@
+class SomeComponent extends React.Component<{
+ foo: number;
+}, {
+ bar: string;
+}> {
+ static propTypes = { foo: React.PropTypes.string };
+ static defaultProps = { foo: 'bar' };
+}
diff --git a/test/react-remove-static-prop-types-member-transform/other-static-members/output.tsx b/test/react-remove-static-prop-types-member-transform/other-static-members/output.tsx
new file mode 100644
index 0000000..c37607e
--- /dev/null
+++ b/test/react-remove-static-prop-types-member-transform/other-static-members/output.tsx
@@ -0,0 +1,10 @@
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {
+ static defaultProps = { foo: 'bar' };
+}
diff --git a/test/react-remove-static-prop-types-member-transform/simple/output.tsx b/test/react-remove-static-prop-types-member-transform/simple/output.tsx
index 2f10f78..f0cc47e 100644
--- a/test/react-remove-static-prop-types-member-transform/simple/output.tsx
+++ b/test/react-remove-static-prop-types-member-transform/simple/output.tsx
@@ -1,6 +1,8 @@
-class SomeComponent extends React.Component<{
- foo: number;
- }, {
- bar: string;
- }> {
-}
\ No newline at end of file
+class SomeComponent extends React.Component<
+ {
+ foo: number,
+ },
+ {
+ bar: string,
+ },
+> {}
diff --git a/test/react-stateless-function-make-props-transform/empty-prop/input.tsx b/test/react-stateless-function-make-props-transform/empty-prop/input.tsx
new file mode 100644
index 0000000..6831632
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/empty-prop/input.tsx
@@ -0,0 +1,6 @@
+function Hello() {
+ return
+}
+
+Hello.propTypes = {
+};
diff --git a/test/react-stateless-function-make-props-transform/empty-prop/output.tsx b/test/react-stateless-function-make-props-transform/empty-prop/output.tsx
new file mode 100644
index 0000000..ecb8d4a
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/empty-prop/output.tsx
@@ -0,0 +1,4 @@
+const Hello: React.SFC<{}> = () => {
+ return
;
+};
+Hello.propTypes = {};
diff --git a/test/react-stateless-function-make-props-transform/multiple-components/input.tsx b/test/react-stateless-function-make-props-transform/multiple-components/input.tsx
new file mode 100644
index 0000000..7b9d649
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/multiple-components/input.tsx
@@ -0,0 +1,15 @@
+const Hello = ({ message }) => {
+ return hello {message}
+};
+
+function Hey({ name }) {
+ return hey, {name}
+}
+
+Hey.propTypes = {
+ name: React.PropTypes.string.isRequired,
+}
+
+Hello.propTypes = {
+ message: React.PropTypes.string,
+}
diff --git a/test/react-stateless-function-make-props-transform/multiple-components/output.tsx b/test/react-stateless-function-make-props-transform/multiple-components/output.tsx
new file mode 100644
index 0000000..39f3039
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/multiple-components/output.tsx
@@ -0,0 +1,18 @@
+type HelloProps = {
+ message?: string,
+};
+const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
+type HeyProps = {
+ name: string,
+};
+const Hey: React.SFC = ({ name }) => {
+ return hey, {name}
;
+};
+Hey.propTypes = {
+ name: React.PropTypes.string.isRequired,
+};
+Hello.propTypes = {
+ message: React.PropTypes.string,
+};
diff --git a/test/react-stateless-function-make-props-transform/stateless-arrow-function/input.tsx b/test/react-stateless-function-make-props-transform/stateless-arrow-function/input.tsx
new file mode 100644
index 0000000..9ddb8b7
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-arrow-function/input.tsx
@@ -0,0 +1,7 @@
+const Hello = ({ message }) => {
+ return hello {message}
+};
+
+Hello.propTypes = {
+ message: React.PropTypes.string,
+}
diff --git a/test/react-stateless-function-make-props-transform/stateless-arrow-function/output.tsx b/test/react-stateless-function-make-props-transform/stateless-arrow-function/output.tsx
new file mode 100644
index 0000000..f706915
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-arrow-function/output.tsx
@@ -0,0 +1,9 @@
+type HelloProps = {
+ message?: string,
+};
+const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
+Hello.propTypes = {
+ message: React.PropTypes.string,
+};
diff --git a/test/react-stateless-function-make-props-transform/stateless-function-many-props/input.tsx b/test/react-stateless-function-make-props-transform/stateless-function-many-props/input.tsx
new file mode 100644
index 0000000..6847265
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-function-many-props/input.tsx
@@ -0,0 +1,48 @@
+import * as React from 'react';
+function MyComponent() {
+ return
+}
+
+MyComponent.propTypes = {
+ children: React.PropTypes.node,
+ any: React.PropTypes.any,
+ array: React.PropTypes.array,
+ bool: React.PropTypes.bool,
+ func: React.PropTypes.func,
+ number: React.PropTypes.number,
+ object: React.PropTypes.object,
+ string: React.PropTypes.string,
+ node: React.PropTypes.node,
+ element: React.PropTypes.element,
+ oneOf: React.PropTypes.oneOf(['a', 'b', 'c']),
+ oneOfType: React.PropTypes.oneOfType([
+ React.PropTypes.string,
+ React.PropTypes.number,
+ ]),
+ arrayOf: React.PropTypes.arrayOf(React.PropTypes.string),
+ objectOf: React.PropTypes.objectOf(React.PropTypes.string),
+ shape: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number,
+ }),
+ anyRequired: React.PropTypes.any.isRequired,
+ arrayRequired: React.PropTypes.array.isRequired,
+ boolRequired: React.PropTypes.bool.isRequired,
+ funcRequired: React.PropTypes.func.isRequired,
+ numberRequired: React.PropTypes.number.isRequired,
+ objectRequired: React.PropTypes.object.isRequired,
+ stringRequired: React.PropTypes.string.isRequired,
+ nodeRequired: React.PropTypes.node.isRequired,
+ elementRequired: React.PropTypes.element.isRequired,
+ oneOfRequired: React.PropTypes.oneOf(['a', 'b', 'c']).isRequired,
+ oneOfTypeRequired: React.PropTypes.oneOfType([
+ React.PropTypes.string,
+ React.PropTypes.number,
+ ]).isRequired,
+ arrayOfRequired: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
+ objectOfRequired: React.PropTypes.objectOf(React.PropTypes.string).isRequired,
+ shapeRequired: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number.isRequired,
+ }).isRequired,
+};
diff --git a/test/react-stateless-function-make-props-transform/stateless-function-many-props/output.tsx b/test/react-stateless-function-make-props-transform/stateless-function-many-props/output.tsx
new file mode 100644
index 0000000..f68ac25
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-function-many-props/output.tsx
@@ -0,0 +1,81 @@
+import * as React from 'react';
+type MyComponentProps = {
+ any?: any,
+ array?: any[],
+ bool?: boolean,
+ func?: (...args: any[]) => any,
+ number?: number,
+ object?: object,
+ string?: string,
+ node?: React.ReactNode,
+ element?: JSX.Element,
+ oneOf?: 'a' | 'b' | 'c',
+ oneOfType?: string | number,
+ arrayOf?: string[],
+ objectOf?: {
+ [key: string]: string,
+ },
+ shape?: {
+ color?: string,
+ fontSize?: number,
+ },
+ anyRequired: any,
+ arrayRequired: any[],
+ boolRequired: boolean,
+ funcRequired: (...args: any[]) => any,
+ numberRequired: number,
+ objectRequired: object,
+ stringRequired: string,
+ nodeRequired: React.ReactNode,
+ elementRequired: JSX.Element,
+ oneOfRequired: 'a' | 'b' | 'c',
+ oneOfTypeRequired: string | number,
+ arrayOfRequired: string[],
+ objectOfRequired: {
+ [key: string]: string,
+ },
+ shapeRequired: {
+ color?: string,
+ fontSize: number,
+ },
+};
+const MyComponent: React.SFC = () => {
+ return
;
+};
+MyComponent.propTypes = {
+ children: React.PropTypes.node,
+ any: React.PropTypes.any,
+ array: React.PropTypes.array,
+ bool: React.PropTypes.bool,
+ func: React.PropTypes.func,
+ number: React.PropTypes.number,
+ object: React.PropTypes.object,
+ string: React.PropTypes.string,
+ node: React.PropTypes.node,
+ element: React.PropTypes.element,
+ oneOf: React.PropTypes.oneOf(['a', 'b', 'c']),
+ oneOfType: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]),
+ arrayOf: React.PropTypes.arrayOf(React.PropTypes.string),
+ objectOf: React.PropTypes.objectOf(React.PropTypes.string),
+ shape: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number,
+ }),
+ anyRequired: React.PropTypes.any.isRequired,
+ arrayRequired: React.PropTypes.array.isRequired,
+ boolRequired: React.PropTypes.bool.isRequired,
+ funcRequired: React.PropTypes.func.isRequired,
+ numberRequired: React.PropTypes.number.isRequired,
+ objectRequired: React.PropTypes.object.isRequired,
+ stringRequired: React.PropTypes.string.isRequired,
+ nodeRequired: React.PropTypes.node.isRequired,
+ elementRequired: React.PropTypes.element.isRequired,
+ oneOfRequired: React.PropTypes.oneOf(['a', 'b', 'c']).isRequired,
+ oneOfTypeRequired: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]).isRequired,
+ arrayOfRequired: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
+ objectOfRequired: React.PropTypes.objectOf(React.PropTypes.string).isRequired,
+ shapeRequired: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ fontSize: React.PropTypes.number.isRequired,
+ }).isRequired,
+};
diff --git a/test/react-stateless-function-make-props-transform/stateless-function/input.tsx b/test/react-stateless-function-make-props-transform/stateless-function/input.tsx
new file mode 100644
index 0000000..fd1d4ce
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-function/input.tsx
@@ -0,0 +1,7 @@
+function Hello({ message }) {
+ return hello {message}
;
+}
+
+Hello.propTypes = {
+ message: React.PropTypes.string,
+};
diff --git a/test/react-stateless-function-make-props-transform/stateless-function/output.tsx b/test/react-stateless-function-make-props-transform/stateless-function/output.tsx
new file mode 100644
index 0000000..f706915
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-function/output.tsx
@@ -0,0 +1,9 @@
+type HelloProps = {
+ message?: string,
+};
+const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
+Hello.propTypes = {
+ message: React.PropTypes.string,
+};
diff --git a/test/react-stateless-function-make-props-transform/stateless-propless/input.tsx b/test/react-stateless-function-make-props-transform/stateless-propless/input.tsx
new file mode 100644
index 0000000..40da377
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-propless/input.tsx
@@ -0,0 +1,6 @@
+const Hello1 = ({ message }) => {
+ return hello {message}
;
+};
+function Hello2({ message }) {
+ return hello {message}
;
+}
diff --git a/test/react-stateless-function-make-props-transform/stateless-propless/output.tsx b/test/react-stateless-function-make-props-transform/stateless-propless/output.tsx
new file mode 100644
index 0000000..c0f444c
--- /dev/null
+++ b/test/react-stateless-function-make-props-transform/stateless-propless/output.tsx
@@ -0,0 +1,6 @@
+const Hello1 = ({ message }) => {
+ return hello {message}
;
+};
+function Hello2({ message }) {
+ return hello {message}
;
+}
diff --git a/test/runner.ts b/test/transformers.test.ts
similarity index 65%
rename from test/runner.ts
rename to test/transformers.test.ts
index 6b6e725..8b845d4 100644
--- a/test/runner.ts
+++ b/test/transformers.test.ts
@@ -7,14 +7,17 @@ import * as path from 'path';
import * as fs from 'fs';
import * as ts from 'typescript';
import * as chalk from 'chalk';
+import * as _ from 'lodash';
+
import {
- reactHoistGenericsTransformFactoryFactory,
reactJSMakePropsAndStateInterfaceTransformFactoryFactory,
+ reactStatelessFunctionMakePropsTransformFactoryFactory,
reactMovePropTypesToClassTransformFactoryFactory,
reactRemovePropTypesAssignmentTransformFactoryFactory,
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
- allTransforms,
collapseIntersectionInterfacesTransformFactoryFactory,
+ reactRemovePropTypesImportTransformFactoryFactory,
+ allTransforms,
compile,
TransformFactoryFactory
} from '../src';
@@ -23,14 +26,17 @@ import {
/** Map between a transform and its test folder */
const transformToFolderMap: [string, TransformFactoryFactory[]][] = [
['react-js-make-props-and-state-transform', [reactJSMakePropsAndStateInterfaceTransformFactoryFactory]],
- ['react-hoist-generics-transform', [reactHoistGenericsTransformFactoryFactory]],
+ ['react-stateless-function-make-props-transform', [reactStatelessFunctionMakePropsTransformFactoryFactory]],
['react-remove-static-prop-types-member-transform', [reactRemoveStaticPropTypesMemberTransformFactoryFactory]],
['react-remove-prop-types-assignment-transform', [reactRemovePropTypesAssignmentTransformFactoryFactory]],
['collapse-intersection-interfaces-transform', [collapseIntersectionInterfacesTransformFactoryFactory]],
['react-move-prop-types-to-class-transform', [reactMovePropTypesToClassTransformFactoryFactory]],
+ ['react-remove-prop-types-import', [reactRemovePropTypesImportTransformFactoryFactory]],
['end-to-end', allTransforms],
];
+const isJestUpdateSnapshotEnabled = !!_.intersection(process.argv, ['-u', '--updateSnapshot']).length;
+
for (const [testFolderName, getFactory] of transformToFolderMap) {
describe(testFolderName.replace(/\-/g, ' ').replace('transform', ''), () => {
for (const folderName of fs.readdirSync(path.join(__dirname, testFolderName))) {
@@ -38,8 +44,17 @@ for (const [testFolderName, getFactory] of transformToFolderMap) {
if (fs.statSync(folder).isDirectory()) {
it(`${testFolderName} ${folderName}`, async () => {
const inputPath = path.join(folder, 'input.tsx');
- const output = await readFile(path.join(folder, 'output.tsx'));
- const result = compile(inputPath, getFactory);
+ const outputPath = path.join(folder, 'output.tsx');
+ const result = compile(inputPath, getFactory, {
+ singleQuote: true,
+ printWidth: 120,
+ tabWidth: 4,
+ trailingComma: 'all',
+ });
+ if (isJestUpdateSnapshotEnabled) {
+ await writeFile(outputPath, result);
+ }
+ const output = await readFile(outputPath);
expect(stripEmptyLines(result)).toEqual(stripEmptyLines(output));
});
}
@@ -68,3 +83,17 @@ function readFile(pathToFile: string) {
});
});
}
+
+/**
+ * Read a file
+ * @param pathToFile Path to a string file
+ * @param contents Contents of the file
+ */
+function writeFile(pathToFile: string, contents: string) {
+ return new Promise((resolve, reject) => {
+ fs.writeFile(pathToFile, contents, (error) => {
+ if (error) { return reject(error); }
+ resolve();
+ });
+ });
+}
diff --git a/tsconfig.json b/tsconfig.json
index 61d9587..0a2ed71 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,19 +7,12 @@
"module": "commonjs",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
+ "downlevelIteration": true,
"sourceMap": true,
"outDir": "dist",
- "sourceRoot": "../src"
+ "sourceRoot": "../src",
+ "lib": ["dom", "es2015"]
},
- "exclude": [
- "node_modules",
- "test"
- ],
- "types": [
- "node",
- "jest"
- ],
- "lib": [
- "es2017"
- ]
+ "exclude": ["node_modules", "test", "dist"],
+ "types": ["node", "jest"]
}
diff --git a/tslint.json b/tslint.json
index e4fe9c4..47497f9 100644
--- a/tslint.json
+++ b/tslint.json
@@ -4,25 +4,11 @@
},
"defaultSeverity": "warning",
"rules": {
- "quotemark": [
- true,
- "single",
- "avoid-escape"
- ],
- "max-line-length": [
- true,
- 120
- ],
- "indent": [
- "error",
- 4
- ],
- "only-arrow-functions": [
- false
- ],
+ "quotemark": [true, "single", "avoid-escape"],
+ "max-line-length": [false],
+ "indent": ["error", 4],
+ "only-arrow-functions": [false],
// Disabled rules
- "typedef": [
- false
- ]
+ "typedef": [false]
}
-}
\ No newline at end of file
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..fcb2ae6
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,3896 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0-beta.35":
+ version "7.0.0-beta.47"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27"
+ dependencies:
+ "@babel/highlight" "7.0.0-beta.47"
+
+"@babel/highlight@7.0.0-beta.47":
+ version "7.0.0-beta.47"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@types/chalk@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@types/chalk/-/chalk-2.2.0.tgz#b7f6e446f4511029ee8e3f43075fb5b73fbaa0ba"
+ dependencies:
+ chalk "*"
+
+"@types/commander@^2.9.1":
+ version "2.12.2"
+ resolved "https://registry.yarnpkg.com/@types/commander/-/commander-2.12.2.tgz#183041a23842d4281478fa5d23c5ca78e6fd08ae"
+ dependencies:
+ commander "*"
+
+"@types/detect-indent@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@types/detect-indent/-/detect-indent-5.0.0.tgz#8b1bbd7891268d5ed20d23ecd23ae333d33934cd"
+
+"@types/events@*":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@types/events/-/events-1.1.0.tgz#93b1be91f63c184450385272c47b6496fd028e02"
+
+"@types/glob@^5.0.35":
+ version "5.0.35"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
+ dependencies:
+ "@types/events" "*"
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/jest@^22.2.3":
+ version "22.2.3"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d"
+
+"@types/lodash@^4.14.109":
+ version "4.14.109"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.109.tgz#b1c4442239730bf35cabaf493c772b18c045886d"
+
+"@types/minimatch@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+
+"@types/node@*":
+ version "9.3.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5"
+
+"@types/node@^10.1.2":
+ version "10.1.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6"
+
+"@types/prettier@^1.12.2":
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.12.2.tgz#4a37f0aa8ed20366ada6fa7994b1c6dfe787fdd1"
+
+"@types/react@^16.3.14":
+ version "16.3.14"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.14.tgz#f90ac6834de172e13ecca430dcb6814744225d36"
+ dependencies:
+ csstype "^2.2.0"
+
+abab@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-globals@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+ dependencies:
+ acorn "^5.0.0"
+
+acorn@^5.0.0, acorn@^5.3.0:
+ version "5.5.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
+
+ajv@^5.1.0:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-escapes@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.1.0, ansi-styles@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+any-observable@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
+
+anymatch@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+ dependencies:
+ micromatch "^2.1.5"
+ normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+app-root-path@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arrify@^1.0.0, arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+astral-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-limiter@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+async@^1.4.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.1.4:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
+ dependencies:
+ lodash "^4.14.0"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.0, babel-core@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.0"
+ debug "^2.6.8"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.7"
+ slash "^1.0.0"
+ source-map "^0.5.6"
+
+babel-core@^6.26.3:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.18.0, babel-generator@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.6"
+ trim-right "^1.0.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-jest@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d"
+ dependencies:
+ babel-plugin-istanbul "^4.1.5"
+ babel-preset-jest "^22.4.4"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.1.5, babel-plugin-istanbul@^4.1.6:
+ version "4.1.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.10.1"
+ test-exclude "^4.2.1"
+
+babel-plugin-jest-hoist@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b"
+
+babel-plugin-syntax-object-rest-spread@^6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.26.2:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-jest@^22.4.3, babel-preset-jest@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39"
+ dependencies:
+ babel-plugin-jest-hoist "^22.4.4"
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+boom@4.x.x:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+ dependencies:
+ hoek "4.x.x"
+
+boom@5.x.x:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+ dependencies:
+ hoek "4.x.x"
+
+brace-expansion@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+browser-process-hrtime@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-resolve@^1.11.2:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+ dependencies:
+ resolve "1.1.7"
+
+bser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
+
+builtin-modules@^1.0.0, builtin-modules@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+capture-exit@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f"
+ dependencies:
+ rsvp "^3.3.3"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@*, chalk@^2.3.1, chalk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
+ dependencies:
+ ansi-styles "^3.1.0"
+ escape-string-regexp "^1.0.5"
+ supports-color "^4.0.0"
+
+chokidar@^1.6.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+ci-info@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli-cursor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-spinners@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
+
+cli-truncate@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
+ dependencies:
+ slice-ansi "0.0.4"
+ string-width "^1.0.1"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+ dependencies:
+ string-width "^2.1.1"
+ strip-ansi "^4.0.0"
+ wrap-ansi "^2.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
+ dependencies:
+ color-name "^1.1.1"
+
+color-name@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@*, commander@^2.12.1, commander@^2.9.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commander@^2.14.1, commander@^2.15.1:
+ version "2.15.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+
+compare-versions@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.2.1.tgz#a49eb7689d4caaf0b6db5220173fd279614000f7"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+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@^2.4.0, core-js@^2.5.0:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cosmiconfig@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+ require-from-string "^2.0.1"
+
+cpx@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f"
+ dependencies:
+ babel-runtime "^6.9.2"
+ chokidar "^1.6.0"
+ duplexer "^0.1.1"
+ glob "^7.0.5"
+ glob2base "^0.0.12"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ resolve "^1.1.7"
+ safe-buffer "^5.0.1"
+ shell-quote "^1.6.1"
+ subarg "^1.0.0"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cryptiles@3.x.x:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+ dependencies:
+ boom "5.x.x"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+ version "0.2.37"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+ dependencies:
+ cssom "0.3.x"
+
+csstype@^2.2.0:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.2.tgz#4534308476ceede8fbe148b9b99f9baf1c80fa06"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+data-urls@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f"
+ dependencies:
+ abab "^1.0.4"
+ whatwg-mimetype "^2.0.0"
+ whatwg-url "^6.4.0"
+
+date-fns@^1.27.2:
+ version "1.29.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+
+deep-extend@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ dependencies:
+ strip-bom "^2.0.0"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-indent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-newline@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
+diff@^3.1.0, diff@^3.2.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+
+domexception@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+ dependencies:
+ webidl-conversions "^4.0.2"
+
+duplexer@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+elegant-spinner@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.5.1:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.1"
+ has "^1.0.1"
+ is-callable "^1.1.3"
+ is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esprima@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+exec-sh@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
+ dependencies:
+ merge "^1.1.3"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+expect@^22.4.0:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674"
+ dependencies:
+ ansi-styles "^3.2.0"
+ jest-diff "^22.4.3"
+ jest-get-type "^22.4.3"
+ jest-matcher-utils "^22.4.3"
+ jest-message-util "^22.4.3"
+ jest-regex-util "^22.4.3"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fb-watchman@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+ dependencies:
+ bser "^2.0.0"
+
+figures@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-index@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
+
+find-parent-dir@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.1, for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-extra@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0, fsevents@^1.2.3:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-own-enumerable-property-symbols@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob2base@^0.0.12:
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
+ dependencies:
+ find-index "^0.1.1"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+growly@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+handlebars@^4.0.3:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+ dependencies:
+ async "^1.4.0"
+ optimist "^0.6.1"
+ source-map "^0.4.4"
+ optionalDependencies:
+ uglify-js "^2.6"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+ dependencies:
+ ajv "^5.1.0"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hawk@~6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+ dependencies:
+ boom "4.x.x"
+ cryptiles "3.x.x"
+ hoek "4.x.x"
+ sntp "2.x.x"
+
+hoek@4.x.x:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+html-encoding-sniffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+husky@^0.14.3:
+ version "0.14.3"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3"
+ dependencies:
+ is-ci "^1.0.10"
+ normalize-path "^1.0.0"
+ strip-indent "^2.0.0"
+
+iconv-lite@0.4.19:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+import-local@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+ dependencies:
+ pkg-dir "^2.0.0"
+ resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ dependencies:
+ repeating "^2.0.0"
+
+indent-string@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+invariant@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-ci@^1.0.10:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
+ dependencies:
+ ci-info "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-generator-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-observable@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2"
+ dependencies:
+ symbol-observable "^0.2.2"
+
+is-odd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+ dependencies:
+ is-number "^4.0.0"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.14:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954"
+ dependencies:
+ async "^2.1.4"
+ compare-versions "^3.1.0"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.2.0"
+ istanbul-lib-hook "^1.2.0"
+ istanbul-lib-instrument "^1.10.1"
+ istanbul-lib-report "^1.1.4"
+ istanbul-lib-source-maps "^1.2.4"
+ istanbul-reports "^1.3.0"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-lib-coverage@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341"
+
+istanbul-lib-hook@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c"
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.18.0"
+ istanbul-lib-coverage "^1.2.0"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5"
+ dependencies:
+ istanbul-lib-coverage "^1.2.0"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6"
+ dependencies:
+ debug "^3.1.0"
+ istanbul-lib-coverage "^1.1.2"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-lib-source-maps@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7"
+ dependencies:
+ debug "^3.1.0"
+ istanbul-lib-coverage "^1.2.0"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554"
+ dependencies:
+ handlebars "^4.0.3"
+
+jest-changed-files@^22.2.0:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2"
+ dependencies:
+ throat "^4.0.0"
+
+jest-cli@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90"
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.1"
+ exit "^0.1.2"
+ glob "^7.1.2"
+ graceful-fs "^4.1.11"
+ import-local "^1.0.0"
+ is-ci "^1.0.10"
+ istanbul-api "^1.1.14"
+ istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-instrument "^1.8.0"
+ istanbul-lib-source-maps "^1.2.1"
+ jest-changed-files "^22.2.0"
+ jest-config "^22.4.4"
+ jest-environment-jsdom "^22.4.1"
+ jest-get-type "^22.1.0"
+ jest-haste-map "^22.4.2"
+ jest-message-util "^22.4.0"
+ jest-regex-util "^22.1.0"
+ jest-resolve-dependencies "^22.1.0"
+ jest-runner "^22.4.4"
+ jest-runtime "^22.4.4"
+ jest-snapshot "^22.4.0"
+ jest-util "^22.4.1"
+ jest-validate "^22.4.4"
+ jest-worker "^22.2.2"
+ micromatch "^2.3.11"
+ node-notifier "^5.2.1"
+ realpath-native "^1.0.0"
+ rimraf "^2.5.4"
+ slash "^1.0.0"
+ string-length "^2.0.0"
+ strip-ansi "^4.0.0"
+ which "^1.2.12"
+ yargs "^10.0.3"
+
+jest-config@^22.4.3, jest-config@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a"
+ dependencies:
+ chalk "^2.0.1"
+ glob "^7.1.1"
+ jest-environment-jsdom "^22.4.1"
+ jest-environment-node "^22.4.1"
+ jest-get-type "^22.1.0"
+ jest-jasmine2 "^22.4.4"
+ jest-regex-util "^22.1.0"
+ jest-resolve "^22.4.2"
+ jest-util "^22.4.1"
+ jest-validate "^22.4.4"
+ pretty-format "^22.4.0"
+
+jest-diff@^22.4.0, jest-diff@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030"
+ dependencies:
+ chalk "^2.0.1"
+ diff "^3.2.0"
+ jest-get-type "^22.4.3"
+ pretty-format "^22.4.3"
+
+jest-docblock@^22.4.0, jest-docblock@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19"
+ dependencies:
+ detect-newline "^2.1.0"
+
+jest-environment-jsdom@^22.4.1:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e"
+ dependencies:
+ jest-mock "^22.4.3"
+ jest-util "^22.4.3"
+ jsdom "^11.5.1"
+
+jest-environment-node@^22.4.1:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129"
+ dependencies:
+ jest-mock "^22.4.3"
+ jest-util "^22.4.3"
+
+jest-get-type@^22.1.0, jest-get-type@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
+
+jest-haste-map@^22.4.2:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b"
+ dependencies:
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.1.11"
+ jest-docblock "^22.4.3"
+ jest-serializer "^22.4.3"
+ jest-worker "^22.4.3"
+ micromatch "^2.3.11"
+ sane "^2.0.0"
+
+jest-jasmine2@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23"
+ dependencies:
+ chalk "^2.0.1"
+ co "^4.6.0"
+ expect "^22.4.0"
+ graceful-fs "^4.1.11"
+ is-generator-fn "^1.0.0"
+ jest-diff "^22.4.0"
+ jest-matcher-utils "^22.4.0"
+ jest-message-util "^22.4.0"
+ jest-snapshot "^22.4.0"
+ jest-util "^22.4.1"
+ source-map-support "^0.5.0"
+
+jest-leak-detector@^22.4.0:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35"
+ dependencies:
+ pretty-format "^22.4.3"
+
+jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff"
+ dependencies:
+ chalk "^2.0.1"
+ jest-get-type "^22.4.3"
+ pretty-format "^22.4.3"
+
+jest-message-util@^22.4.0, jest-message-util@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7"
+ dependencies:
+ "@babel/code-frame" "^7.0.0-beta.35"
+ chalk "^2.0.1"
+ micromatch "^2.3.11"
+ slash "^1.0.0"
+ stack-utils "^1.0.1"
+
+jest-mock@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7"
+
+jest-regex-util@^22.1.0, jest-regex-util@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af"
+
+jest-resolve-dependencies@^22.1.0:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e"
+ dependencies:
+ jest-regex-util "^22.4.3"
+
+jest-resolve@^22.4.2:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea"
+ dependencies:
+ browser-resolve "^1.11.2"
+ chalk "^2.0.1"
+
+jest-runner@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907"
+ dependencies:
+ exit "^0.1.2"
+ jest-config "^22.4.4"
+ jest-docblock "^22.4.0"
+ jest-haste-map "^22.4.2"
+ jest-jasmine2 "^22.4.4"
+ jest-leak-detector "^22.4.0"
+ jest-message-util "^22.4.0"
+ jest-runtime "^22.4.4"
+ jest-util "^22.4.1"
+ jest-worker "^22.2.2"
+ throat "^4.0.0"
+
+jest-runtime@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^22.4.4"
+ babel-plugin-istanbul "^4.1.5"
+ chalk "^2.0.1"
+ convert-source-map "^1.4.0"
+ exit "^0.1.2"
+ graceful-fs "^4.1.11"
+ jest-config "^22.4.4"
+ jest-haste-map "^22.4.2"
+ jest-regex-util "^22.1.0"
+ jest-resolve "^22.4.2"
+ jest-util "^22.4.1"
+ jest-validate "^22.4.4"
+ json-stable-stringify "^1.0.1"
+ micromatch "^2.3.11"
+ realpath-native "^1.0.0"
+ slash "^1.0.0"
+ strip-bom "3.0.0"
+ write-file-atomic "^2.1.0"
+ yargs "^10.0.3"
+
+jest-serializer@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436"
+
+jest-snapshot@^22.4.0:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2"
+ dependencies:
+ chalk "^2.0.1"
+ jest-diff "^22.4.3"
+ jest-matcher-utils "^22.4.3"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^22.4.3"
+
+jest-util@^22.4.1, jest-util@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac"
+ dependencies:
+ callsites "^2.0.0"
+ chalk "^2.0.1"
+ graceful-fs "^4.1.11"
+ is-ci "^1.0.10"
+ jest-message-util "^22.4.3"
+ mkdirp "^0.5.1"
+ source-map "^0.6.0"
+
+jest-validate@^22.4.0, jest-validate@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d"
+ dependencies:
+ chalk "^2.0.1"
+ jest-config "^22.4.4"
+ jest-get-type "^22.1.0"
+ leven "^2.1.0"
+ pretty-format "^22.4.0"
+
+jest-worker@^22.2.2, jest-worker@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b"
+ dependencies:
+ merge-stream "^1.0.1"
+
+jest@^22.4.4:
+ version "22.4.4"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.4.tgz#ffb36c9654b339a13e10b3d4b338eb3e9d49f6eb"
+ dependencies:
+ import-local "^1.0.0"
+ jest-cli "^22.4.4"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.7.0, js-yaml@^3.9.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^11.5.1:
+ version "11.10.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.10.0.tgz#a42cd54e88895dc765f03f15b807a474962ac3b5"
+ dependencies:
+ abab "^1.0.4"
+ acorn "^5.3.0"
+ acorn-globals "^4.1.0"
+ array-equal "^1.0.0"
+ cssom ">= 0.3.2 < 0.4.0"
+ cssstyle ">= 0.2.37 < 0.3.0"
+ data-urls "^1.0.0"
+ domexception "^1.0.0"
+ escodegen "^1.9.0"
+ html-encoding-sniffer "^1.0.2"
+ left-pad "^1.2.0"
+ nwmatcher "^1.4.3"
+ parse5 "4.0.0"
+ pn "^1.1.0"
+ request "^2.83.0"
+ request-promise-native "^1.0.5"
+ sax "^1.2.4"
+ symbol-tree "^3.2.2"
+ tough-cookie "^2.3.3"
+ w3c-hr-time "^1.0.1"
+ webidl-conversions "^4.0.2"
+ whatwg-encoding "^1.0.3"
+ whatwg-mimetype "^2.1.0"
+ whatwg-url "^6.4.0"
+ ws "^4.0.0"
+ xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+json-parse-better-errors@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a"
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+left-pad@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
+
+leven@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lint-staged@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.1.1.tgz#bcdb5de76a6b52db6b2cf83fce62aee95baf7fa0"
+ dependencies:
+ app-root-path "^2.0.1"
+ chalk "^2.3.1"
+ commander "^2.14.1"
+ cosmiconfig "^4.0.0"
+ debug "^3.1.0"
+ dedent "^0.7.0"
+ execa "^0.9.0"
+ find-parent-dir "^0.3.0"
+ is-glob "^4.0.0"
+ is-windows "^1.0.2"
+ jest-validate "^22.4.0"
+ listr "^0.13.0"
+ lodash "^4.17.5"
+ log-symbols "^2.2.0"
+ micromatch "^3.1.8"
+ npm-which "^3.0.1"
+ p-map "^1.1.1"
+ path-is-inside "^1.0.2"
+ pify "^3.0.0"
+ please-upgrade-node "^3.0.2"
+ staged-git-files "1.1.1"
+ string-argv "^0.0.2"
+ stringify-object "^3.2.2"
+
+listr-silent-renderer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+
+listr-update-renderer@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
+ dependencies:
+ chalk "^1.1.3"
+ cli-truncate "^0.2.1"
+ elegant-spinner "^1.0.1"
+ figures "^1.7.0"
+ indent-string "^3.0.0"
+ log-symbols "^1.0.2"
+ log-update "^1.0.2"
+ strip-ansi "^3.0.1"
+
+listr-verbose-renderer@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
+ dependencies:
+ chalk "^1.1.3"
+ cli-cursor "^1.0.2"
+ date-fns "^1.27.2"
+ figures "^1.7.0"
+
+listr@^0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d"
+ dependencies:
+ chalk "^1.1.3"
+ cli-truncate "^0.2.1"
+ figures "^1.7.0"
+ indent-string "^2.1.0"
+ is-observable "^0.2.0"
+ is-promise "^2.1.0"
+ is-stream "^1.1.0"
+ listr-silent-renderer "^1.1.1"
+ listr-update-renderer "^0.4.0"
+ listr-verbose-renderer "^0.4.0"
+ log-symbols "^1.0.2"
+ log-update "^1.0.2"
+ ora "^0.2.3"
+ p-map "^1.1.1"
+ rxjs "^5.4.2"
+ stream-to-observable "^0.2.0"
+ strip-ansi "^3.0.1"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+lodash@^4.14.0, lodash@^4.17.4:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+log-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+ dependencies:
+ chalk "^1.0.0"
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ dependencies:
+ chalk "^2.0.1"
+
+log-update@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+ dependencies:
+ ansi-escapes "^1.0.0"
+ cli-cursor "^1.0.2"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+ dependencies:
+ js-tokens "^3.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-error@^1.1.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.2.tgz#8762ffad2444dd8ff1f7c819629fa28e24fea1c4"
+
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ dependencies:
+ tmpl "1.0.x"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+merge-stream@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+ dependencies:
+ readable-stream "^2.0.1"
+
+merge@^1.1.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+mime-db@~1.30.0:
+ version "1.30.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+
+mime-types@^2.1.12, mime-types@~2.1.17:
+ version "2.1.17"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
+ dependencies:
+ mime-db "~1.30.0"
+
+mimic-fn@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+
+minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+minipass@^2.2.1, minipass@^2.2.4:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.1.tgz#4e872b959131a672837ab3cb554962bc84b1537d"
+ dependencies:
+ safe-buffer "^5.1.1"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-odd "^2.0.0"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+needle@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-notifier@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea"
+ dependencies:
+ growly "^1.3.0"
+ semver "^5.4.1"
+ shellwords "^0.1.1"
+ which "^1.3.0"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.0"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.1.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-path@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
+ dependencies:
+ which "^1.2.10"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npm-which@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
+ dependencies:
+ commander "^2.9.0"
+ npm-path "^2.0.2"
+ which "^1.2.10"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwmatcher@^1.4.3:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e"
+
+oauth-sign@~0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-keys@^1.0.8:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+ora@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
+ dependencies:
+ chalk "^1.1.1"
+ cli-cursor "^1.0.2"
+ cli-spinners "^0.1.2"
+ object-assign "^4.0.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-map@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse5@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+please-upgrade-node@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.0.2.tgz#7b9eaeca35aa4a43d6ebdfd10616c042f9a83acc"
+ dependencies:
+ semver-compare "^1.0.0"
+
+pn@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+prettier@^1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.1.tgz#c1ad20e803e7749faf905a409d2367e06bbe7325"
+
+pretty-format@^22.4.0, pretty-format@^22.4.3:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
+ dependencies:
+ ansi-regex "^3.0.0"
+ ansi-styles "^3.2.0"
+
+private@^0.1.7, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+
+qs@~6.5.1:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+randomatic@^1.1.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+rc@^1.1.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297"
+ dependencies:
+ deep-extend "^0.5.1"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+realpath-native@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0"
+ dependencies:
+ util.promisify "^1.0.0"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+request-promise-core@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+ dependencies:
+ lodash "^4.13.1"
+
+request-promise-native@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+ dependencies:
+ request-promise-core "1.1.1"
+ stealthy-require "^1.1.0"
+ tough-cookie ">=2.3.3"
+
+request@^2.83.0:
+ version "2.86.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.86.0.tgz#2b9497f449b0a32654c081a5cf426bbfb5bf5b69"
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.6.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.1"
+ forever-agent "~0.6.1"
+ form-data "~2.3.1"
+ har-validator "~5.0.3"
+ hawk "~6.0.2"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.17"
+ oauth-sign "~0.8.2"
+ performance-now "^2.1.0"
+ qs "~6.5.1"
+ safe-buffer "^5.1.1"
+ tough-cookie "~2.3.3"
+ tunnel-agent "^0.6.0"
+ uuid "^3.1.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-from-string@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.7:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
+ dependencies:
+ path-parse "^1.0.5"
+
+resolve@^1.3.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.5.4, rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+rsvp@^3.3.3:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
+
+rxjs@^5.4.2:
+ version "5.5.6"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02"
+ dependencies:
+ symbol-observable "1.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sane@^2.0.0:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa"
+ dependencies:
+ anymatch "^2.0.0"
+ capture-exit "^1.2.0"
+ exec-sh "^0.2.0"
+ fb-watchman "^2.0.0"
+ micromatch "^3.1.4"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+ watch "~0.18.0"
+ optionalDependencies:
+ fsevents "^1.2.3"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shellwords@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sntp@2.x.x:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+ dependencies:
+ hoek "4.x.x"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.0, source-map-support@^0.5.3, source-map-support@^0.5.5:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+stack-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
+
+staged-git-files@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.1.tgz#37c2218ef0d6d26178b1310719309a16a59f8f7b"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stealthy-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-to-observable@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10"
+ dependencies:
+ any-observable "^0.2.0"
+
+string-argv@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736"
+
+string-length@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
+ dependencies:
+ astral-regex "^1.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringify-object@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd"
+ dependencies:
+ get-own-enumerable-property-symbols "^2.0.1"
+ is-obj "^1.0.1"
+ is-regexp "^1.0.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+subarg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+ dependencies:
+ minimist "^1.1.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.2:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^4.0.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+symbol-observable@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+
+symbol-observable@^0.2.2:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
+
+symbol-tree@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+tar@^4:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.2.4"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+test-exclude@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa"
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^3.1.8"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
+throat@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
+
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+ dependencies:
+ punycode "^1.4.1"
+
+tough-cookie@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
+ dependencies:
+ punycode "^1.4.1"
+
+tr46@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+ dependencies:
+ punycode "^2.1.0"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+ts-jest@^22.4.6:
+ version "22.4.6"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.4.6.tgz#a5d7f5e8b809626d1f4143209d301287472ec344"
+ dependencies:
+ babel-core "^6.26.3"
+ babel-plugin-istanbul "^4.1.6"
+ babel-plugin-transform-es2015-modules-commonjs "^6.26.2"
+ babel-preset-jest "^22.4.3"
+ cpx "^1.5.0"
+ fs-extra "6.0.0"
+ jest-config "^22.4.3"
+ lodash "^4.17.10"
+ pkg-dir "^2.0.0"
+ source-map-support "^0.5.5"
+ yargs "^11.0.0"
+
+ts-node@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.3.tgz#28bf74bcad134fad17f7469dad04638ece03f0f4"
+ dependencies:
+ arrify "^1.0.0"
+ chalk "^2.3.0"
+ diff "^3.1.0"
+ make-error "^1.1.1"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.5.3"
+ yn "^2.0.0"
+
+tslib@^1.8.0, tslib@^1.8.1:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
+
+tslint@^5.10.0:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ builtin-modules "^1.1.1"
+ chalk "^2.3.0"
+ commander "^2.12.1"
+ diff "^3.2.0"
+ glob "^7.1.1"
+ js-yaml "^3.7.0"
+ minimatch "^3.0.4"
+ resolve "^1.3.2"
+ semver "^5.3.0"
+ tslib "^1.8.0"
+ tsutils "^2.12.1"
+
+tsutils@^2.12.1:
+ version "2.19.1"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.19.1.tgz#76d7ebdea9d7a7bf4a05f50ead3701b0168708d7"
+ dependencies:
+ tslib "^1.8.1"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+typescript@2.8.3:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
+
+uglify-js@^2.6:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+universalify@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+use@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
+ dependencies:
+ kind-of "^6.0.2"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+uuid@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+w3c-hr-time@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+ dependencies:
+ browser-process-hrtime "^0.1.2"
+
+walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ dependencies:
+ makeerror "1.0.x"
+
+watch@~0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
+ dependencies:
+ exec-sh "^0.2.0"
+ minimist "^1.2.0"
+
+webidl-conversions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+ dependencies:
+ iconv-lite "0.4.19"
+
+whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4"
+
+whatwg-url@^6.4.0:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67"
+ dependencies:
+ lodash.sortby "^4.7.0"
+ tr46 "^1.0.1"
+ webidl-conversions "^4.0.2"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.10, which@^1.2.12, which@^1.2.9, which@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+ dependencies:
+ string-width "^1.0.2"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.2"
+
+ws@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs-parser@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^10.0.3:
+ version "10.1.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.1.1"
+ find-up "^2.1.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^8.1.0"
+
+yargs@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b"
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.1.1"
+ find-up "^2.1.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^9.0.2"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
+
+yn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"