diff --git a/.editorconfig b/.editorconfig index 50bdb0c3..dced3c85 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,13 +1,15 @@ -# editorconfig.org root = true [*] +charset = utf-8 indent_style = space -indent_size = 2 +indent_size = 4 end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true insert_final_newline = true +trim_trailing_whitespace = true -[*.json] +[{*.json,*.yml}] indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 00000000..213c3c8d --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,40 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [14.x] + + services: + redis: + image: redis + ports: + - 6379:6379 + mysql: + image: mysql + env: + MYSQL_ROOT_PASSWORD: password + ports: + - 3306:3306 + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build --if-present + - run: npm test diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..8f79a73d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +CHANGELOG.md +README.md +README-cn.md +.github +bin diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 4cb7cad6..00000000 --- a/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "endOfLine": "auto", - "printWidth": 135 -} diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 00000000..fb8347a7 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1 @@ +module.exports = require('@shm-open/eslint-config-bundle/prettier'); diff --git a/CHANGELOG.md b/CHANGELOG.md index ebc3ab29..09cd3ded 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,46 +2,158 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. -### [2.3.4](https://github.com/rocwind/code-push-cli/compare/v2.3.3...v2.3.4) (2020-08-18) +### [2.6.5](https://github.com/shm-open/code-push-cli/compare/v2.6.4...v2.6.5) (2024-02-28) + +### [2.6.4](https://github.com/shm-open/code-push-cli/compare/v2.6.3...v2.6.4) (2024-02-23) + +### [2.6.3](https://github.com/shm-open/code-push-cli/compare/v2.6.2...v2.6.3) (2024-02-23) + +### [2.6.2](https://github.com/shm-open/code-push-cli/compare/v2.6.1...v2.6.2) (2024-02-23) + +### [2.6.1](https://github.com/shm-open/code-push-cli/compare/v2.6.0...v2.6.1) (2022-07-17) + + +### Bug Fixes + +* **deps:** update dependency moment to v2.29.4 ([7ba4b68](https://github.com/shm-open/code-push-cli/commit/7ba4b680939f2e259db6c21d27d73dd21c085a1b)) +* **deps:** update dependency yargs to v17.5.1 ([f5dcadf](https://github.com/shm-open/code-push-cli/commit/f5dcadfa1d5a31085fb596fd1f8130ceff33cc84)) + +## [2.6.0](https://github.com/shm-open/code-push-cli/compare/v2.5.6...v2.6.0) (2022-04-26) + + +### Features + +* add extraBundlerOptions and extraHermesFlags params ([6fda542](https://github.com/shm-open/code-push-cli/commit/6fda542eb604b1d32b7eb2b98a47d01ccf5bc86d)) + + +### Bug Fixes + +* **deps:** update dependency cli-table3 to v0.6.2 ([ef9212a](https://github.com/shm-open/code-push-cli/commit/ef9212aef5f1ab640353d03654d58eb882614f55)) +* **deps:** update dependency gradle-to-js to v2.0.1 ([f95df91](https://github.com/shm-open/code-push-cli/commit/f95df915fea1acb6bb0b1c9408df2099fb2045d7)) +* **deps:** update dependency moment to v2.29.3 ([9edf90f](https://github.com/shm-open/code-push-cli/commit/9edf90f0ebdb6b875ac13ad9593306882dc7c9a5)) +* **deps:** update dependency prompt to v1.3.0 ([2ad5642](https://github.com/shm-open/code-push-cli/commit/2ad56422eeabc71f0ceeae2f2ca99906c45e4485)) +* **deps:** update dependency semver to v7.3.7 ([eda9149](https://github.com/shm-open/code-push-cli/commit/eda91495e2e2d50870427c8a700af4b9e52ee84e)) +* **deps:** update dependency yargs to v17.4.1 ([451138b](https://github.com/shm-open/code-push-cli/commit/451138ba0c75de3f83e27382cf12ecf7752deb5e)) + +### [2.5.6](https://github.com/shm-open/code-push-cli/compare/v2.5.5...v2.5.6) (2022-03-25) + + +### Bug Fixes + +* **deps:** update dependency plist to v3.0.5 ([b5f56ce](https://github.com/shm-open/code-push-cli/commit/b5f56ce7ef48ecdd3ece1c9cb38fb912da6d0c56)) +* **deps:** update dependency yargs to v17.4.0 ([2bd8615](https://github.com/shm-open/code-push-cli/commit/2bd861545f2f3f100af663f5eceee1f4be959bf9)) + +### [2.5.5](https://github.com/shm-open/code-push-cli/compare/v2.5.4...v2.5.5) (2022-02-21) + + +### Bug Fixes + +* **deps:** update dependency prompt to v1.2.2 ([8fa5562](https://github.com/shm-open/code-push-cli/commit/8fa5562fba0a4b9c08bfdfb083c5afba985b7faf)) +* **deps:** update dependency simctl to v2.0.3 ([e70b5e1](https://github.com/shm-open/code-push-cli/commit/e70b5e170b3c0040c41fda32a8db22d81bcb32b4)) + +### [2.5.4](https://github.com/shm-open/code-push-cli/compare/v2.5.3...v2.5.4) (2022-01-28) + + +### Bug Fixes + +* **deps:** update dependency cli-table3 to v0.6.1 ([f03fd02](https://github.com/shm-open/code-push-cli/commit/f03fd025738a1adb76365daa2c5bddbcbbd111ec)) +* **deps:** update dependency prompt to v1.2.1 ([da7fc80](https://github.com/shm-open/code-push-cli/commit/da7fc8069e545f9c89855d5497f80b1421de655c)) +* **deps:** update dependency yargs to v17.3.1 ([678b6ef](https://github.com/shm-open/code-push-cli/commit/678b6effafb240d884feec8eb0321cea8733747e)) +* **deps:** update recursive-fs to v2 ([fd58c58](https://github.com/shm-open/code-push-cli/commit/fd58c5881dbda43210987bfe0228139ac2afa372)) + +### [2.5.3](https://github.com/shm-open/code-push-cli/compare/v2.5.2...v2.5.3) (2021-11-23) + + +### Bug Fixes + +* **deps:** update dependency parse-duration to v1.0.2 ([32c86b3](https://github.com/shm-open/code-push-cli/commit/32c86b38f7688a384a0fe435648fd70c088a0091)) +* **deps:** update dependency plist to v3.0.4 ([5954eda](https://github.com/shm-open/code-push-cli/commit/5954eda36e5b1d48da29d8459596e0482a33bc73)) +* **deps:** update dependency progress to v2 ([666e127](https://github.com/shm-open/code-push-cli/commit/666e1271e3fe8319939261ff8d8262ad4d845786)) +* **deps:** update dependency yargs to v17.2.1 ([8600c77](https://github.com/shm-open/code-push-cli/commit/8600c772867b03f9b55a0a0d025f2ae8ceacd335)) +* **deps:** update prompt to 1.2.0 ([1dd372a](https://github.com/shm-open/code-push-cli/commit/1dd372a556433b4b5ab00b9f12edb3977c99267d)) + +### [2.5.2](https://github.com/shm-open/code-push-cli/compare/v2.5.1...v2.5.2) (2021-08-20) + + +### Bug Fixes + +* get release-react and other valid commands pass check, add serverUrl as required args to login/register command ([2c1b7b9](https://github.com/shm-open/code-push-cli/commit/2c1b7b95c0aca571730c5a5b9fc96dc17836276b)) + +### [2.5.1](https://github.com/shm-open/code-push-cli/compare/v2.5.0...v2.5.1) (2021-08-20) + + +### Bug Fixes + +* turn off yargs strict check for compatible(as a quick workaround) ([38827d4](https://github.com/shm-open/code-push-cli/commit/38827d42ad59554773952f0cc9fac7c09591d1e0)) + +## [2.5.0](https://github.com/shm-open/code-push-cli/compare/v2.4.0...v2.5.0) (2021-08-20) + + +### Features + +* add getiOSHermesEnabled function ([7075ff7](https://github.com/shm-open/code-push-cli/commit/7075ff735c41feec20c1ebf4b4b86df97d665749)) +* ios hermes sourcemap ([3c092c6](https://github.com/shm-open/code-push-cli/commit/3c092c617ab48e938ac3acf818e7549600c71d58)) + + +### Bug Fixes + +* **deps:** update backslash to v0.2.0 ([b80f00f](https://github.com/shm-open/code-push-cli/commit/b80f00f49aded6f0a16e384c669259c79ffcff7f)) +* **deps:** update dependency code-push to v2.0.7 ([05cae4f](https://github.com/shm-open/code-push-cli/commit/05cae4f4505277a06a79576a4a17dda90be453d0)) +* **deps:** update email-validator to v2.0.4 ([e670a13](https://github.com/shm-open/code-push-cli/commit/e670a136dc0f6dffe2efe43944437ac0098916c1)) +* **deps:** update parse-duration to v1 ([47a5a31](https://github.com/shm-open/code-push-cli/commit/47a5a318457e3b9faa19b4aca6911dc8961e9df2)) +* **deps:** update simctl to v2.0.0 ([a1cca6a](https://github.com/shm-open/code-push-cli/commit/a1cca6a18fba568e6b502f42b64d103dbc2a22c4)) +* **deps:** update slash to 3.0.0 and use package types for slash, yargs ([b563337](https://github.com/shm-open/code-push-cli/commit/b563337e232d7d1b82d663c4c32eac78c6bd5436)) +* **deps:** update update-notifier to v5 ([6bb35bf](https://github.com/shm-open/code-push-cli/commit/6bb35bf1e5567b950eb2fc298e134db14b611042)) +* **deps:** update which to v2.0.2 ([835ada9](https://github.com/shm-open/code-push-cli/commit/835ada97ca9707f33831ab2d36c41d0c3f1382c0)) +* **deps:** update yargs to v17 ([e17779d](https://github.com/shm-open/code-push-cli/commit/e17779d75fcc3869e3ac7459e362ca19378850b7)) + +## [2.4.0](https://github.com/shm-open/code-push-cli/compare/v2.3.4...v2.4.0) (2021-04-02) + + +### Features + +* 添加getCliPath()判断platform使用不同的cli ([e7a3de9](https://github.com/shm-open/code-push-cli/commit/e7a3de992b52f7e5576db15568b928ff7d89f787)) + +### [2.3.4](https://github.com/shm-open/code-push-cli/compare/v2.3.3...v2.3.4) (2020-08-18) ### Bug Fixes -* skip compose sourcemap for hermes if the sourcemap option is not enabled ([0555005](https://github.com/rocwind/code-push-cli/commit/0555005074e3e709863e5482713de02eceab2ffe)) +* skip compose sourcemap for hermes if the sourcemap option is not enabled ([0555005](https://github.com/shm-open/code-push-cli/commit/0555005074e3e709863e5482713de02eceab2ffe)) -### [2.3.3](https://github.com/rocwind/code-push-cli/compare/v2.3.2...v2.3.3) (2020-08-18) +### [2.3.3](https://github.com/shm-open/code-push-cli/compare/v2.3.2...v2.3.3) (2020-08-18) ### Bug Fixes -* update import syntax for node packages ([ff102dd](https://github.com/rocwind/code-push-cli/commit/ff102dd5220a43828fa50a9f3ba961cc8bee7f2d)) +* update import syntax for node packages ([ff102dd](https://github.com/shm-open/code-push-cli/commit/ff102dd5220a43828fa50a9f3ba961cc8bee7f2d)) -### [2.3.2](https://github.com/rocwind/code-push-cli/compare/v2.3.1...v2.3.2) (2020-08-18) +### [2.3.2](https://github.com/shm-open/code-push-cli/compare/v2.3.1...v2.3.2) (2020-08-18) ### Bug Fixes -* fix chalk.cyan not function issue ([176cdcf](https://github.com/rocwind/code-push-cli/commit/176cdcfbd2fa4974ebb4bd31f2bd2eea44b9115c)) +* fix chalk.cyan not function issue ([176cdcf](https://github.com/shm-open/code-push-cli/commit/176cdcfbd2fa4974ebb4bd31f2bd2eea44b9115c)) -### [2.3.1](https://github.com/rocwind/code-push-cli/compare/v2.3.0...v2.3.1) (2020-08-18) +### [2.3.1](https://github.com/shm-open/code-push-cli/compare/v2.3.0...v2.3.1) (2020-08-18) -## [2.3.0](https://github.com/rocwind/code-push-cli/compare/v2.2.1...v2.3.0) (2020-08-17) +## [2.3.0](https://github.com/shm-open/code-push-cli/compare/v2.2.1...v2.3.0) (2020-08-17) ### Features -* add compose-source-maps.js create sourcemap ([c77ae60](https://github.com/rocwind/code-push-cli/commit/c77ae60124bbc6c00644a8b935a9189b687629d4)) +* add compose-source-maps.js create sourcemap ([c77ae60](https://github.com/shm-open/code-push-cli/commit/c77ae60124bbc6c00644a8b935a9189b687629d4)) ### Bug Fixes -* The sourcemap generated by hermes will not move to the specified directory ([4de2b12](https://github.com/rocwind/code-push-cli/commit/4de2b1233d607aa1b53516b423966354c9cf7daf)) -* updat ethe reference path to package.json ([abdb421](https://github.com/rocwind/code-push-cli/commit/abdb4216c6e657c03e3f09224c23c1de1cf21cf6)) +* The sourcemap generated by hermes will not move to the specified directory ([4de2b12](https://github.com/shm-open/code-push-cli/commit/4de2b1233d607aa1b53516b423966354c9cf7daf)) +* updat ethe reference path to package.json ([abdb421](https://github.com/shm-open/code-push-cli/commit/abdb4216c6e657c03e3f09224c23c1de1cf21cf6)) -### [2.2.1](https://github.com/rocwind/code-push-cli/compare/v2.2.0...v2.2.1) (2020-08-17) +### [2.2.1](https://github.com/shm-open/code-push-cli/compare/v2.2.0...v2.2.1) (2020-08-17) ### Bug Fixes -* compatible with hermes-engine@0.5.0, check `hermesc` for hermes executable ([47c0962](https://github.com/rocwind/code-push-cli/commit/47c0962c565a514473896e049c6565eacc73892f)) -* sourcemapOutput be coverd ([1e53f8c](https://github.com/rocwind/code-push-cli/commit/1e53f8ca76ccb2862dc33fafe49eeab1012f0a7c)) +* compatible with hermes-engine@0.5.0, check `hermesc` for hermes executable ([47c0962](https://github.com/shm-open/code-push-cli/commit/47c0962c565a514473896e049c6565eacc73892f)) +* sourcemapOutput be coverd ([1e53f8c](https://github.com/shm-open/code-push-cli/commit/1e53f8ca76ccb2862dc33fafe49eeab1012f0a7c)) diff --git a/LICENSE.md b/LICENSE.md index ac6bb7e4..62534a7e 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,8 +1,10 @@ CodePush -Copyright (c) Microsoft Corporation +Copyright (c) 2020-present shihuimiao -All rights reserved. +Copyright (c) 2015-2019 Microsoft Corporation + +All rights reserved. MIT License @@ -10,4 +12,4 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README-cn.md b/README.cn.md similarity index 98% rename from README-cn.md rename to README.cn.md index 64aad76a..bfd66a98 100644 --- a/README-cn.md +++ b/README.cn.md @@ -10,6 +10,7 @@ CodePush是一个云服务,它能让Cordova和React Native的开发者将手 ![CodePush CLI](https://cloud.githubusercontent.com/assets/116461/14505396/c97bdc78-016d-11e6-89da-3f3557f8b33d.png) +* [关于本仓库](#关于本仓库) * [安装](#安装) * [快速开始](#快速开始) * [创建账号](#创建账号) @@ -29,16 +30,23 @@ CodePush是一个云服务,它能让Cordova和React Native的开发者将手 [[English Version]](./README.md) +## 关于本仓库 +本仓库的目的是为了适配开源的[code-push-server](https://github.com/shm-open/code-push-server). 因为官方的`code-push-cli`已经不再维护更新, 而`appcenter-cli`又无法登录自己搭建的`code-push-server`, 所以我们分叉了这个cli项目, 用来: +- 适配开源`code-push-server` +- 移植一些有价值的`appcenter-cli`的新功能, 比如针对React Native Hermes的支持 +- 保持项目依赖的更新 + ## 安装 * 安装 [Node.js](https://nodejs.org/) -* 安装 CodePush CLI: `npm install -g code-push-cli` +* 安装 CodePush CLI: `npm install -g @shm-open/code-push-cli` ## 快速开始 1. 使用CodePush CLI创建一个[CodePush 账号](#创建账号) 2. 注册你的CodePush[应用](#应用管理), 并[分享](#应用合作)给你团队的其它开发者 3. 用[Cordova插件](http://github.com/Microsoft/cordova-plugin-code-push) 或 [React Native插件](http://github.com/Microsoft/react-native-code-push)配置好CodePush并指向你希望的部署环境 + *注意:在iOS和Android使用自定义的ServerURL参数名大小写不同,iOS是在plist里新增CodePushServerURL,Android是在res/values/strings.xml 添加CodePushServerUrl* 4. [发布](#发布更新)更新 5. 活的长而成功![详细资料](https://en.wikipedia.org/wiki/Vulcan_salute) diff --git a/README.md b/README.md index e6ccbd04..dba96750 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ -# CodePush Management CLI +# CodePush Management CLI ![Node.js CI](https://github.com/shm-open/code-push-cli/workflows/Node.js%20CI/badge.svg) + + +[[Chinese version 中文版]](./README.cn.md) CodePush is a cloud service that enables Cordova and React Native developers to deploy mobile app updates directly to their users' devices. It works by acting as a central repository that developers can publish updates to (JS, HTML, CSS and images), and that apps can query for updates from (using the provided client SDKs for [Cordova](http://github.com/Microsoft/cordova-plugin-code-push) and [React Native](http://github.com/Microsoft/react-native-code-push)). This allows you to have a more deterministic and direct engagement model with your user base, when addressing bugs and/or adding small features that don't require you to re-build a binary and re-distribute it through the respective app stores. ![CodePush CLI](https://cloud.githubusercontent.com/assets/245892/26749409/feb439f6-47d7-11e7-98fd-07d750b856d8.png) - +* [About This Fork](#about-this-fork) * [Installation](#installation) * [Getting Started](#getting-started) * [Account Management](#account-management) @@ -28,14 +31,18 @@ CodePush is a cloud service that enables Cordova and React Native developers to * [Clearing Release History](#clearing-release-history) * [Code Signing](#code-signing) -[[Chinese version 中文版]](./README-cn.md) +## About This Fork +This fork is for open source [code-push-server](https://github.com/shm-open/code-push-server). Since the original `code-push-cli` is deprecated and `appcenter-cli` cannot work with self hosted `code-push-server`. We create this fork to: +- work with open source `code-push-server` +- port necessary new features from `appcenter-cli`, such as React Native Hermes support +- keep dependencies up-to-date ## Installation * Install [Node.js](https://nodejs.org/) -* Install the CodePush CLI: `npm install -g code-push-cli` +* Install the CodePush CLI: `npm install -g @shm-open/code-push-cli` ## Getting Started @@ -220,7 +227,7 @@ code-push collaborator ls The update to version 2.0.0.0 saw the removal of the `app transfer` command. You may still transfer ownership of your applications by managing the transfer through an organization. This requires that you visit [Mobile Center](https://mobile.azure.com) and execute a few steps. 1. Go to to [https://mobile.azure.com](https://mobile.azure.com) and create a new organization. -2. Invite the person you to whom you wish to transfer the app to the organization. Once they have accepted the invitation change their access permissions to "Admin". +2. Invite the person you to whom you wish to transfer the app to the organization. Once they have accepted the invitation change their access permissions to "Admin". 3. Navigate to your app and click on the "Manage App" button (top right when on the "Getting Started" page for the app). Hit the Transfer button there to transfer the app to the org. Note that currently this operation cannot be reversed, although this will change in the future. 4. Once your invitee has accepted, select the organization that you created and remove yourself from it. @@ -894,7 +901,7 @@ At the end of release command, the cli computes the bundle's content hash and pl If you are planning to use this feature you need to do the following: -1. Produce new binary update including +1. Produce new binary update including * updated codepush plugin supporting Code Signing * configure your code-push sdk to use your public key (please, refer relevent React Native SDK ([iOS](https://github.com/Microsoft/react-native-code-push/blob/master/docs/setup-ios.md#code-signing-setup), [Android](https://github.com/Microsoft/react-native-code-push/blob/master/docs/setup-android.md#code-signing-setup)) or [Cordova SDK](https://github.com/Microsoft/cordova-plugin-code-push#getting-started) sections for details) 2. Produce a new CodePush update that targets the new binary version and specifies a `--privateKeyPath` (or simply `-k`) parameter value diff --git a/package-lock.json b/package-lock.json index 86d19cb0..ba0bbe4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,31 +1,76 @@ { - "name": "code-push-cli-r", - "version": "2.3.4", + "name": "@shm-open/code-push-cli", + "version": "2.6.5", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" + } + }, + "@babel/generator": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "dev": true, + "requires": { + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -61,177 +106,148 @@ } } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", - "dev": true - }, - "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/semver": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.3.tgz", - "integrity": "sha512-jQxClWFzv9IXdLdhSaTf16XI3NYe6zrEbckSpb5xhKfPbWgIyAY0AFyWWWfaiDcBuj3UHmMkCIwSRqpKMTZL2Q==", + "@babel/parser": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.8.tgz", + "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==", "dev": true }, - "@types/yazl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/yazl/-/yazl-2.4.2.tgz", - "integrity": "sha512-T+9JH8O2guEjXNxqmybzQ92mJUh2oCwDDMSSimZSe1P+pceZiFROZLYmcbqkzV5EUwz6VwcKXCO2S2yUpra6XQ==", + "@babel/runtime": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "dev": true, "requires": { - "@types/node": "*" + "regenerator-runtime": "^0.13.4" } }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@babel/runtime-corejs3": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.6.tgz", + "integrity": "sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "^2.0.0" + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, "requires": { - "color-name": "~1.1.4" + "@babel/highlight": "^7.18.6" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "backslash": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/backslash/-/backslash-0.1.7.tgz", - "integrity": "sha1-ww7FQX/stdwwxHAKIim4Ysv70NM=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "@babel/traverse": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.8.tgz", + "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.8", + "@babel/types": "^7.18.8", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -240,6 +256,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -250,187 +267,930 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "@babel/types": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.8.tgz", + "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true } } }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" }, - "cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "ms": "2.1.2" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "globals": { + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", + "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "type-fest": "^0.20.2" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "brace-expansion": "^1.1.7" } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true } } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@shm-open/eslint-config-bundle": { + "version": "1.9.13", + "resolved": "https://registry.npmjs.org/@shm-open/eslint-config-bundle/-/eslint-config-bundle-1.9.13.tgz", + "integrity": "sha512-QwyV+aZm5aIcNV1payDz46z3yJE4tUvKFKUxtxLAqysPwJeSg6CklVXuWHc2e8hStcF5U0dMLEoKAg60EOxGBA==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "5.30.6", + "@typescript-eslint/parser": "5.30.6", + "babel-eslint": "10.1.0", + "eslint": "8.19.0", + "eslint-config-airbnb-base": "15.0.0", + "eslint-config-prettier": "8.5.0", + "eslint-import-resolver-typescript": "2.7.1", + "eslint-plugin-deprecation": "1.3.2", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-jsx-a11y": "6.6.0", + "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-react": "7.30.1", + "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-react-native": "4.0.0", + "eslint-plugin-taro": "3.3.20", + "prettier": "2.7.1" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "16.11.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.45.tgz", + "integrity": "sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/semver": { + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.10.tgz", + "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", + "dev": true + }, + "@types/which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.1.tgz", + "integrity": "sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@types/yazl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/yazl/-/yazl-2.4.2.tgz", + "integrity": "sha512-T+9JH8O2guEjXNxqmybzQ92mJUh2oCwDDMSSimZSe1P+pceZiFROZLYmcbqkzV5EUwz6VwcKXCO2S2yUpra6XQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz", + "integrity": "sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/type-utils": "5.30.6", + "@typescript-eslint/utils": "5.30.6", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.6.tgz", + "integrity": "sha512-bqvT+0L8IjtW7MCrMgm9oVNxs4g7mESro1mm5c1/SNfTnHuFTf9OUX1WzVkTz75M9cp//UrTrSmGvK48NEKshQ==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.30.6" + } + }, + "@typescript-eslint/parser": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.6.tgz", + "integrity": "sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz", + "integrity": "sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.30.6", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/types": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", + "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" + } + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + }, + "dependencies": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "requires": { + "tslib": "^2.0.1" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "axe-core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", + "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "dev": true + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "backslash": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/backslash/-/backslash-0.2.0.tgz", + "integrity": "sha1-bDwfzn5+cUzPwQ/XTw9zQQZ3N18=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "boxen": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", + "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.0", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } }, "code-push": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/code-push/-/code-push-2.0.6.tgz", - "integrity": "sha512-3ln6rqE9KkYUhSzgjKVOAd2pUijBFY3QG951fgIiG3uNGg8V57XuYmftPq3EGS0YTxX2SPEUOQvHPhw7Wxmggw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/code-push/-/code-push-2.0.7.tgz", + "integrity": "sha512-8cEO60OYPiDj4vaSBxRAySzShYrKLi8GXdxcbJhTJ25PAvMUkf9rC/IQxgRK01EqWcGwKvIAGvz+Xk9YJcMM+A==", "requires": { "q": "^1.4.1", - "recursive-fs": "0.1.4", - "slash": "1.0.0", - "superagent": "^3.8.0", - "superagent-proxy": "^1.0.3", + "recursive-fs": "^1.1.2", + "slash": "3.0.0", + "superagent": "^5.1.0", + "superagent-proxy": "^2.0.0", "yazl": "^2.4.1" + }, + "dependencies": { + "recursive-fs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/recursive-fs/-/recursive-fs-1.1.2.tgz", + "integrity": "sha512-QPFEt5EwzwlHoqYsZc+NkUSyDTQf1Hvq7c/kpQJHi77OSCAiDXI3wfB0J04ZG+ekGHmv37mdR8MDPEshD3/RlQ==" + } } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -438,13 +1198,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "optional": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -462,23 +1217,6 @@ "requires": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } } }, "component-emitter": { @@ -501,103 +1239,72 @@ "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" } }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "conventional-changelog": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.23.tgz", - "integrity": "sha512-sScUu2NHusjRC1dPc5p8/b3kT78OYr95/Bx7Vl8CPB8tF2mG1xei5iylDTRjONV5hTlzt+Cn/tBWrKdd299b7A==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.11", - "conventional-changelog-atom": "^2.0.7", - "conventional-changelog-codemirror": "^2.0.7", - "conventional-changelog-conventionalcommits": "^4.4.0", - "conventional-changelog-core": "^4.2.0", - "conventional-changelog-ember": "^2.0.8", - "conventional-changelog-eslint": "^3.0.8", - "conventional-changelog-express": "^2.0.5", - "conventional-changelog-jquery": "^3.0.10", - "conventional-changelog-jshint": "^2.0.8", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", "conventional-changelog-preset-loader": "^2.3.4" } }, "conventional-changelog-angular": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz", - "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "requires": { "compare-func": "^2.0.0", "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-atom": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.7.tgz", - "integrity": "sha512-7dOREZwzB+tCEMjRTDfen0OHwd7vPUdmU0llTy1eloZgtOP4iSLVzYIQqfmdRZEty+3w5Jz+AbhfTJKoKw1JeQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", "dev": true, "requires": { "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-codemirror": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.7.tgz", - "integrity": "sha512-Oralk1kiagn3Gb5cR5BffenWjVu59t/viE6UMD/mQa1hISMPkMYhJIqX+CMeA1zXgVBO+YHQhhokEj99GP5xcg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, "requires": { "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-config-spec": { @@ -607,257 +1314,82 @@ "dev": true }, "conventional-changelog-conventionalcommits": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz", - "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", "dev": true, "requires": { "compare-func": "^2.0.0", "lodash": "^4.17.15", "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.0.tgz", - "integrity": "sha512-8+xMvN6JvdDtPbGBqA7oRNyZD4od1h/SIzrWqHcKZjitbVXrFpozEeyn4iI4af1UwdrabQpiZMaV07fPUTGd4w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "requires": { "add-stream": "^1.0.0", - "conventional-changelog-writer": "^4.0.17", - "conventional-commits-parser": "^3.1.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.0", + "git-semver-tags": "^4.1.1", "lodash": "^4.17.15", - "normalize-package-data": "^2.3.5", + "normalize-package-data": "^3.0.0", "q": "^1.5.1", "read-pkg": "^3.0.0", "read-pkg-up": "^3.0.0", - "shelljs": "^0.8.3", - "through2": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "through2": "^4.0.0" } }, "conventional-changelog-ember": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.8.tgz", - "integrity": "sha512-JEMEcUAMg4Q9yxD341OgWlESQ4gLqMWMXIWWUqoQU8yvTJlKnrvcui3wk9JvnZQyONwM2g1MKRZuAjKxr8hAXA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, "requires": { "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-eslint": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.8.tgz", - "integrity": "sha512-5rTRltgWG7TpU1PqgKHMA/2ivjhrB+E+S7OCTvj0zM/QGg4vmnVH67Vq/EzvSNYtejhWC+OwzvDrLk3tqPry8A==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, "requires": { "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-express": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.5.tgz", - "integrity": "sha512-pW2hsjKG+xNx/Qjof8wYlAX/P61hT5gQ/2rZ2NsTpG+PgV7Rc8RCfITvC/zN9K8fj0QmV6dWmUefCteD9baEAw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", "dev": true, "requires": { "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-jquery": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.10.tgz", - "integrity": "sha512-QCW6wF8QgPkq2ruPaxc83jZxoWQxLkt/pNxIDn/oYjMiVgrtqNdd7lWe3vsl0hw5ENHNf/ejXuzDHk6suKsRpg==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", "dev": true, "requires": { "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-jshint": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.8.tgz", - "integrity": "sha512-hB/iI0IiZwnZ+seYI+qEQ4b+EMQSEC8jGIvhO2Vpz1E5p8FgLz75OX8oB1xJWl+s4xBMB6f8zJr0tC/BL7YOjw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", "dev": true, "requires": { "compare-func": "^2.0.0", "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-preset-loader": { @@ -867,21 +1399,20 @@ "dev": true }, "conventional-changelog-writer": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz", - "integrity": "sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, "requires": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.6", + "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", - "handlebars": "^4.7.6", + "handlebars": "^4.7.7", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "meow": "^7.0.0", + "meow": "^8.0.0", "semver": "^6.0.0", "split": "^1.0.0", - "through2": "^3.0.0" + "through2": "^4.0.0" }, "dependencies": { "semver": { @@ -893,9 +1424,9 @@ } }, "conventional-commits-filter": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", - "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, "requires": { "lodash.ismatch": "^4.4.0", @@ -903,42 +1434,33 @@ } }, "conventional-commits-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", - "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, "conventional-recommended-bump": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.10.tgz", - "integrity": "sha512-2ibrqAFMN3ZA369JgVoSbajdD/BHN6zjY7DZFKTHzyzuQejDUCjQ85S5KHxCRxNwsbDJhTPD5hOKcis/jQhRgg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, "requires": { "concat-stream": "^2.0.0", "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.6", - "conventional-commits-parser": "^3.1.0", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^4.1.0", - "meow": "^7.0.0", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "cookiejar": { @@ -946,71 +1468,54 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, + "core-js-pure": { + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.4.tgz", + "integrity": "sha512-lizxkcgj3XDmi7TUBFe+bQ1vNpD5E4t76BrBWI3HdUxdw/Mq1VF4CkiHzIKyieECKtcODK2asJttoofEeUKICQ==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true }, "data-uri-to-buffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.1.tgz", - "integrity": "sha512-OkVVLrerfAKZlW2ZZ3Ve2y65jgiWqBKsTfUIAFbn8nVbPcCZg6l6gikKlEYv0kXcmzqGm6mFq/Jf2vriuEkv8A==", - "requires": { - "@types/node": "^8.0.7" - }, - "dependencies": { - "@types/node": { - "version": "8.10.61", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz", - "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q==" - } - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" }, "dateformat": { "version": "3.0.3", @@ -1019,22 +1524,23 @@ "dev": true }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", "dev": true, "requires": { "decamelize": "^1.1.0", @@ -1044,15 +1550,18 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true } } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } }, "deep-extend": { "version": "0.6.0", @@ -1064,14 +1573,29 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", + "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0" } }, "delayed-stream": { @@ -1085,9 +1609,9 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, "detect-newline": { @@ -1096,12 +1620,30 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "^2.0.0" } }, "dotgitignore": { @@ -1141,12 +1683,6 @@ "requires": { "p-limit": "^2.0.0" } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true } } }, @@ -1164,433 +1700,909 @@ } }, "email-validator": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-1.2.3.tgz", - "integrity": "sha512-WZmY6vj6bAWUzr1P2OmRkw4E3FWwdnKxWG/Ssfvr+kp+0leuXzsX2EHNwjg8+KW2DfAiFWiV+jn5n1P7TlE7lw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { - "es6-promise": "^4.0.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "requires": { - "esprima": "^3.1.3", + "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" } }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "eslint": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", + "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", + "dev": true, "requires": { - "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" + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true }, - "form-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz", - "integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==", + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } } }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "eslint-import-resolver-typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", + "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", "dev": true, "requires": { - "null-check": "^1.0.0" + "debug": "^4.3.4", + "glob": "^7.2.0", + "is-glob": "^4.0.3", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "dev": true, "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "ms": "^2.1.1" } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "eslint-plugin-deprecation": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.3.2.tgz", + "integrity": "sha512-z93wbx9w7H/E3ogPw6AZMkkNJ6m51fTZRNZPNQqxQLmx+KKt7aLkMU9wN67s71i+VVHN4tLOZ3zT3QLbnlC0Mg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0", + "tslib": "^2.3.1", + "tsutils": "^3.21.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "ms": "2.0.0" } }, - "indent-string": { + "doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "repeating": "^2.0.0" + "esutils": "^2.0.2" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "has": "^1.0.3" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "brace-expansion": "^1.1.7" } }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true } } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-uri": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.3.tgz", - "integrity": "sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==", + "eslint-plugin-jsx-a11y": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", + "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", + "dev": true, "requires": { - "data-uri-to-buffer": "2", - "debug": "4", - "extend": "~3.0.2", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "3" + "@babel/runtime": "^7.18.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.1", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "brace-expansion": "^1.1.7" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", "dev": true, "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" }, "dependencies": { - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { + "doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "esutils": "^2.0.2" } }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "has": "^1.0.3" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "brace-expansion": "^1.1.7" } }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true + }, + "eslint-plugin-react-native": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz", + "integrity": "sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.7.4", + "eslint-plugin-react-native-globals": "^0.1.1" + } + }, + "eslint-plugin-react-native-globals": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", + "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", + "dev": true + }, + "eslint-plugin-taro": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-taro/-/eslint-plugin-taro-3.3.20.tgz", + "integrity": "sha512-Pse/peAk2s+6DTrD9VnkE4IcHQZ4JWgIKI3tcYbt7pPbAtNWSQJd0+IKAwqvxmNoGepsr5o5JeYOIXVsdZzMPg==", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + }, + "dependencies": { + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "p-limit": { @@ -1608,89 +2620,168 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "p-limit": "^1.1.0" } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "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" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -1701,39 +2792,84 @@ "xtend": "~4.0.1" } }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } } } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + } + }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, "git-remote-origin-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, "requires": { "gitconfiglocal": "^1.0.0", "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } } }, "git-semver-tags": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.0.tgz", - "integrity": "sha512-TcxAGeo03HdErzKzi4fDD+xEL7gi8r2Y5YSxH6N2XYdVSV5UkBwfrt7Gqo1b+uSHCjy/sa9Y6BBBxxFLxfbhTg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "requires": { - "meow": "^7.0.0", + "meow": "^8.0.0", "semver": "^6.0.0" }, "dependencies": { @@ -1748,7 +2884,7 @@ "gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, "requires": { "ini": "^1.3.2" @@ -1767,30 +2903,66 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "requires": { - "ini": "^1.3.4" + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } } }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { - "create-error-class": "^3.0.0", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" } }, "graceful-fs": { @@ -1799,17 +2971,17 @@ "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" }, "gradle-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.0.tgz", - "integrity": "sha512-eoYJiSoreHG0cS5aUmv7ISJhajuULlqdqG3QKVti6x1EFkBXE8rGH6ipGKWEesXpCkfNgzBrhzo5ztIH1JWZMw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.1.tgz", + "integrity": "sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==", "requires": { - "lodash.merge": "4.6.2" + "lodash.merge": "^4.6.2" } }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -1817,14 +2989,6 @@ "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "hard-rejection": { @@ -1833,15 +2997,69 @@ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { "version": "1.7.3", @@ -1856,43 +3074,24 @@ } }, "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" } }, "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "6", + "debug": "4" } }, - "i": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", - "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1901,6 +3100,22 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -1936,16 +3151,21 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "ip": { "version": "1.1.5", @@ -1955,20 +3175,64 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" } }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -1976,72 +3240,136 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } }, "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "requires": { "text-extensions": "^1.0.0" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -2059,22 +3387,77 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsonwebtoken": { @@ -2101,6 +3484,16 @@ } } }, + "jsx-ast-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", + "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.2" + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -2120,26 +3513,41 @@ "safe-buffer": "^5.0.1" } }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, "requires": { - "package-json": "^4.0.0" + "language-subtag-registry": "~0.3.2" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "requires": { - "invert-kv": "^1.0.0" + "package-json": "^6.3.0" } }, "levn": { @@ -2152,27 +3560,38 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true } } }, @@ -2186,15 +3605,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.includes": { @@ -2215,7 +3628,7 @@ "lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, "lodash.isnumber": { @@ -2243,33 +3656,13 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lowercase-keys": { @@ -2278,32 +3671,38 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^4.0.0" } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "pify": "^3.0.0" + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, "meow": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.0.tgz", - "integrity": "sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -2311,20 +3710,14 @@ "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", + "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2335,17 +3728,11 @@ "path-exists": "^4.0.0" } }, - "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "path-exists": { "version": "4.0.0", @@ -2365,6 +3752,18 @@ "type-fest": "^0.6.0" }, "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -2392,41 +3791,58 @@ } } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==" }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.45.0" } }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -2469,9 +3885,9 @@ "dev": true }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "ms": { "version": "2.1.2", @@ -2483,10 +3899,11 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=" + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "neo-async": { "version": "2.6.2", @@ -2500,46 +3917,94 @@ "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" }, "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, "requires": { - "path-key": "^2.0.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } }, "once": { "version": "1.4.0", @@ -2550,35 +4015,27 @@ } }, "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" + "word-wrap": "~1.2.3" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-limit": { "version": "2.3.0", @@ -2605,91 +4062,91 @@ "dev": true }, "pac-proxy-agent": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", - "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", + "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "pac-resolver": "^3.0.0", + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^4.1.0", "raw-body": "^2.2.0", - "socks-proxy-agent": "^3.0.0" + "socks-proxy-agent": "5" } }, "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.1.0.tgz", + "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", + "degenerator": "^2.2.0", "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" + "netmask": "^1.0.6" } }, "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "parse-duration": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.1.1.tgz", - "integrity": "sha1-ExFN3JiRwezSgANiRFVN5DZHoiY=" + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true + "parse-duration": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.0.2.tgz", + "integrity": "sha512-Dg27N6mfok+ow1a2rj/nRjtCfaKrHUZV2SJpEn/s8GaVUSlf4GGRCRP1c13Hj+wfPKVMrFDqLMLITkYKgKxyyg==" }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "requires": { - "error-ex": "^1.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-parse": { "version": "1.0.6", @@ -2697,53 +4154,30 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true }, "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "requires": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" } }, "prelude-ls": { @@ -2752,30 +4186,57 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", + "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", "requires": { - "pkginfo": "0.x.x", + "@colors/colors": "1.5.0", + "async": "3.2.3", "read": "1.0.x", "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" + "winston": "2.x" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, "properties": { @@ -2784,39 +4245,78 @@ "integrity": "sha1-Dul6f8AgsaKlW4ZZ7aSqjYaQlL0=" }, "proxy-agent": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", - "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", + "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "pac-proxy-agent": "^2.0.1", + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^4.1.0", "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^3.0.0" + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } }, "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, "quick-lru": { "version": "4.0.1", @@ -2844,15 +4344,14 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -2862,51 +4361,89 @@ } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, "requires": { "resolve": "^1.1.6" } }, "recursive-fs": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/recursive-fs/-/recursive-fs-0.1.4.tgz", - "integrity": "sha1-R+CLHdq419mpYKoNDa6nb4dbY/o=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/recursive-fs/-/recursive-fs-2.1.0.tgz", + "integrity": "sha512-oed3YruYsD52Mi16s/07eYblQOLi5dTtxpIJNdfCEJ7S5v8dDgVcycar0pRWf4IBuPMIkoctC8RTqGJzIKMNAQ==" }, "redent": { "version": "3.0.0", @@ -2918,30 +4455,43 @@ "strip-indent": "^3.0.0" } }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "requires": { - "rc": "^1.0.1" + "rc": "^1.2.8" } }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "requires": { - "is-finite": "^1.0.0" + "rc": "^1.2.8" } }, "require-directory": { @@ -2949,11 +4499,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, "resolve": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", @@ -2962,6 +4507,26 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "revalidator": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", @@ -2975,6 +4540,15 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2991,93 +4565,110 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "requires": { - "semver": "^5.0.3" + "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "shelljs": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz", - "integrity": "sha1-kEktcv/MgVmXa6umL7D2iE8MM3g=" + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simctl": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/simctl/-/simctl-0.0.9.tgz", - "integrity": "sha1-zTbJ06GuFwlkX5fgziBcw8rG/Rs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/simctl/-/simctl-2.0.3.tgz", + "integrity": "sha512-kKCak0yszxHae5eVWcmrjV3ouUGac3sjlhjdLWpyPu4eiQcWoHsCrqS34kkgzHN8Ystqkh/LFjzrldk/g3BYJg==", "requires": { - "shelljs": "^0.2.6", + "shelljs": "^0.8.5", "tail": "^0.4.0" } }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" }, "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.5.1.tgz", + "integrity": "sha512-oZCsJJxapULAYJaEYBSzMcz8m3jqgGrHaGhkmU/o/PQfFWYWxkAaA0UMGImb6s6tEXfKi959X6VJjMMQ3P6TTQ==", "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", - "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" } }, "source-map": { @@ -3086,32 +4677,36 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true }, "split": { "version": "1.0.1", @@ -3123,24 +4718,12 @@ } }, "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { - "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "^3.0.0" } }, "stack-trace": { @@ -3149,34 +4732,27 @@ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, "standard-version": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.0.0.tgz", - "integrity": "sha512-eRR04IscMP3xW9MJTykwz13HFNYs8jS33AGuDiBKgfo5YrO0qX0Nxb4rjupVwT5HDYL/aR+MBEVLjlmVFmFEDQ==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", "dev": true, "requires": { "chalk": "^2.4.2", - "conventional-changelog": "3.1.23", + "conventional-changelog": "3.1.25", "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.4.0", - "conventional-recommended-bump": "6.0.10", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", "dotgitignore": "^2.1.0", "figures": "^3.1.0", - "find-up": "^4.1.0", - "fs-access": "^1.0.1", + "find-up": "^5.0.0", "git-semver-tags": "^4.0.0", "semver": "^7.1.1", "stringify-package": "^1.0.1", - "yargs": "^15.3.1" + "yargs": "^16.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -3186,12 +4762,6 @@ "color-convert": "^1.9.0" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3203,163 +4773,71 @@ "supports-color": "^5.3.0" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, - "strip-ansi": { + "locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "p-locate": "^5.0.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "yocto-queue": "^0.1.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - } + "p-limit": "^3.0.2" } }, - "y18n": { + "path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "has-flag": "^3.0.0" } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } @@ -3370,29 +4848,60 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" } } }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3408,25 +4917,18 @@ "dev": true }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-indent": { "version": "3.0.0", @@ -3443,35 +4945,46 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" } }, "superagent-proxy": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-1.0.3.tgz", - "integrity": "sha512-79Ujg1lRL2ICfuHUdX+H2MjIw73kB7bXsIkxLwHURz3j0XUmEEEoJ+u/wq+mKwna21Uejsm2cGR3OESA00TIjA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-2.1.0.tgz", + "integrity": "sha512-DnarpKN6Xn8e3pYlFV4Yvsj9yxLY4q5FIsUe5JvN7vjzP+YCfzXv03dTkZSD2yzrSadsNYHf0IgOUJwKjX457A==", "requires": { "debug": "^3.1.0", - "proxy-agent": "2" + "proxy-agent": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" }, @@ -3483,50 +4996,63 @@ } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "tail": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/tail/-/tail-0.4.0.tgz", "integrity": "sha1-0p3nJ1DMmdseBTr/E8NZ7PtxMAI=" }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } - }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "readable-stream": "3" } }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } }, "toidentifier": { "version": "1.0.0", @@ -3534,16 +5060,52 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + } + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } }, "type-check": { "version": "0.3.2", @@ -3554,99 +5116,104 @@ } }, "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "uglify-js": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz", - "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.2.tgz", + "integrity": "sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg==", "dev": true, "optional": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "^2.0.0" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" } }, "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "^2.0.0" } }, "util-deprecate": { @@ -3654,124 +5221,100 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } }, "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "requires": { - "string-width": "^2.1.1" + "string-width": "^4.0.0" } }, "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", + "integrity": "sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==", "requires": { - "async": "0.2.x", - "colors": "0.6.x", + "async": "~1.0.0", + "colors": "1.0.x", "cycle": "1.0.x", "eyes": "0.1.x", "isstream": "0.1.x", - "pkginfo": "0.3.x", "stack-trace": "0.0.x" }, "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" } } }, @@ -3781,19 +5324,20 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, "xml2js": { "version": "0.4.23", @@ -3816,11 +5360,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -3833,74 +5372,69 @@ "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "number-is-nan": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^5.0.1" } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" } } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, "yazl": { "version": "2.5.1", @@ -3909,6 +5443,12 @@ "requires": { "buffer-crc32": "~0.2.3" } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 90e227f5..64675c78 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { - "name": "code-push-cli-r", - "version": "2.3.4", + "name": "@shm-open/code-push-cli", + "version": "2.6.5", "description": "Management CLI for the CodePush service", "main": "bin/cli.js", "scripts": { "start": "tsc --watch", - "build": "tsc", + "build": "rm -rf bin && tsc", "release": "npm test && npm run build && standard-version && git push --follow-tags origin master && npm publish", "test": "echo 'no tests'" }, @@ -17,7 +17,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/rocwind/code-push-cli" + "url": "https://github.com/shm-open/code-push-cli" }, "keywords": [ "code", @@ -26,43 +26,45 @@ "react-native", "react" ], - "homepage": "https://github.com/rocwind/code-push-cli", - "author": "Microsoft Corporation", + "homepage": "https://github.com/shm-open/code-push-cli", + "author": "shihuimiao", "license": "MIT", "dependencies": { - "backslash": "^0.1.7", - "chalk": "^4.1.0", - "cli-table3": "^0.6.0", - "code-push": "2.0.6", - "email-validator": "^1.0.3", - "gradle-to-js": "^2.0.0", - "jsonwebtoken": "^8.3.0", - "mkdirp": "^1.0.4", - "moment": "^2.27.0", - "opener": "^1.4.1", - "parse-duration": "0.1.1", - "plist": "^3.0.1", - "progress": "^1.1.8", - "prompt": "^0.2.14", - "properties": "^1.2.1", - "recursive-fs": "0.1.4", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "simctl": "0.0.9", - "slash": "1.0.0", - "update-notifier": "^2.5.0", - "which": "^1.2.7", + "backslash": "0.2.0", + "chalk": "4.1.2", + "cli-table3": "0.6.2", + "code-push": "2.0.7", + "email-validator": "2.0.4", + "gradle-to-js": "2.0.1", + "jsonwebtoken": "8.5.1", + "mkdirp": "1.0.4", + "moment": "2.29.4", + "opener": "1.5.2", + "parse-duration": "1.0.2", + "plist": "3.0.5", + "progress": "2.0.3", + "prompt": "1.3.0", + "properties": "1.2.1", + "recursive-fs": "2.1.0", + "rimraf": "3.0.2", + "semver": "7.3.7", + "simctl": "2.0.3", + "slash": "3.0.0", + "update-notifier": "5.1.0", + "which": "2.0.2", "wordwrap": "1.0.0", - "xml2js": "^0.4.23", - "yargs": "^6.5.0", - "yazl": "^2.4.1" + "xml2js": "0.4.23", + "yargs": "17.5.1", + "yazl": "2.5.1" }, "devDependencies": { - "@types/node": "^14.6.0", - "@types/q": "^1.5.4", - "@types/semver": "^7.3.3", - "@types/yazl": "^2.4.2", - "standard-version": "^9.0.0", - "typescript": "^3.9.7" + "@shm-open/eslint-config-bundle": "1.9.13", + "@types/node": "16.11.45", + "@types/semver": "7.3.10", + "@types/which": "2.0.1", + "@types/yargs": "17.0.10", + "@types/yazl": "2.4.2", + "standard-version": "9.5.0", + "typescript": "4.7.4" } } diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..4f39080e --- /dev/null +++ b/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["config:base"] +} diff --git a/src/cli.ts b/src/cli.ts index 353acd34..5e84f394 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,18 +1,18 @@ #!/usr/bin/env node -import { command, showHelp } from "./command-parser"; -import { execute } from "./command-executor"; -import chalk from "chalk"; +import { command, showHelp } from './command-parser'; +import { execute } from './command-executor'; +import chalk from 'chalk'; function run(): void { - if (!command) { - showHelp(/*showRootDescription*/ false); - return; - } + if (!command) { + showHelp(/*showRootDescription*/ false); + return; + } - execute(command).catch((error: any): void => { - console.error(chalk.red("[Error] " + error.message)); - process.exit(1); - }); + execute(command).catch((error: any): void => { + console.error(chalk.red('[Error] ' + error.message)); + process.exit(1); + }); } run(); diff --git a/src/command-executor.ts b/src/command-executor.ts index dc6a3f70..5974b7c5 100644 --- a/src/command-executor.ts +++ b/src/command-executor.ts @@ -1,71 +1,75 @@ -import AccountManager = require("code-push"); -import chalk from "chalk"; -import childProcess from "child_process"; -import debugCommand from "./commands/debug"; -import fs from "fs"; -var mkdirp = require("mkdirp"); -import moment from "moment"; -var opener = require("opener"); -import os from "os"; -import path from "path"; -var prompt = require("prompt"); -import rimraf from "rimraf"; -var which = require("which"); -import wordwrap = require("wordwrap"); -import * as cli from "./definitions/cli"; -import hooks from "./release-hooks/index"; +import AccountManager = require('code-push'); +import chalk from 'chalk'; +import childProcess from 'child_process'; +import debugCommand from './commands/debug'; +import fs from 'fs'; +var mkdirp = require('mkdirp'); +import moment from 'moment'; +var opener = require('opener'); +import os from 'os'; +import path from 'path'; +var prompt = require('prompt'); +import rimraf from 'rimraf'; +import which from 'which'; +import wordwrap = require('wordwrap'); +import emailValidator from 'email-validator'; +import * as cli from './definitions/cli'; +import hooks from './release-hooks/index'; import { - AccessKey, - Account, - App, - CodePushError, - CollaboratorMap, - CollaboratorProperties, - Deployment, - DeploymentMetrics, - Headers, - Package, - PackageInfo, - UpdateMetrics, -} from "code-push/script/types"; + AccessKey, + Account, + App, + CodePushError, + CollaboratorMap, + CollaboratorProperties, + Deployment, + DeploymentMetrics, + Headers, + Package, + PackageInfo, + UpdateMetrics, +} from 'code-push/script/types'; import { - getHermesEnabled, - runReactNativeBundleCommand, - runHermesEmitBinaryCommand, - getReactNativeProjectAppVersion, -} from "./lib/react-native-utils"; -import { isBinaryOrZip } from "./lib/file-utils"; -import { out } from "./util/interaction"; -import { isValidRange } from "./lib/validation-utils"; -import { getCordovaProjectAppVersion } from "./lib/cordova-utils"; - -var configFilePath: string = path.join(process.env.LOCALAPPDATA || process.env.HOME, ".code-push.config"); -var emailValidator = require("email-validator"); -var packageJson = require("../package.json"); + getHermesEnabled, + getiOSHermesEnabled, + runReactNativeBundleCommand, + runHermesEmitBinaryCommand, + getReactNativeProjectAppVersion, +} from './lib/react-native-utils'; +import { isBinaryOrZip } from './lib/file-utils'; +import { out } from './util/interaction'; +import { isValidRange } from './lib/validation-utils'; +import { getCordovaProjectAppVersion } from './lib/cordova-utils'; + +var configFilePath: string = path.join( + process.env.LOCALAPPDATA || process.env.HOME, + '.code-push.config', +); +var packageJson = require('../package.json'); const CLI_HEADERS: Headers = { - "X-CodePush-CLI-Version": packageJson.version, + 'X-CodePush-CLI-Version': packageJson.version, }; /** Deprecated */ interface ILegacyLoginConnectionInfo { - accessKeyName: string; + accessKeyName: string; } interface ILoginConnectionInfo { - accessKey: string; - customServerUrl?: string; // A custom serverUrl for internal debugging purposes - preserveAccessKeyOnLogout?: boolean; - proxy?: string; // To specify the proxy url explicitly, other than the environment var (HTTP_PROXY) - noProxy?: boolean; // To suppress the environment proxy setting, like HTTP_PROXY + accessKey: string; + customServerUrl?: string; // A custom serverUrl for internal debugging purposes + preserveAccessKeyOnLogout?: boolean; + proxy?: string; // To specify the proxy url explicitly, other than the environment var (HTTP_PROXY) + noProxy?: boolean; // To suppress the environment proxy setting, like HTTP_PROXY } export interface UpdateMetricsWithTotalActive extends UpdateMetrics { - totalActive: number; + totalActive: number; } export interface PackageWithMetrics { - metrics?: any; // UpdateMetricsWithTotalActive; + metrics?: any; // UpdateMetricsWithTotalActive; } export var sdk: AccountManager; @@ -74,1373 +78,1563 @@ export var execSync = childProcess.execSync; var connectionInfo: ILoginConnectionInfo; -export var confirm = (message: string = "Are you sure?"): Promise => { - message += " (y/N):"; - return new Promise((resolve): void => { - prompt.message = ""; - prompt.delimiter = ""; - - prompt.start(); - - prompt.get( - { - properties: { - response: { - description: chalk.cyan(message), - }, - }, - }, - (err: any, result: any): void => { - var accepted = result.response && result.response.toLowerCase() === "y"; - var rejected = !result.response || result.response.toLowerCase() === "n"; - - if (accepted) { - resolve(true); - } else { - if (!rejected) { - out.text('Invalid response: "' + result.response + '"'); - } - resolve(false); - } - } - ); - }); +export var confirm = (message: string = 'Are you sure?'): Promise => { + message += ' (y/N):'; + return new Promise((resolve): void => { + prompt.message = ''; + prompt.delimiter = ''; + + prompt.start(); + + prompt.get( + { + properties: { + response: { + description: chalk.cyan(message), + }, + }, + }, + (err: any, result: any): void => { + var accepted = result.response && result.response.toLowerCase() === 'y'; + var rejected = !result.response || result.response.toLowerCase() === 'n'; + + if (accepted) { + resolve(true); + } else { + if (!rejected) { + out.text('Invalid response: "' + result.response + '"'); + } + resolve(false); + } + }, + ); + }); }; function accessKeyAdd(command: cli.IAccessKeyAddCommand): Promise { - return sdk.addAccessKey(command.name, command.ttl).then((accessKey: AccessKey) => { - out.text(`Successfully created the "${command.name}" access key: ${accessKey.key}`); - out.text("Make sure to save this key value somewhere safe, since you won't be able to view it from the CLI again!"); - }); + return sdk.addAccessKey(command.name, command.ttl).then((accessKey: AccessKey) => { + out.text(`Successfully created the "${command.name}" access key: ${accessKey.key}`); + out.text( + "Make sure to save this key value somewhere safe, since you won't be able to view it from the CLI again!", + ); + }); } function accessKeyPatch(command: cli.IAccessKeyPatchCommand): Promise { - const willUpdateName: boolean = isCommandOptionSpecified(command.newName) && command.oldName !== command.newName; - const willUpdateTtl: boolean = isCommandOptionSpecified(command.ttl); - - if (!willUpdateName && !willUpdateTtl) { - throw new Error("A new name and/or TTL must be provided."); - } + const willUpdateName: boolean = + isCommandOptionSpecified(command.newName) && command.oldName !== command.newName; + const willUpdateTtl: boolean = isCommandOptionSpecified(command.ttl); - return sdk.patchAccessKey(command.oldName, command.newName, command.ttl).then((accessKey: AccessKey) => { - let logMessage: string = "Successfully "; - if (willUpdateName) { - logMessage += `renamed the access key "${command.oldName}" to "${command.newName}"`; + if (!willUpdateName && !willUpdateTtl) { + throw new Error('A new name and/or TTL must be provided.'); } - if (willUpdateTtl) { - const expirationDate = moment(accessKey.expires).format("LLLL"); - if (willUpdateName) { - logMessage += ` and changed its expiration date to ${expirationDate}`; - } else { - logMessage += `changed the expiration date of the "${command.oldName}" access key to ${expirationDate}`; - } - } + return sdk + .patchAccessKey(command.oldName, command.newName, command.ttl) + .then((accessKey: AccessKey) => { + let logMessage: string = 'Successfully '; + if (willUpdateName) { + logMessage += `renamed the access key "${command.oldName}" to "${command.newName}"`; + } + + if (willUpdateTtl) { + const expirationDate = moment(accessKey.expires).format('LLLL'); + if (willUpdateName) { + logMessage += ` and changed its expiration date to ${expirationDate}`; + } else { + logMessage += `changed the expiration date of the "${command.oldName}" access key to ${expirationDate}`; + } + } - out.text(`${logMessage}.`); - }); + out.text(`${logMessage}.`); + }); } function accessKeyList(command: cli.IAccessKeyListCommand): Promise { - throwForInvalidOutputFormat(command.format); + throwForInvalidOutputFormat(command.format); - return sdk.getAccessKeys().then((accessKeys: AccessKey[]): void => { - printAccessKeys(command.format, accessKeys); - }); + return sdk.getAccessKeys().then((accessKeys: AccessKey[]): void => { + printAccessKeys(command.format, accessKeys); + }); } function accessKeyRemove(command: cli.IAccessKeyRemoveCommand): Promise { - return confirm().then( - (wasConfirmed: boolean): Promise => { - if (wasConfirmed) { - return sdk.removeAccessKey(command.accessKey).then((): void => { - out.text(`Successfully removed the "${command.accessKey}" access key.`); - }); - } + return confirm().then((wasConfirmed: boolean): Promise => { + if (wasConfirmed) { + return sdk.removeAccessKey(command.accessKey).then((): void => { + out.text(`Successfully removed the "${command.accessKey}" access key.`); + }); + } - out.text("Access key removal cancelled."); - } - ); + out.text('Access key removal cancelled.'); + }); } function appAdd(command: cli.IAppAddCommand): Promise { - // Validate the OS and platform, doing a case insensitve comparison. Note that for CLI examples we - // present these values in all lower case, per CLI conventions, but when passed to the REST API the - // are in mixed case, per Mobile Center API naming conventions - - var os: string; - const normalizedOs = command.os.toLowerCase(); - if (normalizedOs === "ios") { - os = "iOS"; - } else if (normalizedOs === "android") { - os = "Android"; - } else if (normalizedOs === "windows") { - os = "Windows"; - } else { - return Promise.reject( - new Error(`"${command.os}" is an unsupported OS. Available options are "ios", "android", and "windows".`) - ); - } - - var platform: string; - const normalizedPlatform = command.platform.toLowerCase(); - if (normalizedPlatform === "react-native") { - platform = "React-Native"; - } else if (normalizedPlatform === "cordova") { - platform = "Cordova"; - } else { - return Promise.reject( - new Error(`"${command.platform}" is an unsupported platform. Available options are "react-native" and "cordova".`) - ); - } - - return sdk.addApp(command.appName, os, platform, false).then( - (app: App): Promise => { - out.text('Successfully added the "' + command.appName + '" app, along with the following default deployments:'); - var deploymentListCommand: cli.IDeploymentListCommand = { - type: cli.CommandType.deploymentList, - appName: app.name, - format: "table", - displayKeys: true, - }; - return deploymentList(deploymentListCommand, /*showPackage=*/ false); + // Validate the OS and platform, doing a case insensitve comparison. Note that for CLI examples we + // present these values in all lower case, per CLI conventions, but when passed to the REST API the + // are in mixed case, per Mobile Center API naming conventions + + var os: string; + const normalizedOs = command.os.toLowerCase(); + if (normalizedOs === 'ios') { + os = 'iOS'; + } else if (normalizedOs === 'android') { + os = 'Android'; + } else if (normalizedOs === 'windows') { + os = 'Windows'; + } else { + return Promise.reject( + new Error( + `"${command.os}" is an unsupported OS. Available options are "ios", "android", and "windows".`, + ), + ); + } + + var platform: string; + const normalizedPlatform = command.platform.toLowerCase(); + if (normalizedPlatform === 'react-native') { + platform = 'React-Native'; + } else if (normalizedPlatform === 'cordova') { + platform = 'Cordova'; + } else { + return Promise.reject( + new Error( + `"${command.platform}" is an unsupported platform. Available options are "react-native" and "cordova".`, + ), + ); } - ); + + return sdk.addApp(command.appName, os, platform, false).then((app: App): Promise => { + out.text( + 'Successfully added the "' + + command.appName + + '" app, along with the following default deployments:', + ); + var deploymentListCommand: cli.IDeploymentListCommand = { + type: cli.CommandType.deploymentList, + appName: app.name, + format: 'table', + displayKeys: true, + }; + return deploymentList(deploymentListCommand, /*showPackage=*/ false); + }); } function appList(command: cli.IAppListCommand): Promise { - throwForInvalidOutputFormat(command.format); - var apps: App[]; - return sdk.getApps().then((retrievedApps: App[]): void => { - printAppList(command.format, retrievedApps); - }); + throwForInvalidOutputFormat(command.format); + var apps: App[]; + return sdk.getApps().then((retrievedApps: App[]): void => { + printAppList(command.format, retrievedApps); + }); } function appRemove(command: cli.IAppRemoveCommand): Promise { - return confirm("Are you sure you want to remove this app? Note that its deployment keys will be PERMANENTLY unrecoverable.").then( - (wasConfirmed: boolean): Promise => { - if (wasConfirmed) { - return sdk.removeApp(command.appName).then((): void => { - out.text('Successfully removed the "' + command.appName + '" app.'); - }); - } + return confirm( + 'Are you sure you want to remove this app? Note that its deployment keys will be PERMANENTLY unrecoverable.', + ).then((wasConfirmed: boolean): Promise => { + if (wasConfirmed) { + return sdk.removeApp(command.appName).then((): void => { + out.text('Successfully removed the "' + command.appName + '" app.'); + }); + } - out.text("App removal cancelled."); - } - ); + out.text('App removal cancelled.'); + }); } function appRename(command: cli.IAppRenameCommand): Promise { - return sdk.renameApp(command.currentAppName, command.newAppName).then((): void => { - out.text('Successfully renamed the "' + command.currentAppName + '" app to "' + command.newAppName + '".'); - }); + return sdk.renameApp(command.currentAppName, command.newAppName).then((): void => { + out.text( + 'Successfully renamed the "' + + command.currentAppName + + '" app to "' + + command.newAppName + + '".', + ); + }); } export var createEmptyTempReleaseFolder = (folderPath: string) => { - return deleteFolder(folderPath).then(() => { - fs.mkdirSync(folderPath); - }); + return deleteFolder(folderPath).then(() => { + fs.mkdirSync(folderPath); + }); }; function appTransfer(command: cli.IAppTransferCommand): Promise { - throwForInvalidEmail(command.email); - - return confirm().then( - (wasConfirmed: boolean): Promise => { - if (wasConfirmed) { - return sdk.transferApp(command.appName, command.email).then((): void => { - out.text( - 'Successfully transferred the ownership of app "' + - command.appName + - '" to the account with email "' + - command.email + - '".' - ); - }); - } + throwForInvalidEmail(command.email); + + return confirm().then((wasConfirmed: boolean): Promise => { + if (wasConfirmed) { + return sdk.transferApp(command.appName, command.email).then((): void => { + out.text( + 'Successfully transferred the ownership of app "' + + command.appName + + '" to the account with email "' + + command.email + + '".', + ); + }); + } - out.text("App transfer cancelled."); - } - ); + out.text('App transfer cancelled.'); + }); } function addCollaborator(command: cli.ICollaboratorAddCommand): Promise { - throwForInvalidEmail(command.email); + throwForInvalidEmail(command.email); - return sdk.addCollaborator(command.appName, command.email).then((): void => { - out.text('Collaborator invitation email for "' + command.appName + '" sent to "' + command.email + '".'); - }); + return sdk.addCollaborator(command.appName, command.email).then((): void => { + out.text( + 'Collaborator invitation email for "' + + command.appName + + '" sent to "' + + command.email + + '".', + ); + }); } function listCollaborators(command: cli.ICollaboratorListCommand): Promise { - throwForInvalidOutputFormat(command.format); + throwForInvalidOutputFormat(command.format); - return sdk.getCollaborators(command.appName).then((retrievedCollaborators: CollaboratorMap): void => { - printCollaboratorsList(command.format, retrievedCollaborators); - }); + return sdk + .getCollaborators(command.appName) + .then((retrievedCollaborators: CollaboratorMap): void => { + printCollaboratorsList(command.format, retrievedCollaborators); + }); } function removeCollaborator(command: cli.ICollaboratorRemoveCommand): Promise { - throwForInvalidEmail(command.email); - - return confirm().then( - (wasConfirmed: boolean): Promise => { - if (wasConfirmed) { - return sdk.removeCollaborator(command.appName, command.email).then((): void => { - out.text('Successfully removed "' + command.email + '" as a collaborator from the app "' + command.appName + '".'); - }); - } + throwForInvalidEmail(command.email); + + return confirm().then((wasConfirmed: boolean): Promise => { + if (wasConfirmed) { + return sdk.removeCollaborator(command.appName, command.email).then((): void => { + out.text( + 'Successfully removed "' + + command.email + + '" as a collaborator from the app "' + + command.appName + + '".', + ); + }); + } - out.text("App collaborator removal cancelled."); - } - ); + out.text('App collaborator removal cancelled.'); + }); } function deleteConnectionInfoCache(printMessage: boolean = true): void { - try { - fs.unlinkSync(configFilePath); - - if (printMessage) { - out.text(`Successfully logged-out. The session file located at ${chalk.cyan(configFilePath)} has been deleted.\r\n`); - } - } catch (ex) {} + try { + fs.unlinkSync(configFilePath); + + if (printMessage) { + out.text( + `Successfully logged-out. The session file located at ${chalk.cyan( + configFilePath, + )} has been deleted.\r\n`, + ); + } + } catch (ex) {} } function deleteFolder(folderPath: string): Promise { - return new Promise((resolve, reject) => { - rimraf(folderPath, (err: any) => { - if (err) { - reject(err); - } else { - resolve(null); - } + return new Promise((resolve, reject) => { + rimraf(folderPath, (err: any) => { + if (err) { + reject(err); + } else { + resolve(null); + } + }); }); - }); } function deploymentAdd(command: cli.IDeploymentAddCommand): Promise { - if (command.default) { - return sdk - .addDeployment(command.appName, "Staging") - .then( - (deployment: Deployment): Promise => { - return sdk.addDeployment(command.appName, "Production"); - } - ) - .then( - (deployment: Deployment): Promise => { - out.text('Successfully added the "Staging" and "Production" default deployments:'); - var deploymentListCommand: cli.IDeploymentListCommand = { - type: cli.CommandType.deploymentList, - appName: command.appName, - format: "table", - displayKeys: true, - }; - return deploymentList(deploymentListCommand, /*showPackage=*/ false); - } - ); - } else { - return sdk.addDeployment(command.appName, command.deploymentName).then((deployment: Deployment): void => { - out.text( - 'Successfully added the "' + - command.deploymentName + - '" deployment with key "' + - deployment.key + - '" to the "' + - command.appName + - '" app.' - ); - }); - } + if (command.default) { + return sdk + .addDeployment(command.appName, 'Staging') + .then((deployment: Deployment): Promise => { + return sdk.addDeployment(command.appName, 'Production'); + }) + .then((deployment: Deployment): Promise => { + out.text('Successfully added the "Staging" and "Production" default deployments:'); + var deploymentListCommand: cli.IDeploymentListCommand = { + type: cli.CommandType.deploymentList, + appName: command.appName, + format: 'table', + displayKeys: true, + }; + return deploymentList(deploymentListCommand, /*showPackage=*/ false); + }); + } else { + return sdk + .addDeployment(command.appName, command.deploymentName) + .then((deployment: Deployment): void => { + out.text( + 'Successfully added the "' + + command.deploymentName + + '" deployment with key "' + + deployment.key + + '" to the "' + + command.appName + + '" app.', + ); + }); + } } function deploymentHistoryClear(command: cli.IDeploymentHistoryClearCommand): Promise { - return confirm().then( - (wasConfirmed: boolean): Promise => { - if (wasConfirmed) { - return sdk.clearDeploymentHistory(command.appName, command.deploymentName).then((): void => { - out.text( - 'Successfully cleared the release history associated with the "' + - command.deploymentName + - '" deployment from the "' + - command.appName + - '" app.' - ); - }); - } + return confirm().then((wasConfirmed: boolean): Promise => { + if (wasConfirmed) { + return sdk + .clearDeploymentHistory(command.appName, command.deploymentName) + .then((): void => { + out.text( + 'Successfully cleared the release history associated with the "' + + command.deploymentName + + '" deployment from the "' + + command.appName + + '" app.', + ); + }); + } - out.text("Clear deployment cancelled."); - } - ); + out.text('Clear deployment cancelled.'); + }); } -export var deploymentList = (command: cli.IDeploymentListCommand, showPackage: boolean = true): Promise => { - throwForInvalidOutputFormat(command.format); - var deployments: Deployment[]; - - return sdk - .getDeployments(command.appName) - .then((retrievedDeployments: Deployment[]) => { - deployments = retrievedDeployments; - if (showPackage) { - var metricsPromises: Promise[] = deployments.map((deployment: Deployment) => { - if (deployment.package) { - return sdk.getDeploymentMetrics(command.appName, deployment.name).then((metrics: DeploymentMetrics): void => { - if (metrics[deployment.package.label]) { - var totalActive: number = getTotalActiveFromDeploymentMetrics(metrics); - (deployment.package).metrics = { - active: metrics[deployment.package.label].active, - downloaded: metrics[deployment.package.label].downloaded, - failed: metrics[deployment.package.label].failed, - installed: metrics[deployment.package.label].installed, - totalActive: totalActive, - }; - } - }); - } else { - return Promise.resolve(null); - } - }); +export var deploymentList = ( + command: cli.IDeploymentListCommand, + showPackage: boolean = true, +): Promise => { + throwForInvalidOutputFormat(command.format); + var deployments: Deployment[]; - return Promise.all(metricsPromises); - } - }) - .then(() => { - printDeploymentList(command, deployments, showPackage); - }); + return sdk + .getDeployments(command.appName) + .then((retrievedDeployments: Deployment[]) => { + deployments = retrievedDeployments; + if (showPackage) { + var metricsPromises: Promise[] = deployments.map((deployment: Deployment) => { + if (deployment.package) { + return sdk + .getDeploymentMetrics(command.appName, deployment.name) + .then((metrics: DeploymentMetrics): void => { + if (metrics[deployment.package.label]) { + var totalActive: number = + getTotalActiveFromDeploymentMetrics(metrics); + (deployment.package).metrics = { + active: metrics[deployment.package.label].active, + downloaded: metrics[deployment.package.label].downloaded, + failed: metrics[deployment.package.label].failed, + installed: metrics[deployment.package.label].installed, + totalActive: totalActive, + }; + } + }); + } else { + return Promise.resolve(null); + } + }); + + return Promise.all(metricsPromises); + } + }) + .then(() => { + printDeploymentList(command, deployments, showPackage); + }); }; function deploymentRemove(command: cli.IDeploymentRemoveCommand): Promise { - return confirm( - "Are you sure you want to remove this deployment? Note that its deployment key will be PERMANENTLY unrecoverable." - ).then( - (wasConfirmed: boolean): Promise => { - if (wasConfirmed) { - return sdk.removeDeployment(command.appName, command.deploymentName).then((): void => { - out.text('Successfully removed the "' + command.deploymentName + '" deployment from the "' + command.appName + '" app.'); - }); - } + return confirm( + 'Are you sure you want to remove this deployment? Note that its deployment key will be PERMANENTLY unrecoverable.', + ).then((wasConfirmed: boolean): Promise => { + if (wasConfirmed) { + return sdk.removeDeployment(command.appName, command.deploymentName).then((): void => { + out.text( + 'Successfully removed the "' + + command.deploymentName + + '" deployment from the "' + + command.appName + + '" app.', + ); + }); + } - out.text("Deployment removal cancelled."); - } - ); + out.text('Deployment removal cancelled.'); + }); } function deploymentRename(command: cli.IDeploymentRenameCommand): Promise { - return sdk.renameDeployment(command.appName, command.currentDeploymentName, command.newDeploymentName).then((): void => { - out.text( - 'Successfully renamed the "' + - command.currentDeploymentName + - '" deployment to "' + - command.newDeploymentName + - '" for the "' + - command.appName + - '" app.' - ); - }); + return sdk + .renameDeployment(command.appName, command.currentDeploymentName, command.newDeploymentName) + .then((): void => { + out.text( + 'Successfully renamed the "' + + command.currentDeploymentName + + '" deployment to "' + + command.newDeploymentName + + '" for the "' + + command.appName + + '" app.', + ); + }); } function deploymentHistory(command: cli.IDeploymentHistoryCommand): Promise { - throwForInvalidOutputFormat(command.format); - - return Promise.all([ - sdk.getAccountInfo(), - sdk.getDeploymentHistory(command.appName, command.deploymentName), - sdk.getDeploymentMetrics(command.appName, command.deploymentName), - ]).then(([account, deploymentHistory, metrics]: [Account, Package[], DeploymentMetrics]): void => { - var totalActive: number = getTotalActiveFromDeploymentMetrics(metrics); - deploymentHistory.forEach((packageObject: Package) => { - if (metrics[packageObject.label]) { - (packageObject).metrics = { - active: metrics[packageObject.label].active, - downloaded: metrics[packageObject.label].downloaded, - failed: metrics[packageObject.label].failed, - installed: metrics[packageObject.label].installed, - totalActive: totalActive, - }; - } - }); - printDeploymentHistory(command, deploymentHistory, account.email); - }); + throwForInvalidOutputFormat(command.format); + + return Promise.all([ + sdk.getAccountInfo(), + sdk.getDeploymentHistory(command.appName, command.deploymentName), + sdk.getDeploymentMetrics(command.appName, command.deploymentName), + ]).then( + ([account, deploymentHistory, metrics]: [Account, Package[], DeploymentMetrics]): void => { + var totalActive: number = getTotalActiveFromDeploymentMetrics(metrics); + deploymentHistory.forEach((packageObject: Package) => { + if (metrics[packageObject.label]) { + (packageObject).metrics = { + active: metrics[packageObject.label].active, + downloaded: metrics[packageObject.label].downloaded, + failed: metrics[packageObject.label].failed, + installed: metrics[packageObject.label].installed, + totalActive: totalActive, + }; + } + }); + printDeploymentHistory(command, deploymentHistory, account.email); + }, + ); } function deserializeConnectionInfo(): ILoginConnectionInfo { - try { - var savedConnection: string = fs.readFileSync(configFilePath, { - encoding: "utf8", - }); - var connectionInfo: ILegacyLoginConnectionInfo | ILoginConnectionInfo = JSON.parse(savedConnection); - - // If the connection info is in the legacy format, convert it to the modern format - if ((connectionInfo).accessKeyName) { - connectionInfo = { - accessKey: (connectionInfo).accessKeyName, - }; - } + try { + var savedConnection: string = fs.readFileSync(configFilePath, { + encoding: 'utf8', + }); + var connectionInfo: ILegacyLoginConnectionInfo | ILoginConnectionInfo = + JSON.parse(savedConnection); + + // If the connection info is in the legacy format, convert it to the modern format + if ((connectionInfo).accessKeyName) { + connectionInfo = { + accessKey: (connectionInfo).accessKeyName, + }; + } - var connInfo = connectionInfo; + var connInfo = connectionInfo; - connInfo.proxy = getProxy(connInfo.proxy, connInfo.noProxy); + connInfo.proxy = getProxy(connInfo.proxy, connInfo.noProxy); - return connInfo; - } catch (ex) { - return; - } + return connInfo; + } catch (ex) { + return; + } } export function execute(command: cli.ICommand): Promise { - connectionInfo = deserializeConnectionInfo(); - - return Promise.resolve().then(() => { - switch (command.type) { - // Must not be logged in - case cli.CommandType.login: - case cli.CommandType.register: - if (connectionInfo) { - throw new Error("You are already logged in from this machine."); - } - break; - - // It does not matter whether you are logged in or not - case cli.CommandType.link: - break; - - // Must be logged in - default: - if (!!sdk) break; // Used by unit tests to skip authentication - - if (!connectionInfo) { - throw new Error( - "You are not currently logged in. Run the 'code-push login' command to authenticate with the CodePush server." - ); + connectionInfo = deserializeConnectionInfo(); + + return Promise.resolve().then(() => { + switch (command.type) { + // Must not be logged in + case cli.CommandType.login: + case cli.CommandType.register: + if (connectionInfo) { + throw new Error('You are already logged in from this machine.'); + } + break; + + // It does not matter whether you are logged in or not + case cli.CommandType.link: + break; + + // Must be logged in + default: + if (!!sdk) break; // Used by unit tests to skip authentication + + if (!connectionInfo) { + throw new Error( + "You are not currently logged in. Run the 'code-push login' command to authenticate with the CodePush server.", + ); + } + + sdk = getSdk( + connectionInfo.accessKey, + CLI_HEADERS, + connectionInfo.customServerUrl, + connectionInfo.proxy, + ); + break; } - sdk = getSdk(connectionInfo.accessKey, CLI_HEADERS, connectionInfo.customServerUrl, connectionInfo.proxy); - break; - } - - switch (command.type) { - case cli.CommandType.accessKeyAdd: - return accessKeyAdd(command); + switch (command.type) { + case cli.CommandType.accessKeyAdd: + return accessKeyAdd(command); - case cli.CommandType.accessKeyPatch: - return accessKeyPatch(command); + case cli.CommandType.accessKeyPatch: + return accessKeyPatch(command); - case cli.CommandType.accessKeyList: - return accessKeyList(command); + case cli.CommandType.accessKeyList: + return accessKeyList(command); - case cli.CommandType.accessKeyRemove: - return accessKeyRemove(command); + case cli.CommandType.accessKeyRemove: + return accessKeyRemove(command); - case cli.CommandType.appAdd: - return appAdd(command); + case cli.CommandType.appAdd: + return appAdd(command); - case cli.CommandType.appList: - return appList(command); + case cli.CommandType.appList: + return appList(command); - case cli.CommandType.appRemove: - return appRemove(command); + case cli.CommandType.appRemove: + return appRemove(command); - case cli.CommandType.appRename: - return appRename(command); + case cli.CommandType.appRename: + return appRename(command); - case cli.CommandType.appTransfer: - return appTransfer(command); + case cli.CommandType.appTransfer: + return appTransfer(command); - case cli.CommandType.collaboratorAdd: - return addCollaborator(command); + case cli.CommandType.collaboratorAdd: + return addCollaborator(command); - case cli.CommandType.collaboratorList: - return listCollaborators(command); + case cli.CommandType.collaboratorList: + return listCollaborators(command); - case cli.CommandType.collaboratorRemove: - return removeCollaborator(command); + case cli.CommandType.collaboratorRemove: + return removeCollaborator(command); - case cli.CommandType.debug: - return debugCommand(command); + case cli.CommandType.debug: + return debugCommand(command); - case cli.CommandType.deploymentAdd: - return deploymentAdd(command); + case cli.CommandType.deploymentAdd: + return deploymentAdd(command); - case cli.CommandType.deploymentHistoryClear: - return deploymentHistoryClear(command); + case cli.CommandType.deploymentHistoryClear: + return deploymentHistoryClear(command); - case cli.CommandType.deploymentHistory: - return deploymentHistory(command); + case cli.CommandType.deploymentHistory: + return deploymentHistory(command); - case cli.CommandType.deploymentList: - return deploymentList(command); + case cli.CommandType.deploymentList: + return deploymentList(command); - case cli.CommandType.deploymentRemove: - return deploymentRemove(command); + case cli.CommandType.deploymentRemove: + return deploymentRemove(command); - case cli.CommandType.deploymentRename: - return deploymentRename(command); + case cli.CommandType.deploymentRename: + return deploymentRename(command); - case cli.CommandType.link: - return link(command); + case cli.CommandType.link: + return link(command); - case cli.CommandType.login: - return login(command); + case cli.CommandType.login: + return login(command); - case cli.CommandType.logout: - return logout(command); + case cli.CommandType.logout: + return logout(command); - case cli.CommandType.patch: - return patch(command); + case cli.CommandType.patch: + return patch(command); - case cli.CommandType.promote: - return promote(command); + case cli.CommandType.promote: + return promote(command); - case cli.CommandType.register: - return register(command); + case cli.CommandType.register: + return register(command); - case cli.CommandType.release: - return release(command); + case cli.CommandType.release: + return release(command); - case cli.CommandType.releaseCordova: - return releaseCordova(command); + case cli.CommandType.releaseCordova: + return releaseCordova(command); - case cli.CommandType.releaseReact: - return releaseReact(command); + case cli.CommandType.releaseReact: + return releaseReact(command); - case cli.CommandType.rollback: - return rollback(command); + case cli.CommandType.rollback: + return rollback(command); - case cli.CommandType.whoami: - return whoami(command); + case cli.CommandType.whoami: + return whoami(command); - default: - // We should never see this message as invalid commands should be caught by the argument parser. - throw new Error("Invalid command: " + JSON.stringify(command)); - } - }); + default: + // We should never see this message as invalid commands should be caught by the argument parser. + throw new Error('Invalid command: ' + JSON.stringify(command)); + } + }); } function fileDoesNotExistOrIsDirectory(filePath: string): boolean { - try { - return fs.lstatSync(filePath).isDirectory(); - } catch (error) { - return true; - } + try { + return fs.lstatSync(filePath).isDirectory(); + } catch (error) { + return true; + } } function getTotalActiveFromDeploymentMetrics(metrics: DeploymentMetrics): number { - var totalActive = 0; - Object.keys(metrics).forEach((label: string) => { - totalActive += metrics[label].active; - }); + var totalActive = 0; + Object.keys(metrics).forEach((label: string) => { + totalActive += metrics[label].active; + }); - return totalActive; + return totalActive; } function initiateExternalAuthenticationAsync(action: string, serverUrl?: string): void { - var message: string; - - if (action === "link") { - message = `Please login to Mobile Center in the browser window we've just opened.\nIf you login with an additional authentication provider (e.g. GitHub) that shares the same email address, it will be linked to your current Mobile Center account.`; - - // For "link" there shouldn't be a token prompt, so we go straight to the Mobile Center URL to avoid that - out.text(message); - var url: string = serverUrl || AccountManager.MOBILE_CENTER_SERVER_URL; - opener(url); - } else { - // We use this now for both login & register - message = `Please login to Mobile Center in the browser window we've just opened.`; - - out.text(message); - var hostname: string = os.hostname(); - var url: string = `${serverUrl || AccountManager.SERVER_URL}/auth/${action}?hostname=${hostname}`; - opener(url); - } + var message: string; + + if (action === 'link') { + message = `Please login to Mobile Center in the browser window we've just opened.\nIf you login with an additional authentication provider (e.g. GitHub) that shares the same email address, it will be linked to your current Mobile Center account.`; + + // For "link" there shouldn't be a token prompt, so we go straight to the Mobile Center URL to avoid that + out.text(message); + var url: string = serverUrl || AccountManager.MOBILE_CENTER_SERVER_URL; + opener(url); + } else { + // We use this now for both login & register + message = `Please login to Mobile Center in the browser window we've just opened.`; + + out.text(message); + var hostname: string = os.hostname(); + var url: string = `${ + serverUrl || AccountManager.SERVER_URL + }/auth/${action}?hostname=${hostname}`; + opener(url); + } } function link(command: cli.ILinkCommand): Promise { - initiateExternalAuthenticationAsync("link", command.serverUrl); - return Promise.resolve(); + initiateExternalAuthenticationAsync('link', command.serverUrl); + return Promise.resolve(); } function login(command: cli.ILoginCommand): Promise { - // Check if one of the flags were provided. - if (command.accessKey) { - var proxy = getProxy(command.proxy, command.noProxy); - sdk = getSdk(command.accessKey, CLI_HEADERS, command.serverUrl, proxy); - return sdk.isAuthenticated().then((isAuthenticated: boolean): void => { - if (isAuthenticated) { - serializeConnectionInfo( - command.accessKey, - /*preserveAccessKeyOnLogout*/ true, - command.serverUrl, - command.proxy, - command.noProxy + // Check if one of the flags were provided. + if (command.accessKey) { + var proxy = getProxy(command.proxy, command.noProxy); + sdk = getSdk(command.accessKey, CLI_HEADERS, command.serverUrl, proxy); + return sdk.isAuthenticated().then((isAuthenticated: boolean): void => { + if (isAuthenticated) { + serializeConnectionInfo( + command.accessKey, + /*preserveAccessKeyOnLogout*/ true, + command.serverUrl, + command.proxy, + command.noProxy, + ); + } else { + throw new Error('Invalid access key.'); + } + }); + } else { + return loginWithExternalAuthentication( + 'login', + command.serverUrl, + command.proxy, + command.noProxy, ); - } else { - throw new Error("Invalid access key."); - } - }); - } else { - return loginWithExternalAuthentication("login", command.serverUrl, command.proxy, command.noProxy); - } + } } -function loginWithExternalAuthentication(action: string, serverUrl?: string, proxy?: string, noProxy?: boolean): Promise { - initiateExternalAuthenticationAsync(action, serverUrl); - out.text(""); // Insert newline - - return requestAccessKey().then( - (accessKey: string): Promise => { - if (accessKey === null) { - // The user has aborted the synchronous prompt (e.g.: via [CTRL]+[C]). - return; - } - - sdk = getSdk(accessKey, CLI_HEADERS, serverUrl, getProxy(proxy, noProxy)); - - return sdk.isAuthenticated().then((isAuthenticated: boolean): void => { - if (isAuthenticated) { - serializeConnectionInfo(accessKey, /*preserveAccessKeyOnLogout*/ false, serverUrl, proxy, noProxy); - } else { - throw new Error("Invalid token."); +function loginWithExternalAuthentication( + action: string, + serverUrl?: string, + proxy?: string, + noProxy?: boolean, +): Promise { + initiateExternalAuthenticationAsync(action, serverUrl); + out.text(''); // Insert newline + + return requestAccessKey().then((accessKey: string): Promise => { + if (accessKey === null) { + // The user has aborted the synchronous prompt (e.g.: via [CTRL]+[C]). + return; } - }); - } - ); + + sdk = getSdk(accessKey, CLI_HEADERS, serverUrl, getProxy(proxy, noProxy)); + + return sdk.isAuthenticated().then((isAuthenticated: boolean): void => { + if (isAuthenticated) { + serializeConnectionInfo( + accessKey, + /*preserveAccessKeyOnLogout*/ false, + serverUrl, + proxy, + noProxy, + ); + } else { + throw new Error('Invalid token.'); + } + }); + }); } function logout(command: cli.ICommand): Promise { - return Promise.resolve() - .then( - (): Promise => { - if (!connectionInfo.preserveAccessKeyOnLogout) { - var machineName: string = os.hostname(); - return sdk.removeSession(machineName).catch((error: CodePushError) => { - // If we are not authenticated or the session doesn't exist anymore, just swallow the error instead of displaying it - if (error.statusCode !== AccountManager.ERROR_UNAUTHORIZED && error.statusCode !== AccountManager.ERROR_NOT_FOUND) { - throw error; + return Promise.resolve() + .then((): Promise => { + if (!connectionInfo.preserveAccessKeyOnLogout) { + var machineName: string = os.hostname(); + return sdk.removeSession(machineName).catch((error: CodePushError) => { + // If we are not authenticated or the session doesn't exist anymore, just swallow the error instead of displaying it + if ( + error.statusCode !== AccountManager.ERROR_UNAUTHORIZED && + error.statusCode !== AccountManager.ERROR_NOT_FOUND + ) { + throw error; + } + }); } - }); - } - } - ) - .then((): void => { - sdk = null; - deleteConnectionInfoCache(); - }); + }) + .then((): void => { + sdk = null; + deleteConnectionInfoCache(); + }); } function formatDate(unixOffset: number): string { - var date: moment.Moment = moment(unixOffset); - var now: moment.Moment = moment(); - if (Math.abs(now.diff(date, "days")) < 30) { - return date.fromNow(); // "2 hours ago" - } else if (now.year() === date.year()) { - return date.format("MMM D"); // "Nov 6" - } else { - return date.format("MMM D, YYYY"); // "Nov 6, 2014" - } + var date: moment.Moment = moment(unixOffset); + var now: moment.Moment = moment(); + if (Math.abs(now.diff(date, 'days')) < 30) { + return date.fromNow(); // "2 hours ago" + } else if (now.year() === date.year()) { + return date.format('MMM D'); // "Nov 6" + } else { + return date.format('MMM D, YYYY'); // "Nov 6, 2014" + } } function printAppList(format: string, apps: App[]): void { - if (format === "json") { - printJson(apps); - } else if (format === "table") { - out.table( - out.getCommandOutputTableOptions(generateColoredTableTitles(["Name", "Deployments"])), - apps.map((app) => [app.name, wordwrap(50)(app.deployments.join(", "))]) - ); - } + if (format === 'json') { + printJson(apps); + } else if (format === 'table') { + out.table( + out.getCommandOutputTableOptions(generateColoredTableTitles(['Name', 'Deployments'])), + apps.map((app) => [app.name, wordwrap(50)(app.deployments.join(', '))]), + ); + } } -function getCollaboratorDisplayName(email: string, collaboratorProperties: CollaboratorProperties): string { - return collaboratorProperties.permission === AccountManager.AppPermission.OWNER ? email + chalk.magenta(" (Owner)") : email; +function getCollaboratorDisplayName( + email: string, + collaboratorProperties: CollaboratorProperties, +): string { + return collaboratorProperties.permission === AccountManager.AppPermission.OWNER + ? email + chalk.magenta(' (Owner)') + : email; } function printCollaboratorsList(format: string, collaborators: CollaboratorMap): void { - if (format === "json") { - var dataSource = { collaborators: collaborators }; - printJson(dataSource); - } else if (format === "table") { - out.table( - out.getCommandOutputTableOptions(generateColoredTableTitles(["E-mail Address"])), - collaborators.map((email) => [getCollaboratorDisplayName(email, collaborators[email])]) - ); - } -} - -function printDeploymentList(command: cli.IDeploymentListCommand, deployments: Deployment[], showPackage: boolean = true): void { - if (command.format === "json") { - printJson(deployments); - } else if (command.format === "table") { - const headers = ["Name"]; - if (command.displayKeys) { - headers.push("Deployment Key"); - } - - if (showPackage) { - headers.push("Update Metadata"); - headers.push("Install Metrics"); + if (format === 'json') { + var dataSource = { collaborators: collaborators }; + printJson(dataSource); + } else if (format === 'table') { + out.table( + out.getCommandOutputTableOptions(generateColoredTableTitles(['E-mail Address'])), + collaborators.map((email) => [getCollaboratorDisplayName(email, collaborators[email])]), + ); } +} - out.table( - out.getCommandOutputTableOptions(generateColoredTableTitles(headers)), - deployments.map((deployment: Deployment) => { - const row = [deployment.name]; +function printDeploymentList( + command: cli.IDeploymentListCommand, + deployments: Deployment[], + showPackage: boolean = true, +): void { + if (command.format === 'json') { + printJson(deployments); + } else if (command.format === 'table') { + const headers = ['Name']; if (command.displayKeys) { - row.push(deployment.key); + headers.push('Deployment Key'); } if (showPackage) { - row.push(getPackageString(deployment.package)); - row.push(getPackageMetricsString(deployment.package)); + headers.push('Update Metadata'); + headers.push('Install Metrics'); } - return row; - }) - ); - } + + out.table( + out.getCommandOutputTableOptions(generateColoredTableTitles(headers)), + deployments.map((deployment: Deployment) => { + const row = [deployment.name]; + if (command.displayKeys) { + row.push(deployment.key); + } + + if (showPackage) { + row.push(getPackageString(deployment.package)); + row.push(getPackageMetricsString(deployment.package)); + } + return row; + }), + ); + } } function printDeploymentHistory( - command: cli.IDeploymentHistoryCommand, - deploymentHistory: PackageWithMetrics[], - currentUserEmail: string + command: cli.IDeploymentHistoryCommand, + deploymentHistory: PackageWithMetrics[], + currentUserEmail: string, ): void { - if (command.format === "json") { - printJson(deploymentHistory); - } else if (command.format === "table") { - const headers = ["Label", "Release Time", "App Version", "Mandatory"]; - if (command.displayAuthor) { - headers.push("Released By"); - } - - headers.push("Description", "Install Metrics"); - out.table( - out.getCommandOutputTableOptions(generateColoredTableTitles(headers)), - deploymentHistory.map((packageObject: Package) => { - var releaseTime: string = formatDate(packageObject.uploadTime); - var releaseSource: string; - if (packageObject.releaseMethod === "Promote") { - releaseSource = `Promoted ${packageObject.originalLabel} from "${packageObject.originalDeployment}"`; - } else if (packageObject.releaseMethod === "Rollback") { - var labelNumber: number = parseInt(packageObject.label.substring(1)); - var lastLabel: string = "v" + (labelNumber - 1); - releaseSource = `Rolled back ${lastLabel} to ${packageObject.originalLabel}`; - } - - if (releaseSource) { - releaseTime += "\n" + chalk.magenta(`(${releaseSource})`).toString(); - } - - var row: string[] = [packageObject.label, releaseTime, packageObject.appVersion, packageObject.isMandatory ? "Yes" : "No"]; + if (command.format === 'json') { + printJson(deploymentHistory); + } else if (command.format === 'table') { + const headers = ['Label', 'Release Time', 'App Version', 'Mandatory']; if (command.displayAuthor) { - var releasedBy: string = packageObject.releasedBy ? packageObject.releasedBy : ""; - if (currentUserEmail && releasedBy === currentUserEmail) { - releasedBy = "You"; - } - - row.push(releasedBy); + headers.push('Released By'); } - row.push(packageObject.description ? wordwrap(30)(packageObject.description) : ""); - row.push(getPackageMetricsString(packageObject) + (packageObject.isDisabled ? `\n${chalk.green("Disabled:")} Yes` : "")); - if (packageObject.isDisabled) { - row = row.map((cellContents: string) => applyChalkSkippingLineBreaks(cellContents, (chalk).dim)); - } - return row; - }) - ); - } + headers.push('Description', 'Install Metrics'); + out.table( + out.getCommandOutputTableOptions(generateColoredTableTitles(headers)), + deploymentHistory.map((packageObject: Package) => { + var releaseTime: string = formatDate(packageObject.uploadTime); + var releaseSource: string; + if (packageObject.releaseMethod === 'Promote') { + releaseSource = `Promoted ${packageObject.originalLabel} from "${packageObject.originalDeployment}"`; + } else if (packageObject.releaseMethod === 'Rollback') { + var labelNumber: number = parseInt(packageObject.label.substring(1)); + var lastLabel: string = 'v' + (labelNumber - 1); + releaseSource = `Rolled back ${lastLabel} to ${packageObject.originalLabel}`; + } + + if (releaseSource) { + releaseTime += '\n' + chalk.magenta(`(${releaseSource})`).toString(); + } + + var row: string[] = [ + packageObject.label, + releaseTime, + packageObject.appVersion, + packageObject.isMandatory ? 'Yes' : 'No', + ]; + if (command.displayAuthor) { + var releasedBy: string = packageObject.releasedBy + ? packageObject.releasedBy + : ''; + if (currentUserEmail && releasedBy === currentUserEmail) { + releasedBy = 'You'; + } + + row.push(releasedBy); + } + + row.push(packageObject.description ? wordwrap(30)(packageObject.description) : ''); + row.push( + getPackageMetricsString(packageObject) + + (packageObject.isDisabled ? `\n${chalk.green('Disabled:')} Yes` : ''), + ); + if (packageObject.isDisabled) { + row = row.map((cellContents: string) => + applyChalkSkippingLineBreaks(cellContents, (chalk).dim), + ); + } + return row; + }), + ); + } } -function applyChalkSkippingLineBreaks(applyString: string, chalkMethod: (string: string) => any): string { - // Used to prevent "chalk" from applying styles to linebreaks which - // causes table border chars to have the style applied as well. - return applyString - .split("\n") - .map((token: string) => chalkMethod(token)) - .join("\n"); +function applyChalkSkippingLineBreaks( + applyString: string, + chalkMethod: (string: string) => any, +): string { + // Used to prevent "chalk" from applying styles to linebreaks which + // causes table border chars to have the style applied as well. + return applyString + .split('\n') + .map((token: string) => chalkMethod(token)) + .join('\n'); } function getPackageString(packageObject: Package): string { - if (!packageObject) { - return chalk.magenta("No updates released").toString(); - } - - var packageString: string = - chalk.green("Label: ") + - packageObject.label + - "\n" + - chalk.green("App Version: ") + - packageObject.appVersion + - "\n" + - chalk.green("Mandatory: ") + - (packageObject.isMandatory ? "Yes" : "No") + - "\n" + - chalk.green("Release Time: ") + - formatDate(packageObject.uploadTime) + - "\n" + - chalk.green("Released By: ") + - (packageObject.releasedBy ? packageObject.releasedBy : "") + - (packageObject.description ? wordwrap(70)("\n" + chalk.green("Description: ") + packageObject.description) : ""); - - if (packageObject.isDisabled) { - packageString += `\n${chalk.green("Disabled:")} Yes`; - } - - return packageString; + if (!packageObject) { + return chalk.magenta('No updates released').toString(); + } + + var packageString: string = + chalk.green('Label: ') + + packageObject.label + + '\n' + + chalk.green('App Version: ') + + packageObject.appVersion + + '\n' + + chalk.green('Mandatory: ') + + (packageObject.isMandatory ? 'Yes' : 'No') + + '\n' + + chalk.green('Release Time: ') + + formatDate(packageObject.uploadTime) + + '\n' + + chalk.green('Released By: ') + + (packageObject.releasedBy ? packageObject.releasedBy : '') + + (packageObject.description + ? wordwrap(70)('\n' + chalk.green('Description: ') + packageObject.description) + : ''); + + if (packageObject.isDisabled) { + packageString += `\n${chalk.green('Disabled:')} Yes`; + } + + return packageString; } function getPackageMetricsString(obj: Package): string { - var packageObject = obj; - var rolloutString: string = - obj && obj.rollout && obj.rollout !== 100 ? `\n${chalk.green("Rollout:")} ${obj.rollout.toLocaleString()}%` : ""; - - if (!packageObject || !packageObject.metrics) { - return chalk.magenta("No installs recorded").toString() + (rolloutString || ""); - } - - var activePercent: number = packageObject.metrics.totalActive - ? (packageObject.metrics.active / packageObject.metrics.totalActive) * 100 - : 0.0; - var percentString: string; - if (activePercent === 100.0) { - percentString = "100%"; - } else if (activePercent === 0.0) { - percentString = "0%"; - } else { - percentString = activePercent.toPrecision(2) + "%"; - } - - var numPending: number = packageObject.metrics.downloaded - packageObject.metrics.installed - packageObject.metrics.failed; - var returnString: string = - chalk.green("Active: ") + - percentString + - " (" + - packageObject.metrics.active.toLocaleString() + - " of " + - packageObject.metrics.totalActive.toLocaleString() + - ")\n" + - chalk.green("Total: ") + - packageObject.metrics.installed.toLocaleString(); - - if (numPending > 0) { - returnString += " (" + numPending.toLocaleString() + " pending)"; - } - - if (packageObject.metrics.failed) { - returnString += "\n" + chalk.green("Rollbacks: ") + chalk.red(packageObject.metrics.failed.toLocaleString() + ""); - } - - if (rolloutString) { - returnString += rolloutString; - } - - return returnString; + var packageObject = obj; + var rolloutString: string = + obj && obj.rollout && obj.rollout !== 100 + ? `\n${chalk.green('Rollout:')} ${obj.rollout.toLocaleString()}%` + : ''; + + if (!packageObject || !packageObject.metrics) { + return chalk.magenta('No installs recorded').toString() + (rolloutString || ''); + } + + var activePercent: number = packageObject.metrics.totalActive + ? (packageObject.metrics.active / packageObject.metrics.totalActive) * 100 + : 0.0; + var percentString: string; + if (activePercent === 100.0) { + percentString = '100%'; + } else if (activePercent === 0.0) { + percentString = '0%'; + } else { + percentString = activePercent.toPrecision(2) + '%'; + } + + var numPending: number = + packageObject.metrics.downloaded - + packageObject.metrics.installed - + packageObject.metrics.failed; + var returnString: string = + chalk.green('Active: ') + + percentString + + ' (' + + packageObject.metrics.active.toLocaleString() + + ' of ' + + packageObject.metrics.totalActive.toLocaleString() + + ')\n' + + chalk.green('Total: ') + + packageObject.metrics.installed.toLocaleString(); + + if (numPending > 0) { + returnString += ' (' + numPending.toLocaleString() + ' pending)'; + } + + if (packageObject.metrics.failed) { + returnString += + '\n' + + chalk.green('Rollbacks: ') + + chalk.red(packageObject.metrics.failed.toLocaleString() + ''); + } + + if (rolloutString) { + returnString += rolloutString; + } + + return returnString; } function printJson(object: any): void { - out.text(JSON.stringify(object, /*replacer=*/ null, /*spacing=*/ 2)); + out.text(JSON.stringify(object, /*replacer=*/ null, /*spacing=*/ 2)); } function printAccessKeys(format: string, keys: AccessKey[]): void { - if (format === "json") { - printJson(keys); - } else if (format === "table") { - var now = new Date().getTime(); + if (format === 'json') { + printJson(keys); + } else if (format === 'table') { + var now = new Date().getTime(); - var isExpired = (key: AccessKey): boolean => { - return now >= key.expires; - }; + var isExpired = (key: AccessKey): boolean => { + return now >= key.expires; + }; - // Access keys never expire in Mobile Center (at least for now--maybe that feature will get added later), so don't show the Expires column anymore - var keyToTableRow = (key: AccessKey, dim: boolean): string[] => { - var row: string[] = [ - key.name, - key.createdTime ? formatDate(key.createdTime) : "", - /* formatDate(key.expires) */ - ]; - - if (dim) { - row.forEach((col: string, index: number) => { - row[index] = (chalk).dim(col); - }); - } + // Access keys never expire in Mobile Center (at least for now--maybe that feature will get added later), so don't show the Expires column anymore + var keyToTableRow = (key: AccessKey, dim: boolean): string[] => { + var row: string[] = [ + key.name, + key.createdTime ? formatDate(key.createdTime) : '', + /* formatDate(key.expires) */ + ]; + + if (dim) { + row.forEach((col: string, index: number) => { + row[index] = (chalk).dim(col); + }); + } - return row; - }; + return row; + }; - out.table( - out.getCommandOutputTableOptions(generateColoredTableTitles(["Name", "Created" /*, "Expires" */])), - keys - .filter((key: AccessKey) => !isExpired(key)) - .map((key) => keyToTableRow(key, /*dim*/ false)) - .concat(keys.filter((key: AccessKey) => isExpired(key)).map((key) => keyToTableRow(key, /*dim*/ true))) - ); - } + out.table( + out.getCommandOutputTableOptions( + generateColoredTableTitles(['Name', 'Created' /*, "Expires" */]), + ), + keys + .filter((key: AccessKey) => !isExpired(key)) + .map((key) => keyToTableRow(key, /*dim*/ false)) + .concat( + keys + .filter((key: AccessKey) => isExpired(key)) + .map((key) => keyToTableRow(key, /*dim*/ true)), + ), + ); + } } function generateColoredTableTitles(tableTitles: string[]): string[] { - return tableTitles.map((title) => chalk.cyan(title)); + return tableTitles.map((title) => chalk.cyan(title)); } function register(command: cli.IRegisterCommand): Promise { - return loginWithExternalAuthentication("register", command.serverUrl, command.proxy, command.noProxy); + return loginWithExternalAuthentication( + 'register', + command.serverUrl, + command.proxy, + command.noProxy, + ); } function promote(command: cli.IPromoteCommand): Promise { - var packageInfo: PackageInfo = { - appVersion: command.appStoreVersion, - description: command.description, - label: command.label, - isDisabled: command.disabled, - isMandatory: command.mandatory, - rollout: command.rollout, - }; - - return sdk - .promote(command.appName, command.sourceDeploymentName, command.destDeploymentName, packageInfo) - .then((): void => { - out.text( - "Successfully promoted " + - (command.label ? '"' + command.label + '" of ' : "") + - 'the "' + - command.sourceDeploymentName + - '" deployment of the "' + - command.appName + - '" app to the "' + - command.destDeploymentName + - '" deployment.' - ); - }) - .catch((err: CodePushError) => releaseErrorHandler(err, command)); + var packageInfo: PackageInfo = { + appVersion: command.appStoreVersion, + description: command.description, + label: command.label, + isDisabled: command.disabled, + isMandatory: command.mandatory, + rollout: command.rollout, + }; + + return sdk + .promote( + command.appName, + command.sourceDeploymentName, + command.destDeploymentName, + packageInfo, + ) + .then((): void => { + out.text( + 'Successfully promoted ' + + (command.label ? '"' + command.label + '" of ' : '') + + 'the "' + + command.sourceDeploymentName + + '" deployment of the "' + + command.appName + + '" app to the "' + + command.destDeploymentName + + '" deployment.', + ); + }) + .catch((err: CodePushError) => releaseErrorHandler(err, command)); } function patch(command: cli.IPatchCommand): Promise { - var packageInfo: PackageInfo = { - appVersion: command.appStoreVersion, - description: command.description, - isMandatory: command.mandatory, - isDisabled: command.disabled, - rollout: command.rollout, - }; - - for (var updateProperty in packageInfo) { - if ((packageInfo)[updateProperty] !== null) { - return sdk.patchRelease(command.appName, command.deploymentName, command.label, packageInfo).then((): void => { - out.text( - `Successfully updated the "${command.label ? command.label : `latest`}" release of "${command.appName}" app's "${ - command.deploymentName - }" deployment.` - ); - }); + var packageInfo: PackageInfo = { + appVersion: command.appStoreVersion, + description: command.description, + isMandatory: command.mandatory, + isDisabled: command.disabled, + rollout: command.rollout, + }; + + for (var updateProperty in packageInfo) { + if ((packageInfo)[updateProperty] !== null) { + return sdk + .patchRelease(command.appName, command.deploymentName, command.label, packageInfo) + .then((): void => { + out.text( + `Successfully updated the "${ + command.label ? command.label : `latest` + }" release of "${command.appName}" app's "${ + command.deploymentName + }" deployment.`, + ); + }); + } } - } - throw new Error("At least one property must be specified to patch a release."); + throw new Error('At least one property must be specified to patch a release.'); } export var release = (command: cli.IReleaseCommand): Promise => { - if (isBinaryOrZip(command.package)) { - throw new Error( - "It is unnecessary to package releases in a .zip or binary file. Please specify the direct path to the update content's directory (e.g. /platforms/ios/www) or file (e.g. main.jsbundle)." - ); - } - - throwForInvalidSemverRange(command.appStoreVersion); - - return Promise.resolve().then(() => { - // Copy the command so that the original is not modified - var currentCommand: cli.IReleaseCommand = { - appName: command.appName, - appStoreVersion: command.appStoreVersion, - deploymentName: command.deploymentName, - description: command.description, - disabled: command.disabled, - mandatory: command.mandatory, - package: command.package, - rollout: command.rollout, - privateKeyPath: command.privateKeyPath, - type: command.type, - }; - - var releaseHooksPromise = hooks.reduce((accumulatedPromise: Promise, hook: cli.ReleaseHook) => { - return accumulatedPromise.then((modifiedCommand: cli.IReleaseCommand) => { - currentCommand = modifiedCommand || currentCommand; - return hook(currentCommand, command, sdk); - }); - }, Promise.resolve(currentCommand)); + if (isBinaryOrZip(command.package)) { + throw new Error( + "It is unnecessary to package releases in a .zip or binary file. Please specify the direct path to the update content's directory (e.g. /platforms/ios/www) or file (e.g. main.jsbundle).", + ); + } - return releaseHooksPromise.then(() => {}).catch((err: CodePushError) => releaseErrorHandler(err, command)); - }); -}; + throwForInvalidSemverRange(command.appStoreVersion); -export var releaseCordova = (command: cli.IReleaseCordovaCommand): Promise => { - var releaseCommand: cli.IReleaseCommand = command; - // Check for app and deployment exist before releasing an update. - // This validation helps to save about 1 minute or more in case user has typed wrong app or deployment name. - return validateDeployment(command.appName, command.deploymentName) - .then((): any => { - var platform: string = command.platform.toLowerCase(); - var projectRoot: string = process.cwd(); - var platformFolder: string = path.join(projectRoot, "platforms", platform); - var outputFolder: string; - - if (platform === "ios") { - outputFolder = path.join(platformFolder, "www"); - } else if (platform === "android") { - // Since cordova-android 7 assets directory moved to android/app/src/main/assets instead of android/assets - const outputFolderVer7 = path.join(platformFolder, "app", "src", "main", "assets", "www"); - if (fs.existsSync(outputFolderVer7)) { - outputFolder = outputFolderVer7; - } else { - outputFolder = path.join(platformFolder, "assets", "www"); - } - } else { - throw new Error('Platform must be either "ios" or "android".'); - } - - var cordovaCommand: string = command.build ? (command.isReleaseBuildType ? "build --release" : "build") : "prepare"; - var cordovaCLI: string = "cordova"; - - // Check whether the Cordova or PhoneGap CLIs are - // installed, and if not, fail early - try { - which.sync(cordovaCLI); - } catch (e) { - try { - cordovaCLI = "phonegap"; - which.sync(cordovaCLI); - } catch (e) { - throw new Error(`Unable to ${cordovaCommand} project. Please ensure that either the Cordova or PhoneGap CLI is installed.`); - } - } + return Promise.resolve().then(() => { + // Copy the command so that the original is not modified + var currentCommand: cli.IReleaseCommand = { + appName: command.appName, + appStoreVersion: command.appStoreVersion, + deploymentName: command.deploymentName, + description: command.description, + disabled: command.disabled, + mandatory: command.mandatory, + package: command.package, + rollout: command.rollout, + privateKeyPath: command.privateKeyPath, + type: command.type, + }; - out.text(chalk.cyan(`Running "${cordovaCLI} ${cordovaCommand}" command:\n`)); - try { - execSync([cordovaCLI, cordovaCommand, platform, "--verbose"].join(" "), { stdio: "inherit" }); - } catch (error) { - throw new Error( - `Unable to ${cordovaCommand} project. Please ensure that the CWD represents a Cordova project and that the "${platform}" platform was added by running "${cordovaCLI} platform add ${platform}".` + var releaseHooksPromise = hooks.reduce( + (accumulatedPromise: Promise, hook: cli.ReleaseHook) => { + return accumulatedPromise.then((modifiedCommand: cli.IReleaseCommand) => { + currentCommand = modifiedCommand || currentCommand; + return hook(currentCommand, command, sdk); + }); + }, + Promise.resolve(currentCommand), ); - } - - releaseCommand.package = outputFolder; - releaseCommand.type = cli.CommandType.release; - - return getCordovaProjectAppVersion(projectRoot); - }) - .then((appVersion: string) => { - var releaseTargetVersion: string; - if (command.appStoreVersion) { - releaseTargetVersion = command.appStoreVersion; - } else { - releaseTargetVersion = appVersion; - } - - throwForInvalidSemverRange(releaseTargetVersion); - releaseCommand.appStoreVersion = releaseTargetVersion; - - out.text(chalk.cyan("\nReleasing update contents to CodePush:\n")); - return release(releaseCommand); + + return releaseHooksPromise + .then(() => {}) + .catch((err: CodePushError) => releaseErrorHandler(err, command)); }); }; -export var releaseReact = (command: cli.IReleaseReactCommand): Promise => { - var bundleName: string = command.bundleName; - var entryFile: string = command.entryFile; - var outputFolder: string = command.outputDir || path.join(os.tmpdir(), "CodePush"); - var platform: string = (command.platform = command.platform.toLowerCase()); - var releaseCommand: cli.IReleaseCommand = command; - - // we have to add "CodePush" root forlder to make update contents file structure - // to be compatible with React Native client SDK - outputFolder = path.join(outputFolder, "CodePush"); - mkdirp.sync(outputFolder); - - // Check for app and deployment exist before releasing an update. - // This validation helps to save about 1 minute or more in case user has typed wrong app or deployment name. - return ( - validateDeployment(command.appName, command.deploymentName) - .then((): any => { - releaseCommand.package = outputFolder; - - switch (platform) { - case "android": - case "ios": - case "windows": - if (!bundleName) { - bundleName = platform === "ios" ? "main.jsbundle" : `index.${platform}.bundle`; +export var releaseCordova = (command: cli.IReleaseCordovaCommand): Promise => { + var releaseCommand: cli.IReleaseCommand = command; + // Check for app and deployment exist before releasing an update. + // This validation helps to save about 1 minute or more in case user has typed wrong app or deployment name. + return validateDeployment(command.appName, command.deploymentName) + .then((): any => { + var platform: string = command.platform.toLowerCase(); + var projectRoot: string = process.cwd(); + var platformFolder: string = path.join(projectRoot, 'platforms', platform); + var outputFolder: string; + + if (platform === 'ios') { + outputFolder = path.join(platformFolder, 'www'); + } else if (platform === 'android') { + // Since cordova-android 7 assets directory moved to android/app/src/main/assets instead of android/assets + const outputFolderVer7 = path.join( + platformFolder, + 'app', + 'src', + 'main', + 'assets', + 'www', + ); + if (fs.existsSync(outputFolderVer7)) { + outputFolder = outputFolderVer7; + } else { + outputFolder = path.join(platformFolder, 'assets', 'www'); + } + } else { + throw new Error('Platform must be either "ios" or "android".'); } - break; - default: - throw new Error('Platform must be "android", "ios", or "windows".'); - } - - try { - var projectPackageJson: any = require(path.join(process.cwd(), "package.json")); - var projectName: string = projectPackageJson.name; - if (!projectName) { - throw new Error('The "package.json" file in the CWD does not have the "name" field set.'); - } - - const isReactNativeProject: boolean = - projectPackageJson.dependencies["react-native"] || - (projectPackageJson.devDependencies && projectPackageJson.devDependencies["react-native"]); - if (!isReactNativeProject) { - throw new Error("The project in the CWD is not a React Native project."); - } - } catch (error) { - throw new Error( - 'Unable to find or read "package.json" in the CWD. The "release-react" command must be executed in a React Native project folder.' - ); - } - - if (!entryFile) { - entryFile = `index.${platform}.js`; - if (fileDoesNotExistOrIsDirectory(entryFile)) { - entryFile = "index.js"; - } - - if (fileDoesNotExistOrIsDirectory(entryFile)) { - throw new Error(`Entry file "index.${platform}.js" or "index.js" does not exist.`); - } - } else { - if (fileDoesNotExistOrIsDirectory(entryFile)) { - throw new Error(`Entry file "${entryFile}" does not exist.`); - } - } + var cordovaCommand: string = command.build + ? command.isReleaseBuildType + ? 'build --release' + : 'build' + : 'prepare'; + var cordovaCLI: string = 'cordova'; + + // Check whether the Cordova or PhoneGap CLIs are + // installed, and if not, fail early + try { + which.sync(cordovaCLI); + } catch (e) { + try { + cordovaCLI = 'phonegap'; + which.sync(cordovaCLI); + } catch (e) { + throw new Error( + `Unable to ${cordovaCommand} project. Please ensure that either the Cordova or PhoneGap CLI is installed.`, + ); + } + } - if (command.appStoreVersion) { - throwForInvalidSemverRange(command.appStoreVersion); - } + out.text(chalk.cyan(`Running "${cordovaCLI} ${cordovaCommand}" command:\n`)); + try { + execSync([cordovaCLI, cordovaCommand, platform, '--verbose'].join(' '), { + stdio: 'inherit', + }); + } catch (error) { + throw new Error( + `Unable to ${cordovaCommand} project. Please ensure that the CWD represents a Cordova project and that the "${platform}" platform was added by running "${cordovaCLI} platform add ${platform}".`, + ); + } - var appVersionPromise: Promise = command.appStoreVersion - ? Promise.resolve(command.appStoreVersion) - : getReactNativeProjectAppVersion(command, projectName); + releaseCommand.package = outputFolder; + releaseCommand.type = cli.CommandType.release; + + return getCordovaProjectAppVersion(projectRoot); + }) + .then((appVersion: string) => { + var releaseTargetVersion: string; + if (command.appStoreVersion) { + releaseTargetVersion = command.appStoreVersion; + } else { + releaseTargetVersion = appVersion; + } - if (command.sourcemapOutputDir && command.sourcemapOutput) { - out.text('\n"sourcemap-output-dir" argument will be ignored as "sourcemap-output" argument is provided.\n'); - } + throwForInvalidSemverRange(releaseTargetVersion); + releaseCommand.appStoreVersion = releaseTargetVersion; - if ((command.outputDir || command.sourcemapOutputDir) && !command.sourcemapOutput) { - const sourcemapDir = command.sourcemapOutputDir || releaseCommand.package; - command.sourcemapOutput = path.join(sourcemapDir, bundleName + ".map"); - } + out.text(chalk.cyan('\nReleasing update contents to CodePush:\n')); + return release(releaseCommand); + }); +}; - return appVersionPromise; - }) - .then((appVersion: string) => { - releaseCommand.appStoreVersion = appVersion; - return createEmptyTempReleaseFolder(outputFolder); - }) - // This is needed to clear the react native bundler cache: - // https://github.com/facebook/react-native/issues/4289 - .then(() => deleteFolder(`${os.tmpdir()}/react-*`)) - .then(() => - runReactNativeBundleCommand( - bundleName, - command.development || false, - entryFile, - outputFolder, - platform, - command.sourcemapOutput, - command.config - ) - ) - .then(() => { - if (platform === "android") { - return getHermesEnabled(command.gradleFile).then((isHermesEnabled) => { - if (isHermesEnabled) { - return runHermesEmitBinaryCommand( - bundleName, - outputFolder, - command.sourcemapOutput, - [] // TODO: extra flags - ); - } - }); - } - }) - .then(() => { - out.text(chalk.cyan("\nReleasing update contents to CodePush:\n")); - return release(releaseCommand); - }) - .then(() => { - if (!command.outputDir) { - deleteFolder(outputFolder); - } - }) - .catch((err: Error) => { - deleteFolder(outputFolder); - throw err; - }) - ); +export var releaseReact = (command: cli.IReleaseReactCommand): Promise => { + var bundleName: string = command.bundleName; + var entryFile: string = command.entryFile; + var outputFolder: string = command.outputDir || path.join(os.tmpdir(), 'CodePush'); + var platform: string = (command.platform = command.platform.toLowerCase()); + var releaseCommand: cli.IReleaseCommand = command; + + // we have to add "CodePush" root forlder to make update contents file structure + // to be compatible with React Native client SDK + outputFolder = path.join(outputFolder, 'CodePush'); + mkdirp.sync(outputFolder); + + // Check for app and deployment exist before releasing an update. + // This validation helps to save about 1 minute or more in case user has typed wrong app or deployment name. + return ( + validateDeployment(command.appName, command.deploymentName) + .then((): any => { + releaseCommand.package = outputFolder; + + switch (platform) { + case 'android': + case 'ios': + case 'windows': + if (!bundleName) { + bundleName = + platform === 'ios' ? 'main.jsbundle' : `index.${platform}.bundle`; + } + + break; + default: + throw new Error('Platform must be "android", "ios", or "windows".'); + } + + try { + var projectPackageJson: any = require(path.join(process.cwd(), 'package.json')); + var projectName: string = projectPackageJson.name; + if (!projectName) { + throw new Error( + 'The "package.json" file in the CWD does not have the "name" field set.', + ); + } + + const isReactNativeProject: boolean = + projectPackageJson.dependencies['react-native'] || + (projectPackageJson.devDependencies && + projectPackageJson.devDependencies['react-native']); + if (!isReactNativeProject) { + throw new Error('The project in the CWD is not a React Native project.'); + } + } catch (error) { + throw new Error( + 'Unable to find or read "package.json" in the CWD. The "release-react" command must be executed in a React Native project folder.', + ); + } + + if (!entryFile) { + entryFile = `index.${platform}.js`; + if (fileDoesNotExistOrIsDirectory(entryFile)) { + entryFile = 'index.js'; + } + + if (fileDoesNotExistOrIsDirectory(entryFile)) { + throw new Error( + `Entry file "index.${platform}.js" or "index.js" does not exist.`, + ); + } + } else { + if (fileDoesNotExistOrIsDirectory(entryFile)) { + throw new Error(`Entry file "${entryFile}" does not exist.`); + } + } + + if (command.appStoreVersion) { + throwForInvalidSemverRange(command.appStoreVersion); + } + + var appVersionPromise: Promise = command.appStoreVersion + ? Promise.resolve(command.appStoreVersion) + : getReactNativeProjectAppVersion(command, projectName); + + if (command.sourcemapOutputDir && command.sourcemapOutput) { + out.text( + '\n"sourcemap-output-dir" argument will be ignored as "sourcemap-output" argument is provided.\n', + ); + } + + if ((command.outputDir || command.sourcemapOutputDir) && !command.sourcemapOutput) { + const sourcemapDir = command.sourcemapOutputDir || releaseCommand.package; + command.sourcemapOutput = path.join(sourcemapDir, bundleName + '.map'); + } + + return appVersionPromise; + }) + .then((appVersion: string) => { + releaseCommand.appStoreVersion = appVersion; + return createEmptyTempReleaseFolder(outputFolder); + }) + // This is needed to clear the react native bundler cache: + // https://github.com/facebook/react-native/issues/4289 + .then(() => deleteFolder(`${os.tmpdir()}/react-*`)) + .then(() => + runReactNativeBundleCommand( + bundleName, + command.development || false, + entryFile, + outputFolder, + platform, + command.sourcemapOutput, + command.config, + command.extraBundlerOptions, + ), + ) + .then(() => { + if (platform === 'android') { + return getHermesEnabled(command.gradleFile).then((isHermesEnabled) => { + if (isHermesEnabled) { + return runHermesEmitBinaryCommand( + bundleName, + outputFolder, + command.sourcemapOutput, + command.extraHermesFlags, + ); + } + }); + } else if (platform === 'ios') { + return getiOSHermesEnabled(command.podFile).then((isHermesEnabled) => { + if (isHermesEnabled) { + return runHermesEmitBinaryCommand( + bundleName, + outputFolder, + command.sourcemapOutput, + command.extraHermesFlags, + ); + } + }); + } + }) + .then(() => { + out.text(chalk.cyan('\nReleasing update contents to CodePush:\n')); + return release(releaseCommand); + }) + .then(() => { + if (!command.outputDir) { + deleteFolder(outputFolder); + } + }) + .catch((err: Error) => { + deleteFolder(outputFolder); + throw err; + }) + ); }; function validateDeployment(appName: string, deploymentName: string): Promise { - return sdk.getDeployment(appName, deploymentName).catch((err: any) => { - // If we get an error that the deployment doesn't exist (but not the app doesn't exist), then tack on a more descriptive error message telling the user what to do - if (err.statusCode === AccountManager.ERROR_NOT_FOUND && err.message.indexOf("Deployment") !== -1) { - err.message = - err.message + - '\nUse "code-push deployment list" to view any existing deployments and "code-push deployment add" to add deployment(s) to the app.'; - } - throw err; - }); + return sdk.getDeployment(appName, deploymentName).catch((err: any) => { + // If we get an error that the deployment doesn't exist (but not the app doesn't exist), then tack on a more descriptive error message telling the user what to do + if ( + err.statusCode === AccountManager.ERROR_NOT_FOUND && + err.message.indexOf('Deployment') !== -1 + ) { + err.message = + err.message + + '\nUse "code-push deployment list" to view any existing deployments and "code-push deployment add" to add deployment(s) to the app.'; + } + throw err; + }); } function rollback(command: cli.IRollbackCommand): Promise { - return confirm().then((wasConfirmed: boolean) => { - if (!wasConfirmed) { - out.text("Rollback cancelled."); - return; - } + return confirm().then((wasConfirmed: boolean) => { + if (!wasConfirmed) { + out.text('Rollback cancelled.'); + return; + } - return sdk.rollback(command.appName, command.deploymentName, command.targetRelease || undefined).then((): void => { - out.text( - 'Successfully performed a rollback on the "' + command.deploymentName + '" deployment of the "' + command.appName + '" app.' - ); + return sdk + .rollback(command.appName, command.deploymentName, command.targetRelease || undefined) + .then((): void => { + out.text( + 'Successfully performed a rollback on the "' + + command.deploymentName + + '" deployment of the "' + + command.appName + + '" app.', + ); + }); }); - }); } function requestAccessKey(): Promise { - return new Promise((resolve): void => { - prompt.message = ""; - prompt.delimiter = ""; - - prompt.start(); - - prompt.get( - { - properties: { - response: { - description: chalk.cyan("Enter your token from the browser: "), - }, - }, - }, - (err: any, result: any): void => { - if (err) { - resolve(null); - } else { - resolve(result.response.trim()); - } - } - ); - }); + return new Promise((resolve): void => { + prompt.message = ''; + prompt.delimiter = ''; + + prompt.start(); + + prompt.get( + { + properties: { + response: { + description: chalk.cyan('Enter your token from the browser: '), + }, + }, + }, + (err: any, result: any): void => { + if (err) { + resolve(null); + } else { + resolve(result.response.trim()); + } + }, + ); + }); } function serializeConnectionInfo( - accessKey: string, - preserveAccessKeyOnLogout: boolean, - customServerUrl?: string, - proxy?: string, - noProxy?: boolean + accessKey: string, + preserveAccessKeyOnLogout: boolean, + customServerUrl?: string, + proxy?: string, + noProxy?: boolean, ): void { - var connectionInfo: ILoginConnectionInfo = { - accessKey: accessKey, - preserveAccessKeyOnLogout: preserveAccessKeyOnLogout, - proxy: proxy, - noProxy: noProxy, - }; - if (customServerUrl) { - connectionInfo.customServerUrl = customServerUrl; - } - - var json: string = JSON.stringify(connectionInfo); - fs.writeFileSync(configFilePath, json, { encoding: "utf8" }); - - out.text( - `\r\nSuccessfully logged-in. Your session file was written to ${chalk.cyan(configFilePath)}. You can run the ${chalk.cyan( - "code-push logout" - )} command at any time to delete this file and terminate your session.\r\n` - ); + var connectionInfo: ILoginConnectionInfo = { + accessKey: accessKey, + preserveAccessKeyOnLogout: preserveAccessKeyOnLogout, + proxy: proxy, + noProxy: noProxy, + }; + if (customServerUrl) { + connectionInfo.customServerUrl = customServerUrl; + } + + var json: string = JSON.stringify(connectionInfo); + fs.writeFileSync(configFilePath, json, { encoding: 'utf8' }); + + out.text( + `\r\nSuccessfully logged-in. Your session file was written to ${chalk.cyan( + configFilePath, + )}. You can run the ${chalk.cyan( + 'code-push logout', + )} command at any time to delete this file and terminate your session.\r\n`, + ); } function releaseErrorHandler(error: CodePushError, command: cli.ICommand): void { - if ((command).noDuplicateReleaseError && error.statusCode === AccountManager.ERROR_CONFLICT) { - console.warn(chalk.yellow("[Warning] " + error.message)); - } else { - throw error; - } + if ( + (command).noDuplicateReleaseError && + error.statusCode === AccountManager.ERROR_CONFLICT + ) { + console.warn(chalk.yellow('[Warning] ' + error.message)); + } else { + throw error; + } } function throwForInvalidEmail(email: string): void { - if (!emailValidator.validate(email)) { - throw new Error('"' + email + '" is an invalid e-mail address.'); - } + if (!emailValidator.validate(email)) { + throw new Error('"' + email + '" is an invalid e-mail address.'); + } } function throwForInvalidSemverRange(semverRange: string): void { - if (!isValidRange(semverRange)) { - throw new Error('Please use a semver-compliant target binary version range, for example "1.0.0", "*" or "^1.2.3".'); - } + if (!isValidRange(semverRange)) { + throw new Error( + 'Please use a semver-compliant target binary version range, for example "1.0.0", "*" or "^1.2.3".', + ); + } } function throwForInvalidOutputFormat(format: string): void { - switch (format) { - case "json": - case "table": - break; - - default: - throw new Error("Invalid format: " + format + "."); - } + switch (format) { + case 'json': + case 'table': + break; + + default: + throw new Error('Invalid format: ' + format + '.'); + } } function whoami(command: cli.ICommand): Promise { - return sdk.getAccountInfo().then((account): void => { - var accountInfo = `${account.email}`; + return sdk.getAccountInfo().then((account): void => { + var accountInfo = `${account.email}`; - var connectionInfo = deserializeConnectionInfo(); - if (connectionInfo.noProxy || connectionInfo.proxy) { - out.text(chalk.green("Account: ") + accountInfo); + var connectionInfo = deserializeConnectionInfo(); + if (connectionInfo.noProxy || connectionInfo.proxy) { + out.text(chalk.green('Account: ') + accountInfo); - var proxyInfo = chalk.green("Proxy: ") + (connectionInfo.noProxy ? "Ignored" : connectionInfo.proxy); - out.text(proxyInfo); - } else { - out.text(accountInfo); - } - }); + var proxyInfo = + chalk.green('Proxy: ') + + (connectionInfo.noProxy ? 'Ignored' : connectionInfo.proxy); + out.text(proxyInfo); + } else { + out.text(accountInfo); + } + }); } function getProxy(proxy?: string, noProxy?: boolean): string { - if (noProxy) return null; - if (!proxy) return process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy; - else return proxy; + if (noProxy) return null; + if (!proxy) + return ( + process.env.HTTPS_PROXY || + process.env.https_proxy || + process.env.HTTP_PROXY || + process.env.http_proxy + ); + else return proxy; } function isCommandOptionSpecified(option: any): boolean { - return option !== undefined && option !== null; + return option !== undefined && option !== null; } -function getSdk(accessKey: string, headers: Headers, customServerUrl: string, proxy: string): AccountManager { - var sdk: any = new AccountManager(accessKey, CLI_HEADERS, customServerUrl, proxy); - /* - * If the server returns `Unauthorized`, it must be due to an invalid - * (or expired) access key. For convenience, we patch every SDK call - * to delete the cached connection so the user can simply - * login again instead of having to log out first. - */ - Object.getOwnPropertyNames(AccountManager.prototype).forEach((functionName: any) => { - if (typeof sdk[functionName] === "function") { - var originalFunction = sdk[functionName]; - sdk[functionName] = function () { - var maybePromise: Promise = originalFunction.apply(sdk, arguments); - if (maybePromise && maybePromise.then !== undefined) { - maybePromise = maybePromise.catch((error: any) => { - if (error.statusCode && error.statusCode === AccountManager.ERROR_UNAUTHORIZED) { - deleteConnectionInfoCache(/* printMessage */ false); - } - - throw error; - }); +function getSdk( + accessKey: string, + headers: Headers, + customServerUrl: string, + proxy: string, +): AccountManager { + var sdk: any = new AccountManager(accessKey, CLI_HEADERS, customServerUrl, proxy); + /* + * If the server returns `Unauthorized`, it must be due to an invalid + * (or expired) access key. For convenience, we patch every SDK call + * to delete the cached connection so the user can simply + * login again instead of having to log out first. + */ + Object.getOwnPropertyNames(AccountManager.prototype).forEach((functionName: any) => { + if (typeof sdk[functionName] === 'function') { + var originalFunction = sdk[functionName]; + sdk[functionName] = function () { + var maybePromise: Promise = originalFunction.apply(sdk, arguments); + if (maybePromise && maybePromise.then !== undefined) { + maybePromise = maybePromise.catch((error: any) => { + if ( + error.statusCode && + error.statusCode === AccountManager.ERROR_UNAUTHORIZED + ) { + deleteConnectionInfoCache(/* printMessage */ false); + } + + throw error; + }); + } + + return maybePromise; + }; } + }); - return maybePromise; - }; - } - }); - - return sdk; + return sdk; } diff --git a/src/command-parser.ts b/src/command-parser.ts index e2f97554..3f37eea4 100644 --- a/src/command-parser.ts +++ b/src/command-parser.ts @@ -1,13 +1,14 @@ -import yargs from "yargs"; -import * as cli from "./definitions/cli"; -import chalk from "chalk"; -import updateNotifier from "update-notifier"; -import backslash = require("backslash"); -import parseDuration = require("parse-duration"); - -var packageJson = require("../package.json"); +import yargs from 'yargs'; +import * as cli from './definitions/cli'; +import chalk from 'chalk'; +import updateNotifier from 'update-notifier'; +import parseDuration from 'parse-duration'; + +import backslash = require('backslash'); + +var packageJson = require('../package.json'); const ROLLOUT_PERCENTAGE_REGEX: RegExp = /^(100|[1-9][0-9]|[1-9])%?$/; -const USAGE_PREFIX = "Usage: code-push"; +const USAGE_PREFIX = 'Usage: code-push'; // Command categories are: access-key, app, release, deployment, deployment-key, login, logout, register var isValidCommandCategory = false; @@ -16,288 +17,363 @@ var isValidCommand = false; var wasHelpShown = false; export function showHelp(showRootDescription?: boolean): void { - if (!wasHelpShown) { - if (showRootDescription) { - console.log(chalk.cyan(" _____ __ " + chalk.green(" ___ __ "))); - console.log(chalk.cyan(" / ___/__ ___/ /__" + chalk.green(" / _ \\__ _____ / / "))); - console.log(chalk.cyan("/ /__/ _ \\/ _ / -_)" + chalk.green(" ___/ // (_-") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example("access-key " + commandName + ' "VSTS Integration"', 'Creates a new access key with the name "VSTS Integration"'); - //.example("access-key " + commandName + " \"One time key\" --ttl 5m", "Creates a new access key with the name \"One time key\", which expires in 5 minutes") - //.option("ttl", { default: "60d", demand: false, description: "Duration string which specifies the amount of time that the access key should remain valid for (e.g 5m, 60d, 1y)", type: "string" }); - - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' access-key ' + commandName + ' ') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example( + 'access-key ' + commandName + ' "VSTS Integration"', + 'Creates a new access key with the name "VSTS Integration"', + ); + //.example("access-key " + commandName + " \"One time key\" --ttl 5m", "Creates a new access key with the name \"One time key\", which expires in 5 minutes") + //.option("ttl", { default: "60d", demand: false, description: "Duration string which specifies the amount of time that the access key should remain valid for (e.g 5m, 60d, 1y)", type: "string" }); + + addCommonConfiguration(yargs); } function accessKeyPatch(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " access-key " + commandName + " ") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example( - "access-key " + commandName + ' "Key for build server" --name "Key for CI machine"', - 'Renames the access key named "Key for build server" to "Key for CI machine"' - ) - .example( - "access-key " + commandName + ' "Key for build server" --ttl 7d', - 'Updates the access key named "Key for build server" to expire in 7 days' - ) - .option("name", { - default: null, - demand: false, - description: "Display name for the access key", - type: "string", - }) - .option("ttl", { - default: null, - demand: false, - description: "Duration string which specifies the amount of time that the access key should remain valid for (e.g 5m, 60d, 1y)", - type: "string", - }); - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' access-key ' + commandName + ' ') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example( + 'access-key ' + commandName + ' "Key for build server" --name "Key for CI machine"', + 'Renames the access key named "Key for build server" to "Key for CI machine"', + ) + .example( + 'access-key ' + commandName + ' "Key for build server" --ttl 7d', + 'Updates the access key named "Key for build server" to expire in 7 days', + ) + .option('name', { + default: null, + demand: false, + description: 'Display name for the access key', + type: 'string', + }) + .option('ttl', { + default: null, + demand: false, + description: + 'Duration string which specifies the amount of time that the access key should remain valid for (e.g 5m, 60d, 1y)', + type: 'string', + }); + addCommonConfiguration(yargs); } function accessKeyList(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " access-key " + commandName + " [options]") - .demand(/*count*/ 0, /*max*/ 0) - .example("access-key " + commandName, "Lists your access keys in tabular format") - .example("access-key " + commandName + " --format json", "Lists your access keys in JSON format") - .option("format", { - default: "table", - demand: false, - description: 'Output format to display your access keys with ("json" or "table")', - type: "string", - }); - - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' access-key ' + commandName + ' [options]') + .demand(/*count*/ 0, /*max*/ 0) + .example('access-key ' + commandName, 'Lists your access keys in tabular format') + .example( + 'access-key ' + commandName + ' --format json', + 'Lists your access keys in JSON format', + ) + .option('format', { + default: 'table', + demand: false, + description: 'Output format to display your access keys with ("json" or "table")', + type: 'string', + }); + + addCommonConfiguration(yargs); } function accessKeyRemove(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " access-key " + commandName + " ") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example("access-key " + commandName + ' "VSTS Integration"', 'Removes the "VSTS Integration" access key'); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' access-key ' + commandName + ' ') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example( + 'access-key ' + commandName + ' "VSTS Integration"', + 'Removes the "VSTS Integration" access key', + ); - addCommonConfiguration(yargs); + addCommonConfiguration(yargs); } function addCommonConfiguration(yargs: yargs.Argv): void { - yargs - .wrap(/*columnLimit*/ null) - .string("_") // Interpret non-hyphenated arguments as strings (e.g. an app version of '1.10'). - .strict() // Validate hyphenated (named) arguments. - .fail((msg: string) => showHelp()); // Suppress the default error message. + yargs + .wrap(/*columnLimit*/ null) + .string('_') // Interpret non-hyphenated arguments as strings (e.g. an app version of '1.10'). + // TODO: fix this + // .strict() // Validate hyphenated (named) arguments. + .fail((msg: string) => showHelp()); // Suppress the default error message. } function appList(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " app " + commandName + " [options]") - .demand(/*count*/ 0, /*max*/ 0) - .example("app " + commandName, "List your apps in tabular format") - .example("app " + commandName + " --format json", "List your apps in JSON format") - .option("format", { - default: "table", - demand: false, - description: 'Output format to display your apps with ("json" or "table")', - type: "string", - }); - - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' app ' + commandName + ' [options]') + .demand(/*count*/ 0, /*max*/ 0) + .example('app ' + commandName, 'List your apps in tabular format') + .example('app ' + commandName + ' --format json', 'List your apps in JSON format') + .option('format', { + default: 'table', + demand: false, + description: 'Output format to display your apps with ("json" or "table")', + type: 'string', + }); + + addCommonConfiguration(yargs); } function appRemove(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " app " + commandName + " ") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example("app " + commandName + " MyApp", 'Removes app "MyApp"'); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' app ' + commandName + ' ') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example('app ' + commandName + ' MyApp', 'Removes app "MyApp"'); - addCommonConfiguration(yargs); + addCommonConfiguration(yargs); } function listCollaborators(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " collaborator " + commandName + " [options]") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example("collaborator " + commandName + " MyApp", 'Lists the collaborators for app "MyApp" in tabular format') - .example("collaborator " + commandName + " MyApp --format json", 'Lists the collaborators for app "MyApp" in JSON format') - .option("format", { - default: "table", - demand: false, - description: 'Output format to display collaborators with ("json" or "table")', - type: "string", - }); - - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' collaborator ' + commandName + ' [options]') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example( + 'collaborator ' + commandName + ' MyApp', + 'Lists the collaborators for app "MyApp" in tabular format', + ) + .example( + 'collaborator ' + commandName + ' MyApp --format json', + 'Lists the collaborators for app "MyApp" in JSON format', + ) + .option('format', { + default: 'table', + demand: false, + description: 'Output format to display collaborators with ("json" or "table")', + type: 'string', + }); + + addCommonConfiguration(yargs); } function removeCollaborator(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " collaborator " + commandName + " ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example("collaborator " + commandName + " MyApp foo@bar.com", 'Removes foo@bar.com as a collaborator from app "MyApp"'); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' collaborator ' + commandName + ' ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'collaborator ' + commandName + ' MyApp foo@bar.com', + 'Removes foo@bar.com as a collaborator from app "MyApp"', + ); - addCommonConfiguration(yargs); + addCommonConfiguration(yargs); } function deploymentHistoryClear(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " deployment " + commandName + " ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example( - "deployment " + commandName + " MyApp MyDeployment", - 'Clears the release history associated with deployment "MyDeployment" from app "MyApp"' - ); - - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' deployment ' + commandName + ' ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'deployment ' + commandName + ' MyApp MyDeployment', + 'Clears the release history associated with deployment "MyDeployment" from app "MyApp"', + ); + + addCommonConfiguration(yargs); } function deploymentList(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " deployment " + commandName + " [options]") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example("deployment " + commandName + " MyApp", 'Lists the deployments for app "MyApp" in tabular format') - .example("deployment " + commandName + " MyApp --format json", 'Lists the deployments for app "MyApp" in JSON format') - .option("format", { - default: "table", - demand: false, - description: 'Output format to display your deployments with ("json" or "table")', - type: "string", - }) - .option("displayKeys", { - alias: "k", - default: false, - demand: false, - description: "Specifies whether to display the deployment keys", - type: "boolean", - }); - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' deployment ' + commandName + ' [options]') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example( + 'deployment ' + commandName + ' MyApp', + 'Lists the deployments for app "MyApp" in tabular format', + ) + .example( + 'deployment ' + commandName + ' MyApp --format json', + 'Lists the deployments for app "MyApp" in JSON format', + ) + .option('format', { + default: 'table', + demand: false, + description: 'Output format to display your deployments with ("json" or "table")', + type: 'string', + }) + .option('displayKeys', { + alias: 'k', + default: false, + demand: false, + description: 'Specifies whether to display the deployment keys', + type: 'boolean', + }); + addCommonConfiguration(yargs); } function deploymentRemove(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " deployment " + commandName + " ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example("deployment " + commandName + " MyApp MyDeployment", 'Removes deployment "MyDeployment" from app "MyApp"'); + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' deployment ' + commandName + ' ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'deployment ' + commandName + ' MyApp MyDeployment', + 'Removes deployment "MyDeployment" from app "MyApp"', + ); - addCommonConfiguration(yargs); + addCommonConfiguration(yargs); } function deploymentHistory(commandName: string, yargs: yargs.Argv): void { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " deployment " + commandName + " [options]") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example( - "deployment " + commandName + " MyApp MyDeployment", - 'Displays the release history for deployment "MyDeployment" from app "MyApp" in tabular format' - ) - .example( - "deployment " + commandName + " MyApp MyDeployment --format json", - 'Displays the release history for deployment "MyDeployment" from app "MyApp" in JSON format' - ) - .option("format", { - default: "table", - demand: false, - description: 'Output format to display the release history with ("json" or "table")', - type: "string", - }) - .option("displayAuthor", { - alias: "a", - default: false, - demand: false, - description: "Specifies whether to display the release author", - type: "boolean", - }); - - addCommonConfiguration(yargs); + isValidCommand = true; + yargs + .usage( + USAGE_PREFIX + ' deployment ' + commandName + ' [options]', + ) + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'deployment ' + commandName + ' MyApp MyDeployment', + 'Displays the release history for deployment "MyDeployment" from app "MyApp" in tabular format', + ) + .example( + 'deployment ' + commandName + ' MyApp MyDeployment --format json', + 'Displays the release history for deployment "MyDeployment" from app "MyApp" in JSON format', + ) + .option('format', { + default: 'table', + demand: false, + description: 'Output format to display the release history with ("json" or "table")', + type: 'string', + }) + .option('displayAuthor', { + alias: 'a', + default: false, + demand: false, + description: 'Specifies whether to display the release author', + type: 'boolean', + }); + + addCommonConfiguration(yargs); } var argv = yargs - .usage(USAGE_PREFIX + " ") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option argument. - .command("access-key", "View and manage the access keys associated with your account", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - yargs - .usage(USAGE_PREFIX + " access-key ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments. - .command("add", "Create a new access key associated with your account", (yargs: yargs.Argv) => accessKeyAdd("add", yargs)) - // Mobile Center doesn't support renaming access keys or changing their TTL (which never expire), so we no longer support patch - /* + .usage(USAGE_PREFIX + ' ') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option argument. + .command( + 'access-key', + 'View and manage the access keys associated with your account', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + yargs + .usage(USAGE_PREFIX + ' access-key ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments. + .command( + 'add', + 'Create a new access key associated with your account', + (yargs: yargs.Argv) => accessKeyAdd('add', yargs), + ) + // Mobile Center doesn't support renaming access keys or changing their TTL (which never expire), so we no longer support patch + /* .command("patch", "Update the name and/or TTL of an existing access key", (yargs: yargs.Argv) => accessKeyPatch("patch", yargs)) */ - .command("remove", "Remove an existing access key", (yargs: yargs.Argv) => accessKeyRemove("remove", yargs)) - .command("rm", "Remove an existing access key", (yargs: yargs.Argv) => accessKeyRemove("rm", yargs)) - .command("list", "List the access keys associated with your account", (yargs: yargs.Argv) => accessKeyList("list", yargs)) - .command("ls", "List the access keys associated with your account", (yargs: yargs.Argv) => accessKeyList("ls", yargs)) - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - - addCommonConfiguration(yargs); - }) - .command("app", "View and manage your CodePush apps", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - yargs - .usage(USAGE_PREFIX + " app ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments. - .command("add", "Add a new app to your account", (yargs: yargs.Argv): void => { - isValidCommand = true; + .command('remove', 'Remove an existing access key', (yargs: yargs.Argv) => + accessKeyRemove('remove', yargs), + ) + .command('rm', 'Remove an existing access key', (yargs: yargs.Argv) => + accessKeyRemove('rm', yargs), + ) + .command( + 'list', + 'List the access keys associated with your account', + (yargs: yargs.Argv) => accessKeyList('list', yargs), + ) + .command( + 'ls', + 'List the access keys associated with your account', + (yargs: yargs.Argv) => accessKeyList('ls', yargs), + ) + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. + + addCommonConfiguration(yargs); + }, + ) + .command('app', 'View and manage your CodePush apps', (yargs: yargs.Argv) => { + isValidCommandCategory = true; yargs - .usage(USAGE_PREFIX + " app add ") - .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments - .example("app add MyApp ios react-native", 'Adds app "MyApp", indicating that it\'s an iOS React Native app') - .example("app add MyApp windows react-native", 'Adds app "MyApp", indicating that it\'s a Windows React Native app') - .example("app add MyApp android cordova", 'Adds app "MyApp", indicating that it\'s an Android Cordova app'); + .usage(USAGE_PREFIX + ' app ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments. + .command('add', 'Add a new app to your account', (yargs: yargs.Argv): void => { + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' app add ') + .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments + .example( + 'app add MyApp ios react-native', + 'Adds app "MyApp", indicating that it\'s an iOS React Native app', + ) + .example( + 'app add MyApp windows react-native', + 'Adds app "MyApp", indicating that it\'s a Windows React Native app', + ) + .example( + 'app add MyApp android cordova', + 'Adds app "MyApp", indicating that it\'s an Android Cordova app', + ); - addCommonConfiguration(yargs); - }) - .command("remove", "Remove an app from your account", (yargs: yargs.Argv) => appRemove("remove", yargs)) - .command("rm", "Remove an app from your account", (yargs: yargs.Argv) => appRemove("rm", yargs)) - .command("rename", "Rename an existing app", (yargs: yargs.Argv) => { - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " app rename ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example("app rename CurrentName NewName", 'Renames app "CurrentName" to "NewName"'); + addCommonConfiguration(yargs); + }) + .command('remove', 'Remove an app from your account', (yargs: yargs.Argv) => + appRemove('remove', yargs), + ) + .command('rm', 'Remove an app from your account', (yargs: yargs.Argv) => + appRemove('rm', yargs), + ) + .command('rename', 'Rename an existing app', (yargs: yargs.Argv) => { + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' app rename ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'app rename CurrentName NewName', + 'Renames app "CurrentName" to "NewName"', + ); - addCommonConfiguration(yargs); - }) - .command("list", "Lists the apps associated with your account", (yargs: yargs.Argv) => appList("list", yargs)) - .command("ls", "Lists the apps associated with your account", (yargs: yargs.Argv) => appList("ls", yargs)) - /* + addCommonConfiguration(yargs); + }) + .command('list', 'Lists the apps associated with your account', (yargs: yargs.Argv) => + appList('list', yargs), + ) + .command('ls', 'Lists the apps associated with your account', (yargs: yargs.Argv) => + appList('ls', yargs), + ) + /* .command("transfer", "Transfer the ownership of an app to another account", (yargs: yargs.Argv) => { yargs.usage(USAGE_PREFIX + " app transfer ") .demand(2, 2) // Require exactly two non-option arguments @@ -306,1087 +382,1243 @@ var argv = yargs addCommonConfiguration(yargs); }) */ - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - addCommonConfiguration(yargs); - }) - .command("collaborator", "View and manage app collaborators", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - yargs - .usage(USAGE_PREFIX + " collaborator ") - .demand(2, 2) // Require exactly two non-option arguments. - .command("add", "Add a new collaborator to an app", (yargs: yargs.Argv): void => { + addCommonConfiguration(yargs); + }) + .command('collaborator', 'View and manage app collaborators', (yargs: yargs.Argv) => { + isValidCommandCategory = true; + yargs + .usage(USAGE_PREFIX + ' collaborator ') + .demand(2, 2) // Require exactly two non-option arguments. + .command('add', 'Add a new collaborator to an app', (yargs: yargs.Argv): void => { + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' collaborator add ') + .demand(2, 2) // Require exactly two non-option arguments + .example( + 'collaborator add MyApp foo@bar.com', + 'Adds foo@bar.com as a collaborator to app "MyApp"', + ); + + addCommonConfiguration(yargs); + }) + .command('remove', 'Remove a collaborator from an app', (yargs: yargs.Argv) => + removeCollaborator('remove', yargs), + ) + .command('rm', 'Remove a collaborator from an app', (yargs: yargs.Argv) => + removeCollaborator('rm', yargs), + ) + .command('list', 'List the collaborators for an app', (yargs: yargs.Argv) => + listCollaborators('list', yargs), + ) + .command('ls', 'List the collaborators for an app', (yargs: yargs.Argv) => + listCollaborators('ls', yargs), + ) + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. + + addCommonConfiguration(yargs); + }) + .command('debug', 'View the CodePush debug logs for a running app', (yargs: yargs.Argv) => { + isValidCommandCategory = true; isValidCommand = true; yargs - .usage(USAGE_PREFIX + " collaborator add ") - .demand(2, 2) // Require exactly two non-option arguments - .example("collaborator add MyApp foo@bar.com", 'Adds foo@bar.com as a collaborator to app "MyApp"'); + .usage(USAGE_PREFIX + ' debug ') + .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments + .example( + 'debug android', + 'View the CodePush debug logs for an Android emulator or device', + ) + .example('debug ios', 'View the CodePush debug logs for the iOS simulator'); addCommonConfiguration(yargs); - }) - .command("remove", "Remove a collaborator from an app", (yargs: yargs.Argv) => removeCollaborator("remove", yargs)) - .command("rm", "Remove a collaborator from an app", (yargs: yargs.Argv) => removeCollaborator("rm", yargs)) - .command("list", "List the collaborators for an app", (yargs: yargs.Argv) => listCollaborators("list", yargs)) - .command("ls", "List the collaborators for an app", (yargs: yargs.Argv) => listCollaborators("ls", yargs)) - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. + }) + .command('deployment', 'View and manage your app deployments', (yargs: yargs.Argv) => { + isValidCommandCategory = true; + yargs + .usage(USAGE_PREFIX + ' deployment ') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments. + .command('add', 'Add a new deployment to an app', (yargs: yargs.Argv): void => { + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' deployment add [deploymentName]') + .demand(/*count*/ 1, /*max*/ 2) // Require the app name, with deploymentName optional (either deploymentName or --default needs to be specified) + .option('default', { + alias: 'd', + demand: false, + description: 'Add the default "Staging" and "Production" deployments', + type: 'boolean', + }) + .example( + 'deployment add MyApp --default', + 'Adds default "Staging" and "Production" deployments to app "MyApp"', + ) + .example( + 'deployment add MyApp MyDeployment', + 'Adds deployment "MyDeployment" to app "MyApp"', + ); - addCommonConfiguration(yargs); - }) - .command("debug", "View the CodePush debug logs for a running app", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " debug ") - .demand(/*count*/ 1, /*max*/ 1) // Require exactly one non-option arguments - .example("debug android", "View the CodePush debug logs for an Android emulator or device") - .example("debug ios", "View the CodePush debug logs for the iOS simulator"); + addCommonConfiguration(yargs); + }) + .command( + 'clear', + 'Clear the release history associated with a deployment', + (yargs: yargs.Argv) => deploymentHistoryClear('clear', yargs), + ) + .command('remove', 'Remove a deployment from an app', (yargs: yargs.Argv) => + deploymentRemove('remove', yargs), + ) + .command('rm', 'Remove a deployment from an app', (yargs: yargs.Argv) => + deploymentRemove('rm', yargs), + ) + .command('rename', 'Rename an existing deployment', (yargs: yargs.Argv) => { + isValidCommand = true; + yargs + .usage( + USAGE_PREFIX + + ' deployment rename ', + ) + .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments + .example( + 'deployment rename MyApp CurrentDeploymentName NewDeploymentName', + 'Renames deployment "CurrentDeploymentName" to "NewDeploymentName"', + ); - addCommonConfiguration(yargs); - }) - .command("deployment", "View and manage your app deployments", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - yargs - .usage(USAGE_PREFIX + " deployment ") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments. - .command("add", "Add a new deployment to an app", (yargs: yargs.Argv): void => { + addCommonConfiguration(yargs); + }) + .command('list', 'List the deployments associated with an app', (yargs: yargs.Argv) => + deploymentList('list', yargs), + ) + .command('ls', 'List the deployments associated with an app', (yargs: yargs.Argv) => + deploymentList('ls', yargs), + ) + .command( + 'history', + 'Display the release history for a deployment', + (yargs: yargs.Argv) => deploymentHistory('history', yargs), + ) + .command('h', 'Display the release history for a deployment', (yargs: yargs.Argv) => + deploymentHistory('h', yargs), + ) + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. + + addCommonConfiguration(yargs); + }) + .command( + 'link', + 'Link an additional authentication provider (e.g. GitHub) to an existing Mobile Center account', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' link') + .demand(/*count*/ 0, /*max*/ 1) //set 'max' to one to allow usage of serverUrl undocument parameter for testing + .example('link', 'Links an account on the Mobile Center server') + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. + + addCommonConfiguration(yargs); + }, + ) + .command('login', 'Authenticate in order to begin managing your apps', (yargs: yargs.Argv) => { + isValidCommandCategory = true; isValidCommand = true; yargs - .usage(USAGE_PREFIX + " deployment add [deploymentName]") - .demand(/*count*/ 1, /*max*/ 2) // Require the app name, with deploymentName optional (either deploymentName or --default needs to be specified) - .option("default", { - alias: "d", - demand: false, - description: 'Add the default "Staging" and "Production" deployments', - type: "boolean", - }) - .example("deployment add MyApp --default", 'Adds default "Staging" and "Production" deployments to app "MyApp"') - .example("deployment add MyApp MyDeployment", 'Adds deployment "MyDeployment" to app "MyApp"'); + .usage(USAGE_PREFIX + ' login [options]') + .demand(/*count*/ 1, /*max*/ 1) + .example('login', 'Logs in to the Mobile Center server') + .example( + 'login https://codepushserver --accessKey mykey', + 'Logs in on behalf of the user who owns and created the access key "mykey"', + ) + .example( + 'login https://codepushserver --proxy http://someproxy.com:455', + 'Logs in with the specified proxy url', + ) + .option('accessKey', { + alias: 'key', + default: null, + demand: false, + description: + 'Access key to authenticate against the Mobile Center server with, instead of providing your username and password credentials', + type: 'string', + }) + .option('proxy', { + default: null, + demand: false, + description: 'URL of the proxy server to use', + type: 'string', + }) + .option('noProxy', { + default: false, + demand: false, + description: 'Bypass the system-wide proxy settings', + type: 'boolean', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. addCommonConfiguration(yargs); - }) - .command("clear", "Clear the release history associated with a deployment", (yargs: yargs.Argv) => - deploymentHistoryClear("clear", yargs) - ) - .command("remove", "Remove a deployment from an app", (yargs: yargs.Argv) => deploymentRemove("remove", yargs)) - .command("rm", "Remove a deployment from an app", (yargs: yargs.Argv) => deploymentRemove("rm", yargs)) - .command("rename", "Rename an existing deployment", (yargs: yargs.Argv) => { + }) + .command('logout', 'Log out of the current session', (yargs: yargs.Argv) => { + isValidCommandCategory = true; isValidCommand = true; yargs - .usage(USAGE_PREFIX + " deployment rename ") - .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments - .example( - "deployment rename MyApp CurrentDeploymentName NewDeploymentName", - 'Renames deployment "CurrentDeploymentName" to "NewDeploymentName"' - ); - + .usage(USAGE_PREFIX + ' logout') + .demand(/*count*/ 0, /*max*/ 0) + .example('logout', 'Logs out and ends your current session'); addCommonConfiguration(yargs); - }) - .command("list", "List the deployments associated with an app", (yargs: yargs.Argv) => deploymentList("list", yargs)) - .command("ls", "List the deployments associated with an app", (yargs: yargs.Argv) => deploymentList("ls", yargs)) - .command("history", "Display the release history for a deployment", (yargs: yargs.Argv) => deploymentHistory("history", yargs)) - .command("h", "Display the release history for a deployment", (yargs: yargs.Argv) => deploymentHistory("h", yargs)) - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - - addCommonConfiguration(yargs); - }) - .command( - "link", - "Link an additional authentication provider (e.g. GitHub) to an existing Mobile Center account", - (yargs: yargs.Argv) => { - isValidCommandCategory = true; - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " link") - .demand(/*count*/ 0, /*max*/ 1) //set 'max' to one to allow usage of serverUrl undocument parameter for testing - .example("link", "Links an account on the Mobile Center server") - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - - addCommonConfiguration(yargs); - } - ) - .command("login", "Authenticate in order to begin managing your apps", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " login [options]") - .demand(/*count*/ 0, /*max*/ 1) //set 'max' to one to allow usage of serverUrl undocument parameter for testing - .example("login", "Logs in to the Mobile Center server") - .example("login --accessKey mykey", 'Logs in on behalf of the user who owns and created the access key "mykey"') - .example("login --proxy http://someproxy.com:455", "Logs in with the specified proxy url") - .option("accessKey", { - alias: "key", - default: null, - demand: false, - description: - "Access key to authenticate against the Mobile Center server with, instead of providing your username and password credentials", - type: "string", - }) - .option("proxy", { - default: null, - demand: false, - description: "URL of the proxy server to use", - type: "string", - }) - .option("noProxy", { - default: false, - demand: false, - description: "Bypass the system-wide proxy settings", - type: "boolean", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - - addCommonConfiguration(yargs); - }) - .command("logout", "Log out of the current session", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " logout") - .demand(/*count*/ 0, /*max*/ 0) - .example("logout", "Logs out and ends your current session"); - addCommonConfiguration(yargs); - }) - .command("patch", "Update the metadata for an existing release", (yargs: yargs.Argv) => { - yargs - .usage(USAGE_PREFIX + " patch [options]") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example( - 'patch MyApp Production --des "Updated description" -r 50%', - 'Updates the description of the latest release for "MyApp" app\'s "Production" deployment and updates the rollout value to 50%' - ) - .example( - 'patch MyApp Production -l v3 --des "Updated description for v3"', - 'Updates the description of the release with label v3 for "MyApp" app\'s "Production" deployment' - ) - .option("label", { - alias: "l", - default: null, - demand: false, - description: "Label of the release to update. Defaults to the latest release within the specified deployment", - type: "string", - }) - .option("description", { - alias: "des", - default: null, - demand: false, - description: "Description of the changes made to the app with this release", - type: "string", - }) - .option("disabled", { - alias: "x", - default: null, - demand: false, - description: "Specifies whether this release should be immediately downloadable", - type: "boolean", - }) - .option("mandatory", { - alias: "m", - default: null, - demand: false, - description: "Specifies whether this release should be considered mandatory", - type: "boolean", - }) - .option("rollout", { - alias: "r", - default: null, - demand: false, - description: - "Percentage of users this release should be immediately available to. This attribute can only be increased from the current value.", - type: "string", - }) - .option("targetBinaryVersion", { - alias: "t", - default: null, - demand: false, - description: "Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3).", - type: "string", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => { - return isValidRollout(argv); - }); - - addCommonConfiguration(yargs); - }) - .command("promote", "Promote the latest release from one app deployment to another", (yargs: yargs.Argv) => { - yargs - .usage(USAGE_PREFIX + " promote [options]") - .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments - .example( - "promote MyApp Staging Production", - 'Promotes the latest release within the "Staging" deployment of "MyApp" to "Production"' - ) - .example( - 'promote MyApp Staging Production --des "Production rollout" -r 25', - 'Promotes the latest release within the "Staging" deployment of "MyApp" to "Production", with an updated description, and targeting only 25% of the users' - ) - .option("description", { - alias: "des", - default: null, - demand: false, - description: - "Description of the changes made to the app with this release. If omitted, the description from the release being promoted will be used.", - type: "string", - }) - .option("label", { - alias: "l", - default: null, - demand: false, - description: "Label of the source release that will be taken. If omitted, the latest release being promoted will be used.", - type: "string", - }) - .option("disabled", { - alias: "x", - default: null, - demand: false, - description: - "Specifies whether this release should be immediately downloadable. If omitted, the disabled attribute from the release being promoted will be used.", - type: "boolean", - }) - .option("mandatory", { - alias: "m", - default: null, - demand: false, - description: - "Specifies whether this release should be considered mandatory. If omitted, the mandatory property from the release being promoted will be used.", - type: "boolean", - }) - .option("noDuplicateReleaseError", { - default: false, - demand: false, - description: - "When this flag is set, promoting a package that is identical to the latest release on the target deployment will produce a warning instead of an error", - type: "boolean", - }) - .option("rollout", { - alias: "r", - default: "100%", - demand: false, - description: "Percentage of users this update should be immediately available to", - type: "string", - }) - .option("targetBinaryVersion", { - alias: "t", - default: null, - demand: false, - description: - "Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3). If omitted, the target binary version property from the release being promoted will be used.", - type: "string", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => { - return isValidRollout(argv); - }); - - addCommonConfiguration(yargs); - }) - .command("register", "Register a new Mobile Center account", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " register") - .demand(/*count*/ 0, /*max*/ 1) //set 'max' to one to allow usage of serverUrl undocument parameter for testing - .example("register", "Registers a new Mobile Center account") - .example("register --proxy http://someproxy.com:455", "Registers with the specified proxy url") - .option("proxy", { - default: null, - demand: false, - description: "URL of the proxy server to use", - type: "string", - }) - .option("noProxy", { - default: false, - demand: false, - description: "Bypass the system-wide proxy settings", - type: "boolean", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - - addCommonConfiguration(yargs); - }) - .command("release", "Release an update to an app deployment", (yargs: yargs.Argv) => { - yargs - .usage(USAGE_PREFIX + " release [options]") - .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments. - .example( - 'release MyApp app.js "*"', - 'Releases the "app.js" file to the "MyApp" app\'s "Staging" deployment, targeting any binary version using the "*" wildcard range syntax.' - ) - .example( - "release MyApp ./platforms/ios/www 1.0.3 -d Production -k ~/.ssh/codepush_rsa", - 'Releases the "./platforms/ios/www" folder and all its contents to the "MyApp" app\'s "Production" deployment, targeting only the 1.0.3 binary version and signed with the "codepush_rsa" private key' - ) - .example( - "release MyApp ./platforms/ios/www 1.0.3 -d Production -r 20", - 'Releases the "./platforms/ios/www" folder and all its contents to the "MyApp" app\'s "Production" deployment, targeting the 1.0.3 binary version and rolling out to about 20% of the users' - ) - .option("deploymentName", { - alias: "d", - default: "Staging", - demand: false, - description: "Deployment to release the update to", - type: "string", - }) - .option("description", { - alias: "des", - default: null, - demand: false, - description: "Description of the changes made to the app in this release", - type: "string", - }) - .option("disabled", { - alias: "x", - default: false, - demand: false, - description: "Specifies whether this release should be immediately downloadable", - type: "boolean", - }) - .option("mandatory", { - alias: "m", - default: false, - demand: false, - description: "Specifies whether this release should be considered mandatory", - type: "boolean", - }) - .option("privateKeyPath", { - alias: "k", - default: false, - demand: false, - description: "Specifies the location of a RSA private key to sign the release with", - type: "string", - }) - .option("noDuplicateReleaseError", { - default: false, - demand: false, - description: - "When this flag is set, releasing a package that is identical to the latest release will produce a warning instead of an error", - type: "boolean", - }) - .option("rollout", { - alias: "r", - default: "100%", - demand: false, - description: "Percentage of users this release should be available to", - type: "string", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => { - return checkValidReleaseOptions(argv); - }); - - addCommonConfiguration(yargs); - }) - .command("release-cordova", "Release a Cordova update to an app deployment", (yargs: yargs.Argv) => { - yargs - .usage(USAGE_PREFIX + " release-cordova [options]") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example( - "release-cordova MyApp ios", - 'Releases the Cordova iOS project in the current working directory to the "MyApp" app\'s "Staging" deployment' - ) - .example( - "release-cordova MyApp android -d Production", - 'Releases the Cordova Android project in the current working directory to the "MyApp" app\'s "Production" deployment' - ) - .option("build", { - alias: "b", - default: false, - demand: false, - description: 'Invoke "cordova build" instead of "cordova prepare"', - type: "boolean", - }) - .option("isReleaseBuildType", { - alias: "rb", - default: false, - demand: false, - description: 'If "build" option is true specifies whether perform a release build', - type: "boolean", - }) - .option("deploymentName", { - alias: "d", - default: "Staging", - demand: false, - description: "Deployment to release the update to", - type: "string", - }) - .option("description", { - alias: "des", - default: null, - demand: false, - description: "Description of the changes made to the app in this release", - type: "string", - }) - .option("disabled", { - alias: "x", - default: false, - demand: false, - description: "Specifies whether this release should be immediately downloadable", - type: "boolean", - }) - .option("mandatory", { - alias: "m", - default: false, - demand: false, - description: "Specifies whether this release should be considered mandatory", - type: "boolean", - }) - .option("privateKeyPath", { - alias: "k", - default: false, - demand: false, - description: "Specifies the location of a RSA private key to sign the release with", - type: "string", - }) - .option("noDuplicateReleaseError", { - default: false, - demand: false, - description: - "When this flag is set, releasing a package that is identical to the latest release will produce a warning instead of an error", - type: "boolean", - }) - .option("rollout", { - alias: "r", - default: "100%", - demand: false, - description: "Percentage of users this release should be immediately available to", - type: "string", - }) - .option("targetBinaryVersion", { - alias: "t", - default: null, - demand: false, - description: - "Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3). If omitted, the release will target the exact version specified in the config.xml file.", - type: "string", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => { - return checkValidReleaseOptions(argv); - }); + }) + .command('patch', 'Update the metadata for an existing release', (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' patch [options]') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'patch MyApp Production --des "Updated description" -r 50%', + 'Updates the description of the latest release for "MyApp" app\'s "Production" deployment and updates the rollout value to 50%', + ) + .example( + 'patch MyApp Production -l v3 --des "Updated description for v3"', + 'Updates the description of the release with label v3 for "MyApp" app\'s "Production" deployment', + ) + .option('label', { + alias: 'l', + default: null, + demand: false, + description: + 'Label of the release to update. Defaults to the latest release within the specified deployment', + type: 'string', + }) + .option('description', { + alias: 'des', + default: null, + demand: false, + description: 'Description of the changes made to the app with this release', + type: 'string', + }) + .option('disabled', { + alias: 'x', + default: null, + demand: false, + description: 'Specifies whether this release should be immediately downloadable', + type: 'boolean', + }) + .option('mandatory', { + alias: 'm', + default: null, + demand: false, + description: 'Specifies whether this release should be considered mandatory', + type: 'boolean', + }) + .option('rollout', { + alias: 'r', + default: null, + demand: false, + description: + 'Percentage of users this release should be immediately available to. This attribute can only be increased from the current value.', + type: 'string', + }) + .option('targetBinaryVersion', { + alias: 't', + default: null, + demand: false, + description: + 'Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3).', + type: 'string', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => { + return isValidRollout(argv); + }); - addCommonConfiguration(yargs); - }) - .command("release-react", "Release a React Native update to an app deployment", (yargs: yargs.Argv) => { - yargs - .usage(USAGE_PREFIX + " release-react [options]") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example( - "release-react MyApp ios", - 'Releases the React Native iOS project in the current working directory to the "MyApp" app\'s "Staging" deployment' - ) - .example( - "release-react MyApp android -d Production -k ~/.ssh/codepush_rsa", - 'Releases the React Native Android project in the current working directory to the "MyApp" app\'s "Production" deployment, signed with the "codepush_rsa" private key' - ) - .example( - "release-react MyApp windows --dev", - 'Releases the development bundle of the React Native Windows project in the current working directory to the "MyApp" app\'s "Staging" deployment' - ) - .option("bundleName", { - alias: "b", - default: null, - demand: false, - description: - 'Name of the generated JS bundle file. If unspecified, the standard bundle name will be used, depending on the specified platform: "main.jsbundle" (iOS), "index.android.bundle" (Android) or "index.windows.bundle" (Windows)', - type: "string", - }) - .option("deploymentName", { - alias: "d", - default: "Staging", - demand: false, - description: "Deployment to release the update to", - type: "string", - }) - .option("description", { - alias: "des", - default: null, - demand: false, - description: "Description of the changes made to the app with this release", - type: "string", - }) - .option("development", { - alias: "dev", - default: false, - demand: false, - description: "Specifies whether to generate a dev or release build", - type: "boolean", - }) - .option("disabled", { - alias: "x", - default: false, - demand: false, - description: "Specifies whether this release should be immediately downloadable", - type: "boolean", - }) - .option("entryFile", { - alias: "e", - default: null, - demand: false, - description: - 'Path to the app\'s entry Javascript file. If omitted, "index..js" and then "index.js" will be used (if they exist)', - type: "string", - }) - .option("gradleFile", { - alias: "g", - default: null, - demand: false, - description: "Path to the gradle file which specifies the binary version you want to target this release at (android only).", - }) - .option("mandatory", { - alias: "m", - default: false, - demand: false, - description: "Specifies whether this release should be considered mandatory", - type: "boolean", - }) - .option("noDuplicateReleaseError", { - default: false, - demand: false, - description: - "When this flag is set, releasing a package that is identical to the latest release will produce a warning instead of an error", - type: "boolean", - }) - .option("plistFile", { - alias: "p", - default: null, - demand: false, - description: "Path to the plist file which specifies the binary version you want to target this release at (iOS only).", - }) - .option("plistFilePrefix", { - alias: "pre", - default: null, - demand: false, - description: "Prefix to append to the file name when attempting to find your app's Info.plist file (iOS only).", - }) - .option("rollout", { - alias: "r", - default: "100%", - demand: false, - description: "Percentage of users this release should be immediately available to", - type: "string", - }) - .option("privateKeyPath", { - alias: "k", - default: false, - demand: false, - description: "Specifies the location of a RSA private key to sign the release with", - type: "string", - }) - .option("sourcemapOutput", { - alias: "s", - default: null, - demand: false, - description: - "Path to where the sourcemap for the resulting bundle should be written. If omitted, a sourcemap will not be generated.", - type: "string", - }) - .option("sourcemapOutputDir", { - default: null, - demand: false, - description: - 'Path to folder where the sourcemap for the resulting bundle should be written. Name of sourcemap file will be generated automatically. This argument will be ignored if "sourcemap-output" argument is provided. If omitted, a sourcemap will not be generated.', - type: "string", - }) - .option("targetBinaryVersion", { - alias: "t", - default: null, - demand: false, - description: - 'Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3). If omitted, the release will target the exact version specified in the "Info.plist" (iOS), "build.gradle" (Android) or "Package.appxmanifest" (Windows) files.', - type: "string", - }) - .option("outputDir", { - alias: "o", - default: null, - demand: false, - description: - "Path to where the bundle and sourcemap should be written. If omitted, a bundle and sourcemap will not be written.", - type: "string", - }) - .option("config", { - alias: "c", - default: null, - demand: false, - description: "Path to the React Native CLI configuration file", - type: "string", - }) - .check((argv: any, aliases: { [aliases: string]: string }): any => { - return checkValidReleaseOptions(argv); - }); + addCommonConfiguration(yargs); + }) + .command( + 'promote', + 'Promote the latest release from one app deployment to another', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage( + USAGE_PREFIX + + ' promote [options]', + ) + .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments + .example( + 'promote MyApp Staging Production', + 'Promotes the latest release within the "Staging" deployment of "MyApp" to "Production"', + ) + .example( + 'promote MyApp Staging Production --des "Production rollout" -r 25', + 'Promotes the latest release within the "Staging" deployment of "MyApp" to "Production", with an updated description, and targeting only 25% of the users', + ) + .option('description', { + alias: 'des', + default: null, + demand: false, + description: + 'Description of the changes made to the app with this release. If omitted, the description from the release being promoted will be used.', + type: 'string', + }) + .option('label', { + alias: 'l', + default: null, + demand: false, + description: + 'Label of the source release that will be taken. If omitted, the latest release being promoted will be used.', + type: 'string', + }) + .option('disabled', { + alias: 'x', + default: null, + demand: false, + description: + 'Specifies whether this release should be immediately downloadable. If omitted, the disabled attribute from the release being promoted will be used.', + type: 'boolean', + }) + .option('mandatory', { + alias: 'm', + default: null, + demand: false, + description: + 'Specifies whether this release should be considered mandatory. If omitted, the mandatory property from the release being promoted will be used.', + type: 'boolean', + }) + .option('noDuplicateReleaseError', { + default: false, + demand: false, + description: + 'When this flag is set, promoting a package that is identical to the latest release on the target deployment will produce a warning instead of an error', + type: 'boolean', + }) + .option('rollout', { + alias: 'r', + default: '100%', + demand: false, + description: + 'Percentage of users this update should be immediately available to', + type: 'string', + }) + .option('targetBinaryVersion', { + alias: 't', + default: null, + demand: false, + description: + 'Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3). If omitted, the target binary version property from the release being promoted will be used.', + type: 'string', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => { + return isValidRollout(argv); + }); + + addCommonConfiguration(yargs); + }, + ) + .command('register', 'Register a new Mobile Center account', (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' register ') + .demand(/*count*/ 1, /*max*/ 1) + .example('register', 'Registers a new Mobile Center account') + .example( + 'register https://codepushserver --proxy http://someproxy.com:455', + 'Registers with the specified proxy url', + ) + .option('proxy', { + default: null, + demand: false, + description: 'URL of the proxy server to use', + type: 'string', + }) + .option('noProxy', { + default: false, + demand: false, + description: 'Bypass the system-wide proxy settings', + type: 'boolean', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommand); // Report unrecognized, non-hyphenated command category. - addCommonConfiguration(yargs); - }) - .command("rollback", "Rollback the latest release for an app deployment", (yargs: yargs.Argv) => { - yargs - .usage(USAGE_PREFIX + " rollback [options]") - .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments - .example("rollback MyApp Production", 'Performs a rollback on the "Production" deployment of "MyApp"') - .example( - "rollback MyApp Production --targetRelease v4", - 'Performs a rollback on the "Production" deployment of "MyApp" to the v4 release' - ) - .option("targetRelease", { - alias: "r", - default: null, - demand: false, - description: - "Label of the release to roll the specified deployment back to (e.g. v4). If omitted, the deployment will roll back to the previous release.", - type: "string", - }); + addCommonConfiguration(yargs); + }) + .command('release', 'Release an update to an app deployment', (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage( + USAGE_PREFIX + + ' release [options]', + ) + .demand(/*count*/ 3, /*max*/ 3) // Require exactly three non-option arguments. + .example( + 'release MyApp app.js "*"', + 'Releases the "app.js" file to the "MyApp" app\'s "Staging" deployment, targeting any binary version using the "*" wildcard range syntax.', + ) + .example( + 'release MyApp ./platforms/ios/www 1.0.3 -d Production -k ~/.ssh/codepush_rsa', + 'Releases the "./platforms/ios/www" folder and all its contents to the "MyApp" app\'s "Production" deployment, targeting only the 1.0.3 binary version and signed with the "codepush_rsa" private key', + ) + .example( + 'release MyApp ./platforms/ios/www 1.0.3 -d Production -r 20', + 'Releases the "./platforms/ios/www" folder and all its contents to the "MyApp" app\'s "Production" deployment, targeting the 1.0.3 binary version and rolling out to about 20% of the users', + ) + .option('deploymentName', { + alias: 'd', + default: 'Staging', + demand: false, + description: 'Deployment to release the update to', + type: 'string', + }) + .option('description', { + alias: 'des', + default: null, + demand: false, + description: 'Description of the changes made to the app in this release', + type: 'string', + }) + .option('disabled', { + alias: 'x', + default: false, + demand: false, + description: 'Specifies whether this release should be immediately downloadable', + type: 'boolean', + }) + .option('mandatory', { + alias: 'm', + default: false, + demand: false, + description: 'Specifies whether this release should be considered mandatory', + type: 'boolean', + }) + .option('privateKeyPath', { + alias: 'k', + default: false, + demand: false, + description: 'Specifies the location of a RSA private key to sign the release with', + type: 'string', + }) + .option('noDuplicateReleaseError', { + default: false, + demand: false, + description: + 'When this flag is set, releasing a package that is identical to the latest release will produce a warning instead of an error', + type: 'boolean', + }) + .option('rollout', { + alias: 'r', + default: '100%', + demand: false, + description: 'Percentage of users this release should be available to', + type: 'string', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => { + return checkValidReleaseOptions(argv); + }); - addCommonConfiguration(yargs); - }) - .command("whoami", "Display the account info for the current login session", (yargs: yargs.Argv) => { - isValidCommandCategory = true; - isValidCommand = true; - yargs - .usage(USAGE_PREFIX + " whoami") - .demand(/*count*/ 0, /*max*/ 0) - .example("whoami", "Display the account info for the current login session"); - addCommonConfiguration(yargs); - }) - .alias("v", "version") - .version(packageJson.version) - .wrap(/*columnLimit*/ null) - .strict() // Validate hyphenated (named) arguments. - .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommandCategory) // Report unrecognized, non-hyphenated command category. - .fail((msg: string) => showHelp(/*showRootDescription*/ true)).argv; // Suppress the default error message. + addCommonConfiguration(yargs); + }) + .command( + 'release-cordova', + 'Release a Cordova update to an app deployment', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' release-cordova [options]') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'release-cordova MyApp ios', + 'Releases the Cordova iOS project in the current working directory to the "MyApp" app\'s "Staging" deployment', + ) + .example( + 'release-cordova MyApp android -d Production', + 'Releases the Cordova Android project in the current working directory to the "MyApp" app\'s "Production" deployment', + ) + .option('build', { + alias: 'b', + default: false, + demand: false, + description: 'Invoke "cordova build" instead of "cordova prepare"', + type: 'boolean', + }) + .option('isReleaseBuildType', { + alias: 'rb', + default: false, + demand: false, + description: + 'If "build" option is true specifies whether perform a release build', + type: 'boolean', + }) + .option('deploymentName', { + alias: 'd', + default: 'Staging', + demand: false, + description: 'Deployment to release the update to', + type: 'string', + }) + .option('description', { + alias: 'des', + default: null, + demand: false, + description: 'Description of the changes made to the app in this release', + type: 'string', + }) + .option('disabled', { + alias: 'x', + default: false, + demand: false, + description: + 'Specifies whether this release should be immediately downloadable', + type: 'boolean', + }) + .option('mandatory', { + alias: 'm', + default: false, + demand: false, + description: 'Specifies whether this release should be considered mandatory', + type: 'boolean', + }) + .option('privateKeyPath', { + alias: 'k', + default: false, + demand: false, + description: + 'Specifies the location of a RSA private key to sign the release with', + type: 'string', + }) + .option('noDuplicateReleaseError', { + default: false, + demand: false, + description: + 'When this flag is set, releasing a package that is identical to the latest release will produce a warning instead of an error', + type: 'boolean', + }) + .option('rollout', { + alias: 'r', + default: '100%', + demand: false, + description: + 'Percentage of users this release should be immediately available to', + type: 'string', + }) + .option('targetBinaryVersion', { + alias: 't', + default: null, + demand: false, + description: + 'Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3). If omitted, the release will target the exact version specified in the config.xml file.', + type: 'string', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => { + return checkValidReleaseOptions(argv); + }); + + addCommonConfiguration(yargs); + }, + ) + .command( + 'release-react', + 'Release a React Native update to an app deployment', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' release-react [options]') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'release-react MyApp ios', + 'Releases the React Native iOS project in the current working directory to the "MyApp" app\'s "Staging" deployment', + ) + .example( + 'release-react MyApp android -d Production -k ~/.ssh/codepush_rsa', + 'Releases the React Native Android project in the current working directory to the "MyApp" app\'s "Production" deployment, signed with the "codepush_rsa" private key', + ) + .example( + 'release-react MyApp windows --dev', + 'Releases the development bundle of the React Native Windows project in the current working directory to the "MyApp" app\'s "Staging" deployment', + ) + .option('bundleName', { + alias: 'b', + default: null, + demand: false, + description: + 'Name of the generated JS bundle file. If unspecified, the standard bundle name will be used, depending on the specified platform: "main.jsbundle" (iOS), "index.android.bundle" (Android) or "index.windows.bundle" (Windows)', + type: 'string', + }) + .option('deploymentName', { + alias: 'd', + default: 'Staging', + demand: false, + description: 'Deployment to release the update to', + type: 'string', + }) + .option('description', { + alias: 'des', + default: null, + demand: false, + description: 'Description of the changes made to the app with this release', + type: 'string', + }) + .option('development', { + alias: 'dev', + default: false, + demand: false, + description: 'Specifies whether to generate a dev or release build', + type: 'boolean', + }) + .option('disabled', { + alias: 'x', + default: false, + demand: false, + description: + 'Specifies whether this release should be immediately downloadable', + type: 'boolean', + }) + .option('entryFile', { + alias: 'e', + default: null, + demand: false, + description: + 'Path to the app\'s entry Javascript file. If omitted, "index..js" and then "index.js" will be used (if they exist)', + type: 'string', + }) + .option('gradleFile', { + alias: 'g', + default: null, + demand: false, + description: + 'Path to the gradle file which specifies the binary version you want to target this release at (android only).', + }) + .option('podFile', { + alias: 'pf', + default: null, + demand: false, + description: 'Path to the cocopods config file (iOS only).', + }) + .option('mandatory', { + alias: 'm', + default: false, + demand: false, + description: 'Specifies whether this release should be considered mandatory', + type: 'boolean', + }) + .option('noDuplicateReleaseError', { + default: false, + demand: false, + description: + 'When this flag is set, releasing a package that is identical to the latest release will produce a warning instead of an error', + type: 'boolean', + }) + .option('plistFile', { + alias: 'p', + default: null, + demand: false, + description: + 'Path to the plist file which specifies the binary version you want to target this release at (iOS only).', + }) + .option('plistFilePrefix', { + alias: 'pre', + default: null, + demand: false, + description: + "Prefix to append to the file name when attempting to find your app's Info.plist file (iOS only).", + }) + .option('rollout', { + alias: 'r', + default: '100%', + demand: false, + description: + 'Percentage of users this release should be immediately available to', + type: 'string', + }) + .option('privateKeyPath', { + alias: 'k', + default: false, + demand: false, + description: + 'Specifies the location of a RSA private key to sign the release with', + type: 'string', + }) + .option('sourcemapOutput', { + alias: 's', + default: null, + demand: false, + description: + 'Path to where the sourcemap for the resulting bundle should be written. If omitted, a sourcemap will not be generated.', + type: 'string', + }) + .option('sourcemapOutputDir', { + default: null, + demand: false, + description: + 'Path to folder where the sourcemap for the resulting bundle should be written. Name of sourcemap file will be generated automatically. This argument will be ignored if "sourcemap-output" argument is provided. If omitted, a sourcemap will not be generated.', + type: 'string', + }) + .option('targetBinaryVersion', { + alias: 't', + default: null, + demand: false, + description: + 'Semver expression that specifies the binary app version(s) this release is targeting (e.g. 1.1.0, ~1.2.3). If omitted, the release will target the exact version specified in the "Info.plist" (iOS), "build.gradle" (Android) or "Package.appxmanifest" (Windows) files.', + type: 'string', + }) + .option('outputDir', { + alias: 'o', + default: null, + demand: false, + description: + 'Path to where the bundle and sourcemap should be written. If omitted, a bundle and sourcemap will not be written.', + type: 'string', + }) + .option('config', { + alias: 'c', + default: null, + demand: false, + description: 'Path to the React Native CLI configuration file', + type: 'string', + }) + .option('extraBundlerOptions', { + default: [], + demand: false, + description: + 'Option that gets passed to react-native bundler. Can be specified multiple times', + type: 'array', + }) + .option('extraHermesFlags', { + default: [], + demand: false, + description: + 'Flag that gets passed to Hermes, JavaScript to bytecode compiler. Can be specified multiple times', + type: 'array', + }) + .check((argv: any, aliases: { [aliases: string]: string }): any => { + return checkValidReleaseOptions(argv); + }); + + addCommonConfiguration(yargs); + }, + ) + .command( + 'rollback', + 'Rollback the latest release for an app deployment', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' rollback [options]') + .demand(/*count*/ 2, /*max*/ 2) // Require exactly two non-option arguments + .example( + 'rollback MyApp Production', + 'Performs a rollback on the "Production" deployment of "MyApp"', + ) + .example( + 'rollback MyApp Production --targetRelease v4', + 'Performs a rollback on the "Production" deployment of "MyApp" to the v4 release', + ) + .option('targetRelease', { + alias: 'r', + default: null, + demand: false, + description: + 'Label of the release to roll the specified deployment back to (e.g. v4). If omitted, the deployment will roll back to the previous release.', + type: 'string', + }); + + addCommonConfiguration(yargs); + }, + ) + .command( + 'whoami', + 'Display the account info for the current login session', + (yargs: yargs.Argv) => { + isValidCommandCategory = true; + isValidCommand = true; + yargs + .usage(USAGE_PREFIX + ' whoami') + .demand(/*count*/ 0, /*max*/ 0) + .example('whoami', 'Display the account info for the current login session'); + addCommonConfiguration(yargs); + }, + ) + .alias('v', 'version') + .version(packageJson.version) + .wrap(/*columnLimit*/ null) + // TODO: fix this + // .strict() // Validate hyphenated (named) arguments. + .check((argv: any, aliases: { [aliases: string]: string }): any => isValidCommandCategory) // Report unrecognized, non-hyphenated command category. + .fail((msg: string) => showHelp(/*showRootDescription*/ true)) + .parseSync(); // Suppress the default error message. function createCommand(): cli.ICommand { - var cmd: cli.ICommand; - - if (!wasHelpShown && argv._ && argv._.length > 0) { - // Create a command object - var arg0: any = argv._[0]; - var arg1: any = argv._[1]; - var arg2: any = argv._[2]; - var arg3: any = argv._[3]; - var arg4: any = argv._[4]; - - switch (arg0) { - case "access-key": - switch (arg1) { - case "add": - if (arg2) { - cmd = { type: cli.CommandType.accessKeyAdd }; - var accessKeyAddCmd = cmd; - accessKeyAddCmd.name = arg2; - /* + var cmd: cli.ICommand; + + if (!wasHelpShown && argv._ && argv._.length > 0) { + // Create a command object + var arg0: any = argv._[0]; + var arg1: any = argv._[1]; + var arg2: any = argv._[2]; + var arg3: any = argv._[3]; + var arg4: any = argv._[4]; + + switch (arg0) { + case 'access-key': + switch (arg1) { + case 'add': + if (arg2) { + cmd = { type: cli.CommandType.accessKeyAdd }; + var accessKeyAddCmd = cmd; + accessKeyAddCmd.name = arg2; + /* var ttlOption: string = argv["ttl"]; if (isDefined(ttlOption)) { accessKeyAddCmd.ttl = parseDurationMilliseconds(ttlOption); } */ - // Mobile Center access keys never expire, so this setting doesn't matter (it just needs to be something) - accessKeyAddCmd.ttl = parseDurationMilliseconds("60d"); - } - break; - - case "patch": - if (arg2) { - cmd = { type: cli.CommandType.accessKeyPatch }; - var accessKeyPatchCmd = cmd; - accessKeyPatchCmd.oldName = arg2; - - var newNameOption: string = argv["name"]; - var ttlOption: string = argv["ttl"]; - if (isDefined(newNameOption)) { - accessKeyPatchCmd.newName = newNameOption; - } - - if (isDefined(ttlOption)) { - accessKeyPatchCmd.ttl = parseDurationMilliseconds(ttlOption); - } - } - break; - - case "list": - case "ls": - cmd = { type: cli.CommandType.accessKeyList }; - - (cmd).format = argv["format"]; - break; - - case "remove": - case "rm": - if (arg2) { - cmd = { type: cli.CommandType.accessKeyRemove }; - - (cmd).accessKey = arg2; - } - break; - } - break; - - case "app": - switch (arg1) { - case "add": - if (arg2) { - cmd = { type: cli.CommandType.appAdd }; - - var appAddCommand = cmd; - - appAddCommand.appName = arg2; - appAddCommand.os = arg3; - appAddCommand.platform = arg4; - } - break; - - case "list": - case "ls": - cmd = { type: cli.CommandType.appList }; - - (cmd).format = argv["format"]; - break; - - case "remove": - case "rm": - if (arg2) { - cmd = { type: cli.CommandType.appRemove }; - - (cmd).appName = arg2; - } - break; - - case "rename": - if (arg2 && arg3) { - cmd = { type: cli.CommandType.appRename }; - - var appRenameCommand = cmd; - - appRenameCommand.currentAppName = arg2; - appRenameCommand.newAppName = arg3; - } - break; - - case "transfer": - if (arg2 && arg3) { - cmd = { type: cli.CommandType.appTransfer }; - - var appTransferCommand = cmd; - - appTransferCommand.appName = arg2; - appTransferCommand.email = arg3; - } - break; - } - break; - - case "collaborator": - switch (arg1) { - case "add": - if (arg2 && arg3) { - cmd = { type: cli.CommandType.collaboratorAdd }; - - (cmd).appName = arg2; - (cmd).email = arg3; - } - break; - - case "list": - case "ls": - if (arg2) { - cmd = { type: cli.CommandType.collaboratorList }; - - (cmd).appName = arg2; - (cmd).format = argv["format"]; - } - break; - - case "remove": - case "rm": - if (arg2 && arg3) { - cmd = { type: cli.CommandType.collaboratorRemove }; - - (cmd).appName = arg2; - (cmd).email = arg3; - } - break; - } - break; - - case "debug": - cmd = { - type: cli.CommandType.debug, - platform: arg1, - }; - - break; - - case "deployment": - switch (arg1) { - case "add": - if (arg2 && (arg3 || argv["default"])) { - cmd = { type: cli.CommandType.deploymentAdd }; - - var deploymentAddCommand = cmd; - - deploymentAddCommand.appName = arg2; - deploymentAddCommand.deploymentName = arg3; - deploymentAddCommand.default = argv["default"]; - } - break; - - case "clear": - if (arg2 && arg3) { - cmd = { - type: cli.CommandType.deploymentHistoryClear, - }; - - var deploymentHistoryClearCommand = cmd; - - deploymentHistoryClearCommand.appName = arg2; - deploymentHistoryClearCommand.deploymentName = arg3; - } - break; - - case "list": - case "ls": - if (arg2) { - cmd = { type: cli.CommandType.deploymentList }; - - var deploymentListCommand = cmd; - - deploymentListCommand.appName = arg2; - deploymentListCommand.format = argv["format"]; - deploymentListCommand.displayKeys = argv["displayKeys"]; - } - break; - - case "remove": - case "rm": - if (arg2 && arg3) { - cmd = { type: cli.CommandType.deploymentRemove }; - - var deploymentRemoveCommand = cmd; - - deploymentRemoveCommand.appName = arg2; - deploymentRemoveCommand.deploymentName = arg3; - } - break; - - case "rename": - if (arg2 && arg3 && arg4) { - cmd = { type: cli.CommandType.deploymentRename }; - - var deploymentRenameCommand = cmd; - - deploymentRenameCommand.appName = arg2; - deploymentRenameCommand.currentDeploymentName = arg3; - deploymentRenameCommand.newDeploymentName = arg4; - } - break; - - case "history": - case "h": - if (arg2 && arg3) { - cmd = { type: cli.CommandType.deploymentHistory }; - - var deploymentHistoryCommand = cmd; - - deploymentHistoryCommand.appName = arg2; - deploymentHistoryCommand.deploymentName = arg3; - deploymentHistoryCommand.format = argv["format"]; - deploymentHistoryCommand.displayAuthor = argv["displayAuthor"]; - } - break; - } - break; - - case "link": - cmd = { - type: cli.CommandType.link, - serverUrl: getServerUrl(arg1), - }; - break; - - case "login": - cmd = { type: cli.CommandType.login }; - - var loginCommand = cmd; - - loginCommand.serverUrl = getServerUrl(arg1); - loginCommand.accessKey = argv["accessKey"]; - loginCommand.proxy = argv["proxy"]; - loginCommand.noProxy = argv["noProxy"]; - break; - - case "logout": - cmd = { type: cli.CommandType.logout }; - break; - - case "patch": - if (arg1 && arg2) { - cmd = { type: cli.CommandType.patch }; - - var patchCommand = cmd; - - patchCommand.appName = arg1; - patchCommand.deploymentName = arg2; - patchCommand.label = argv["label"]; - // Description must be set to null to indicate that it is not being patched. - patchCommand.description = argv["description"] ? backslash(argv["description"]) : null; - patchCommand.disabled = argv["disabled"]; - patchCommand.mandatory = argv["mandatory"]; - patchCommand.rollout = getRolloutValue(argv["rollout"]); - patchCommand.appStoreVersion = argv["targetBinaryVersion"]; - } - break; - - case "promote": - if (arg1 && arg2 && arg3) { - cmd = { type: cli.CommandType.promote }; - - var deploymentPromoteCommand = cmd; - - deploymentPromoteCommand.appName = arg1; - deploymentPromoteCommand.sourceDeploymentName = arg2; - deploymentPromoteCommand.destDeploymentName = arg3; - deploymentPromoteCommand.description = argv["description"] ? backslash(argv["description"]) : ""; - deploymentPromoteCommand.label = argv["label"]; - deploymentPromoteCommand.disabled = argv["disabled"]; - deploymentPromoteCommand.mandatory = argv["mandatory"]; - deploymentPromoteCommand.noDuplicateReleaseError = argv["noDuplicateReleaseError"]; - deploymentPromoteCommand.rollout = getRolloutValue(argv["rollout"]); - deploymentPromoteCommand.appStoreVersion = argv["targetBinaryVersion"]; - } - break; - - case "register": - cmd = { type: cli.CommandType.register }; - - var registerCommand = cmd; - - registerCommand.serverUrl = getServerUrl(arg1); - registerCommand.proxy = argv["proxy"]; - registerCommand.noProxy = argv["noProxy"]; - break; - - case "release": - if (arg1 && arg2 && arg3) { - cmd = { type: cli.CommandType.release }; - - var releaseCommand = cmd; - - releaseCommand.appName = arg1; - releaseCommand.package = arg2; - releaseCommand.appStoreVersion = arg3; - releaseCommand.deploymentName = argv["deploymentName"]; - releaseCommand.description = argv["description"] ? backslash(argv["description"]) : ""; - releaseCommand.disabled = argv["disabled"]; - releaseCommand.mandatory = argv["mandatory"]; - releaseCommand.noDuplicateReleaseError = argv["noDuplicateReleaseError"]; - releaseCommand.rollout = getRolloutValue(argv["rollout"]); - releaseCommand.privateKeyPath = argv["privateKeyPath"]; - } - break; - - case "release-cordova": - if (arg1 && arg2) { - cmd = { type: cli.CommandType.releaseCordova }; - - var releaseCordovaCommand = cmd; - - releaseCordovaCommand.appName = arg1; - releaseCordovaCommand.platform = arg2; - - releaseCordovaCommand.build = argv["build"]; - releaseCordovaCommand.deploymentName = argv["deploymentName"]; - releaseCordovaCommand.description = argv["description"] ? backslash(argv["description"]) : ""; - releaseCordovaCommand.disabled = argv["disabled"]; - releaseCordovaCommand.mandatory = argv["mandatory"]; - releaseCordovaCommand.noDuplicateReleaseError = argv["noDuplicateReleaseError"]; - releaseCordovaCommand.rollout = getRolloutValue(argv["rollout"]); - releaseCordovaCommand.appStoreVersion = argv["targetBinaryVersion"]; - releaseCordovaCommand.isReleaseBuildType = argv["isReleaseBuildType"]; - releaseCordovaCommand.privateKeyPath = argv["privateKeyPath"]; - } - break; - - case "release-react": - if (arg1 && arg2) { - cmd = { type: cli.CommandType.releaseReact }; - - var releaseReactCommand = cmd; - - releaseReactCommand.appName = arg1; - releaseReactCommand.platform = arg2; - - releaseReactCommand.appStoreVersion = argv["targetBinaryVersion"]; - releaseReactCommand.bundleName = argv["bundleName"]; - releaseReactCommand.deploymentName = argv["deploymentName"]; - releaseReactCommand.disabled = argv["disabled"]; - releaseReactCommand.description = argv["description"] ? backslash(argv["description"]) : ""; - releaseReactCommand.development = argv["development"]; - releaseReactCommand.entryFile = argv["entryFile"]; - releaseReactCommand.gradleFile = argv["gradleFile"]; - releaseReactCommand.mandatory = argv["mandatory"]; - releaseReactCommand.noDuplicateReleaseError = argv["noDuplicateReleaseError"]; - releaseReactCommand.plistFile = argv["plistFile"]; - releaseReactCommand.plistFilePrefix = argv["plistFilePrefix"]; - releaseReactCommand.rollout = getRolloutValue(argv["rollout"]); - releaseReactCommand.privateKeyPath = argv["privateKeyPath"]; - releaseReactCommand.sourcemapOutput = argv["sourcemapOutput"]; - releaseReactCommand.sourcemapOutputDir = argv["sourcemapOutputDir"]; - releaseReactCommand.outputDir = argv["outputDir"]; - releaseReactCommand.config = argv["config"]; - } - break; - - case "rollback": - if (arg1 && arg2) { - cmd = { type: cli.CommandType.rollback }; - - var rollbackCommand = cmd; + // Mobile Center access keys never expire, so this setting doesn't matter (it just needs to be something) + accessKeyAddCmd.ttl = parseDurationMilliseconds('60d'); + } + break; + + case 'patch': + if (arg2) { + cmd = { type: cli.CommandType.accessKeyPatch }; + var accessKeyPatchCmd = cmd; + accessKeyPatchCmd.oldName = arg2; + + var newNameOption = argv['name'] as string; + var ttlOption = argv['ttl'] as string; + if (isDefined(newNameOption)) { + accessKeyPatchCmd.newName = newNameOption; + } - rollbackCommand.appName = arg1; - rollbackCommand.deploymentName = arg2; - rollbackCommand.targetRelease = argv["targetRelease"]; + if (isDefined(ttlOption)) { + accessKeyPatchCmd.ttl = parseDurationMilliseconds(ttlOption); + } + } + break; + + case 'list': + case 'ls': + cmd = { type: cli.CommandType.accessKeyList }; + + (cmd).format = argv['format'] as string; + break; + + case 'remove': + case 'rm': + if (arg2) { + cmd = { type: cli.CommandType.accessKeyRemove }; + + (cmd).accessKey = arg2; + } + break; + } + break; + + case 'app': + switch (arg1) { + case 'add': + if (arg2) { + cmd = { type: cli.CommandType.appAdd }; + + var appAddCommand = cmd; + + appAddCommand.appName = arg2; + appAddCommand.os = arg3; + appAddCommand.platform = arg4; + } + break; + + case 'list': + case 'ls': + cmd = { type: cli.CommandType.appList }; + + (cmd).format = argv['format'] as string; + break; + + case 'remove': + case 'rm': + if (arg2) { + cmd = { type: cli.CommandType.appRemove }; + + (cmd).appName = arg2; + } + break; + + case 'rename': + if (arg2 && arg3) { + cmd = { type: cli.CommandType.appRename }; + + var appRenameCommand = cmd; + + appRenameCommand.currentAppName = arg2; + appRenameCommand.newAppName = arg3; + } + break; + + case 'transfer': + if (arg2 && arg3) { + cmd = { type: cli.CommandType.appTransfer }; + + var appTransferCommand = cmd; + + appTransferCommand.appName = arg2; + appTransferCommand.email = arg3; + } + break; + } + break; + + case 'collaborator': + switch (arg1) { + case 'add': + if (arg2 && arg3) { + cmd = { type: cli.CommandType.collaboratorAdd }; + + (cmd).appName = arg2; + (cmd).email = arg3; + } + break; + + case 'list': + case 'ls': + if (arg2) { + cmd = { type: cli.CommandType.collaboratorList }; + + (cmd).appName = arg2; + (cmd).format = argv['format'] as string; + } + break; + + case 'remove': + case 'rm': + if (arg2 && arg3) { + cmd = { type: cli.CommandType.collaboratorRemove }; + + (cmd).appName = arg2; + (cmd).email = arg3; + } + break; + } + break; + + case 'debug': + cmd = { + type: cli.CommandType.debug, + platform: arg1, + }; + + break; + + case 'deployment': + switch (arg1) { + case 'add': + if (arg2 && (arg3 || argv['default'])) { + cmd = { type: cli.CommandType.deploymentAdd }; + + var deploymentAddCommand = cmd; + + deploymentAddCommand.appName = arg2; + deploymentAddCommand.deploymentName = arg3; + deploymentAddCommand.default = argv['default'] as boolean; + } + break; + + case 'clear': + if (arg2 && arg3) { + cmd = { + type: cli.CommandType.deploymentHistoryClear, + }; + + var deploymentHistoryClearCommand = < + cli.IDeploymentHistoryClearCommand + >cmd; + + deploymentHistoryClearCommand.appName = arg2; + deploymentHistoryClearCommand.deploymentName = arg3; + } + break; + + case 'list': + case 'ls': + if (arg2) { + cmd = { type: cli.CommandType.deploymentList }; + + var deploymentListCommand = cmd; + + deploymentListCommand.appName = arg2; + deploymentListCommand.format = argv['format'] as string; + deploymentListCommand.displayKeys = argv['displayKeys'] as boolean; + } + break; + + case 'remove': + case 'rm': + if (arg2 && arg3) { + cmd = { type: cli.CommandType.deploymentRemove }; + + var deploymentRemoveCommand = cmd; + + deploymentRemoveCommand.appName = arg2; + deploymentRemoveCommand.deploymentName = arg3; + } + break; + + case 'rename': + if (arg2 && arg3 && arg4) { + cmd = { type: cli.CommandType.deploymentRename }; + + var deploymentRenameCommand = cmd; + + deploymentRenameCommand.appName = arg2; + deploymentRenameCommand.currentDeploymentName = arg3; + deploymentRenameCommand.newDeploymentName = arg4; + } + break; + + case 'history': + case 'h': + if (arg2 && arg3) { + cmd = { type: cli.CommandType.deploymentHistory }; + + var deploymentHistoryCommand = cmd; + + deploymentHistoryCommand.appName = arg2; + deploymentHistoryCommand.deploymentName = arg3; + deploymentHistoryCommand.format = argv['format'] as string; + deploymentHistoryCommand.displayAuthor = argv[ + 'displayAuthor' + ] as boolean; + } + break; + } + break; + + case 'link': + cmd = { + type: cli.CommandType.link, + serverUrl: getServerUrl(arg1), + }; + break; + + case 'login': + cmd = { type: cli.CommandType.login }; + + var loginCommand = cmd; + + loginCommand.serverUrl = getServerUrl(arg1); + loginCommand.accessKey = argv['accessKey'] as string; + loginCommand.proxy = argv['proxy'] as string; + loginCommand.noProxy = argv['noProxy'] as boolean; + break; + + case 'logout': + cmd = { type: cli.CommandType.logout }; + break; + + case 'patch': + if (arg1 && arg2) { + cmd = { type: cli.CommandType.patch }; + + var patchCommand = cmd; + + patchCommand.appName = arg1; + patchCommand.deploymentName = arg2; + patchCommand.label = argv['label'] as string; + // Description must be set to null to indicate that it is not being patched. + patchCommand.description = argv['description'] + ? backslash(argv['description'] as string) + : null; + patchCommand.disabled = argv['disabled'] as boolean; + patchCommand.mandatory = argv['mandatory'] as boolean; + patchCommand.rollout = getRolloutValue(argv['rollout'] as string); + patchCommand.appStoreVersion = argv['targetBinaryVersion'] as string; + } + break; + + case 'promote': + if (arg1 && arg2 && arg3) { + cmd = { type: cli.CommandType.promote }; + + var deploymentPromoteCommand = cmd; + + deploymentPromoteCommand.appName = arg1; + deploymentPromoteCommand.sourceDeploymentName = arg2; + deploymentPromoteCommand.destDeploymentName = arg3; + deploymentPromoteCommand.description = argv['description'] + ? backslash(argv['description'] as string) + : ''; + deploymentPromoteCommand.label = argv['label'] as string; + deploymentPromoteCommand.disabled = argv['disabled'] as boolean; + deploymentPromoteCommand.mandatory = argv['mandatory'] as boolean; + deploymentPromoteCommand.noDuplicateReleaseError = argv[ + 'noDuplicateReleaseError' + ] as boolean; + deploymentPromoteCommand.rollout = getRolloutValue(argv['rollout'] as string); + deploymentPromoteCommand.appStoreVersion = argv[ + 'targetBinaryVersion' + ] as string; + } + break; + + case 'register': + cmd = { type: cli.CommandType.register }; + + var registerCommand = cmd; + + registerCommand.serverUrl = getServerUrl(arg1); + registerCommand.proxy = argv['proxy'] as string; + registerCommand.noProxy = argv['noProxy'] as boolean; + break; + + case 'release': + if (arg1 && arg2 && arg3) { + cmd = { type: cli.CommandType.release }; + + var releaseCommand = cmd; + + releaseCommand.appName = arg1; + releaseCommand.package = arg2; + releaseCommand.appStoreVersion = arg3; + releaseCommand.deploymentName = argv['deploymentName'] as string; + releaseCommand.description = argv['description'] + ? backslash(argv['description'] as string) + : ''; + releaseCommand.disabled = argv['disabled'] as boolean; + releaseCommand.mandatory = argv['mandatory'] as boolean; + releaseCommand.noDuplicateReleaseError = argv[ + 'noDuplicateReleaseError' + ] as boolean; + releaseCommand.rollout = getRolloutValue(argv['rollout'] as string); + releaseCommand.privateKeyPath = argv['privateKeyPath'] as string; + } + break; + + case 'release-cordova': + if (arg1 && arg2) { + cmd = { type: cli.CommandType.releaseCordova }; + + var releaseCordovaCommand = cmd; + + releaseCordovaCommand.appName = arg1; + releaseCordovaCommand.platform = arg2; + + releaseCordovaCommand.build = argv['build'] as boolean; + releaseCordovaCommand.deploymentName = argv['deploymentName'] as string; + releaseCordovaCommand.description = argv['description'] + ? backslash(argv['description'] as string) + : ''; + releaseCordovaCommand.disabled = argv['disabled'] as boolean; + releaseCordovaCommand.mandatory = argv['mandatory'] as boolean; + releaseCordovaCommand.noDuplicateReleaseError = argv[ + 'noDuplicateReleaseError' + ] as boolean; + releaseCordovaCommand.rollout = getRolloutValue(argv['rollout'] as string); + releaseCordovaCommand.appStoreVersion = argv['targetBinaryVersion'] as string; + releaseCordovaCommand.isReleaseBuildType = argv[ + 'isReleaseBuildType' + ] as boolean; + releaseCordovaCommand.privateKeyPath = argv['privateKeyPath'] as string; + } + break; + + case 'release-react': + if (arg1 && arg2) { + cmd = { type: cli.CommandType.releaseReact }; + + var releaseReactCommand = cmd; + + releaseReactCommand.appName = arg1; + releaseReactCommand.platform = arg2; + + releaseReactCommand.appStoreVersion = argv['targetBinaryVersion'] as string; + releaseReactCommand.bundleName = argv['bundleName'] as string; + releaseReactCommand.deploymentName = argv['deploymentName'] as string; + releaseReactCommand.disabled = argv['disabled'] as boolean; + releaseReactCommand.description = argv['description'] + ? backslash(argv['description'] as string) + : ''; + releaseReactCommand.development = argv['development'] as boolean; + releaseReactCommand.entryFile = argv['entryFile'] as string; + releaseReactCommand.gradleFile = argv['gradleFile'] as string; + releaseReactCommand.podFile = argv['podFile'] as string; + releaseReactCommand.mandatory = argv['mandatory'] as boolean; + releaseReactCommand.noDuplicateReleaseError = argv[ + 'noDuplicateReleaseError' + ] as boolean; + releaseReactCommand.plistFile = argv['plistFile'] as string; + releaseReactCommand.plistFilePrefix = argv['plistFilePrefix'] as string; + releaseReactCommand.rollout = getRolloutValue(argv['rollout'] as string); + releaseReactCommand.privateKeyPath = argv['privateKeyPath'] as string; + releaseReactCommand.sourcemapOutput = argv['sourcemapOutput'] as string; + releaseReactCommand.sourcemapOutputDir = argv['sourcemapOutputDir'] as string; + releaseReactCommand.outputDir = argv['outputDir'] as string; + releaseReactCommand.config = argv['config'] as string; + releaseReactCommand.extraBundlerOptions = argv[ + 'extraBundlerOptions' + ] as string[]; + releaseReactCommand.extraHermesFlags = argv['extraHermesFlags'] as string[]; + } + break; + + case 'rollback': + if (arg1 && arg2) { + cmd = { type: cli.CommandType.rollback }; + + var rollbackCommand = cmd; + + rollbackCommand.appName = arg1; + rollbackCommand.deploymentName = arg2; + rollbackCommand.targetRelease = argv['targetRelease'] as string; + } + break; + + case 'whoami': + cmd = { type: cli.CommandType.whoami }; + break; } - break; - case "whoami": - cmd = { type: cli.CommandType.whoami }; - break; + return cmd; } - - return cmd; - } } function isValidRollout(args: any): boolean { - var rollout: string = args["rollout"]; - if (rollout && !ROLLOUT_PERCENTAGE_REGEX.test(rollout)) { - return false; - } + var rollout: string = args['rollout']; + if (rollout && !ROLLOUT_PERCENTAGE_REGEX.test(rollout)) { + return false; + } - return true; + return true; } function checkValidReleaseOptions(args: any): boolean { - return isValidRollout(args) && !!args["deploymentName"]; + return isValidRollout(args) && !!args['deploymentName']; } function getRolloutValue(input: string): number { - return input ? parseInt(input.replace("%", "")) : null; + return input ? parseInt(input.replace('%', '')) : null; } function getServerUrl(url: string): string { - if (!url) return null; + if (!url) return null; - // Trim whitespace and a trailing slash (/) character. - url = url.trim(); - if (url[url.length - 1] === "/") { - url = url.substring(0, url.length - 1); - } + // Trim whitespace and a trailing slash (/) character. + url = url.trim(); + if (url[url.length - 1] === '/') { + url = url.substring(0, url.length - 1); + } - url = url.replace(/^(https?):\\/, "$1://"); // Replace 'http(s):\' with 'http(s)://' for Windows Git Bash + url = url.replace(/^(https?):\\/, '$1://'); // Replace 'http(s):\' with 'http(s)://' for Windows Git Bash - return url; + return url; } function isDefined(object: any): boolean { - return object !== undefined && object !== null; + return object !== undefined && object !== null; } function parseDurationMilliseconds(durationString: string): number { - return Math.floor(parseDuration(durationString)); + return Math.floor(parseDuration(durationString)); } export var command = createCommand(); diff --git a/src/commands/debug.ts b/src/commands/debug.ts index 821e57b2..812004a0 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -1,145 +1,161 @@ -import childProcess from "child_process"; -import * as cli from "../definitions/cli"; -import moment from "moment"; -import path from "path"; -import Q from "q"; +import childProcess from 'child_process'; +import * as cli from '../definitions/cli'; +import moment from 'moment'; +import path from 'path'; +import which from 'which'; -const simctl = require("simctl"); -const which = require("which"); +const simctl = require('simctl'); interface IDebugPlatform { - getLogProcess(): any; - normalizeLogMessage(message: string): string; + getLogProcess(): any; + normalizeLogMessage(message: string): string; } class AndroidDebugPlatform implements IDebugPlatform { - public getLogProcess(): any { - try { - which.sync("adb"); - } catch (e) { - throw new Error("ADB command not found. Please ensure it is installed and available on your path."); + public getLogProcess(): any { + try { + which.sync('adb'); + } catch (e) { + throw new Error( + 'ADB command not found. Please ensure it is installed and available on your path.', + ); + } + + const numberOfAvailableDevices = this.getNumberOfAvailableDevices(); + if (numberOfAvailableDevices === 0) { + throw new Error('No Android devices found. Re-run this command after starting one.'); + } + + // For now there is no ability to specify device for debug like: + // code-push debug android "192.168.121.102:5555" + // So we have to throw an error in case more than 1 android device was attached + // otherwise we will very likely run into an exception while trying to read ‘adb logcat’ from device which codepushified app is not running on. + if (numberOfAvailableDevices > 1) { + throw new Error( + `Found "${numberOfAvailableDevices}" android devices. Please leave only one device you need to debug.`, + ); + } + + return childProcess.spawn('adb', ['logcat']); } - const numberOfAvailableDevices = this.getNumberOfAvailableDevices(); - if (numberOfAvailableDevices === 0) { - throw new Error("No Android devices found. Re-run this command after starting one."); + // The following is an example of what the output looks + // like when running the "adb devices" command. + // + // List of devices attached + // emulator-5554 device + // 192.168.121.102:5555 device + private getNumberOfAvailableDevices(): number { + const output = childProcess.execSync('adb devices').toString(); + const matches = output.match(/\b(device)\b/gim); + if (matches != null) { + return matches.length; + } + return 0; } - // For now there is no ability to specify device for debug like: - // code-push debug android "192.168.121.102:5555" - // So we have to throw an error in case more than 1 android device was attached - // otherwise we will very likely run into an exception while trying to read ‘adb logcat’ from device which codepushified app is not running on. - if (numberOfAvailableDevices > 1) { - throw new Error(`Found "${numberOfAvailableDevices}" android devices. Please leave only one device you need to debug.`); + public normalizeLogMessage(message: string): string { + // Check to see whether the message includes the source URL + // suffix, and if so, strip it. This can occur in Android Cordova apps. + const sourceURLIndex: number = message.indexOf('", source: file:///'); + if (~sourceURLIndex) { + return message.substring(0, sourceURLIndex); + } else { + return message; + } } - - return childProcess.spawn("adb", ["logcat"]); - } - - // The following is an example of what the output looks - // like when running the "adb devices" command. - // - // List of devices attached - // emulator-5554 device - // 192.168.121.102:5555 device - private getNumberOfAvailableDevices(): number { - const output = childProcess.execSync("adb devices").toString(); - const matches = output.match(/\b(device)\b/gim); - if (matches != null) { - return matches.length; - } - return 0; - } - - public normalizeLogMessage(message: string): string { - // Check to see whether the message includes the source URL - // suffix, and if so, strip it. This can occur in Android Cordova apps. - const sourceURLIndex: number = message.indexOf('", source: file:///'); - if (~sourceURLIndex) { - return message.substring(0, sourceURLIndex); - } else { - return message; - } - } } class iOSDebugPlatform implements IDebugPlatform { - private getSimulatorID(): string { - const output: any = simctl.list({ devices: true, silent: true }); - const simulators: string[] = output.json.devices - .map((platform: any) => platform.devices) - .reduce((prev: any, next: any) => prev.concat(next)) - .filter((device: any) => device.state === "Booted") - .map((device: any) => device.id); - - return simulators[0]; - } - - public getLogProcess(): any { - if (process.platform !== "darwin") { - throw new Error("iOS debug logs can only be viewed on OS X."); + private getSimulatorID(): string { + const output: any = simctl.list({ devices: true, silent: true }); + const simulators: string[] = output.json.devices + .map((platform: any) => platform.devices) + .reduce((prev: any, next: any) => prev.concat(next)) + .filter((device: any) => device.state === 'Booted') + .map((device: any) => device.id); + + return simulators[0]; } - const simulatorID: string = this.getSimulatorID(); - if (!simulatorID) { - throw new Error("No iOS simulators found. Re-run this command after starting one."); + public getLogProcess(): any { + if (process.platform !== 'darwin') { + throw new Error('iOS debug logs can only be viewed on OS X.'); + } + + const simulatorID: string = this.getSimulatorID(); + if (!simulatorID) { + throw new Error('No iOS simulators found. Re-run this command after starting one.'); + } + + const logFilePath: string = path.join( + process.env.HOME, + 'Library/Logs/CoreSimulator', + simulatorID, + 'system.log', + ); + return childProcess.spawn('tail', ['-f', logFilePath]); } - const logFilePath: string = path.join(process.env.HOME, "Library/Logs/CoreSimulator", simulatorID, "system.log"); - return childProcess.spawn("tail", ["-f", logFilePath]); - } - - public normalizeLogMessage(message: string): string { - return message; - } + public normalizeLogMessage(message: string): string { + return message; + } } -const logMessagePrefix = "[CodePush] "; +const logMessagePrefix = '[CodePush] '; function processLogData(logData: Buffer) { - const content = logData.toString(); - content - .split("\n") - .filter((line: string) => line.indexOf(logMessagePrefix) > -1) - .map((line: string) => { - // Allow the current platform - // to normalize the message first. - line = this.normalizeLogMessage(line); - - // Strip the CodePush-specific, platform agnostic - // log message prefix that is added to each entry. - const message = line.substring(line.indexOf(logMessagePrefix) + logMessagePrefix.length); - - const timeStamp = moment().format("hh:mm:ss"); - return `[${timeStamp}] ${message}`; - }) - .forEach((line: string) => console.log(line)); + const content = logData.toString(); + content + .split('\n') + .filter((line: string) => line.indexOf(logMessagePrefix) > -1) + .map((line: string) => { + // Allow the current platform + // to normalize the message first. + line = this.normalizeLogMessage(line); + + // Strip the CodePush-specific, platform agnostic + // log message prefix that is added to each entry. + const message = line.substring( + line.indexOf(logMessagePrefix) + logMessagePrefix.length, + ); + + const timeStamp = moment().format('hh:mm:ss'); + return `[${timeStamp}] ${message}`; + }) + .forEach((line: string) => console.log(line)); } const debugPlatforms: any = { - android: new AndroidDebugPlatform(), - ios: new iOSDebugPlatform(), + android: new AndroidDebugPlatform(), + ios: new iOSDebugPlatform(), }; export default function (command: cli.IDebugCommand): Promise { - return new Promise((resolve, reject) => { - const platform: string = command.platform.toLowerCase(); - const debugPlatform: IDebugPlatform = debugPlatforms[platform]; - - if (!debugPlatform) { - const availablePlatforms = Object.getOwnPropertyNames(debugPlatforms); - return reject(new Error(`"${platform}" is an unsupported platform. Available options are ${availablePlatforms.join(", ")}.`)); - } - - try { - const logProcess = debugPlatform.getLogProcess(); - console.log(`Listening for ${platform} debug logs (Press CTRL+C to exit)`); - - logProcess.stdout.on("data", processLogData.bind(debugPlatform)); - logProcess.stderr.on("data", reject); - - logProcess.on("close", resolve); - } catch (e) { - reject(e); - } - }); + return new Promise((resolve, reject) => { + const platform: string = command.platform.toLowerCase(); + const debugPlatform: IDebugPlatform = debugPlatforms[platform]; + + if (!debugPlatform) { + const availablePlatforms = Object.getOwnPropertyNames(debugPlatforms); + return reject( + new Error( + `"${platform}" is an unsupported platform. Available options are ${availablePlatforms.join( + ', ', + )}.`, + ), + ); + } + + try { + const logProcess = debugPlatform.getLogProcess(); + console.log(`Listening for ${platform} debug logs (Press CTRL+C to exit)`); + + logProcess.stdout.on('data', processLogData.bind(debugPlatform)); + logProcess.stderr.on('data', reject); + + logProcess.on('close', resolve); + } catch (e) { + reject(e); + } + }); } diff --git a/src/definitions/backslash.d.ts b/src/definitions/backslash.d.ts index 16080e18..96c29f33 100644 --- a/src/definitions/backslash.d.ts +++ b/src/definitions/backslash.d.ts @@ -1,5 +1,5 @@ -declare module "backslash" { +declare module 'backslash' { function backslash(str: string): string; export = backslash; -} \ No newline at end of file +} diff --git a/src/definitions/cli.ts b/src/definitions/cli.ts index 1b867452..2389bc60 100644 --- a/src/definitions/cli.ts +++ b/src/definitions/cli.ts @@ -1,225 +1,228 @@ -import AccountManager = require("code-push"); +import AccountManager = require('code-push'); export enum CommandType { - accessKeyAdd, - accessKeyPatch, - accessKeyList, - accessKeyRemove, - appAdd, - appList, - appRemove, - appRename, - appTransfer, - collaboratorAdd, - collaboratorList, - collaboratorRemove, - debug, - deploymentAdd, - deploymentHistory, - deploymentHistoryClear, - deploymentList, - deploymentMetrics, - deploymentRemove, - deploymentRename, - link, - login, - logout, - patch, - promote, - register, - release, - releaseCordova, - releaseReact, - rollback, - whoami, + accessKeyAdd, + accessKeyPatch, + accessKeyList, + accessKeyRemove, + appAdd, + appList, + appRemove, + appRename, + appTransfer, + collaboratorAdd, + collaboratorList, + collaboratorRemove, + debug, + deploymentAdd, + deploymentHistory, + deploymentHistoryClear, + deploymentList, + deploymentMetrics, + deploymentRemove, + deploymentRename, + link, + login, + logout, + patch, + promote, + register, + release, + releaseCordova, + releaseReact, + rollback, + whoami, } export interface ICommand { - type: CommandType; + type: CommandType; } export interface IAccessKeyAddCommand extends ICommand { - name: string; - ttl?: number; + name: string; + ttl?: number; } export interface IAccessKeyPatchCommand extends ICommand { - newName?: string; - oldName: string; - ttl?: number; + newName?: string; + oldName: string; + ttl?: number; } export interface IAccessKeyListCommand extends ICommand { - format: string; + format: string; } export interface IAccessKeyRemoveCommand extends ICommand { - accessKey: string; + accessKey: string; } export interface IAppAddCommand extends ICommand { - appName: string; - os: string; - platform: string; + appName: string; + os: string; + platform: string; } export interface IAppListCommand extends ICommand { - format: string; + format: string; } export interface IAppRemoveCommand extends ICommand { - appName: string; + appName: string; } export interface IAppRenameCommand extends ICommand { - currentAppName: string; - newAppName: string; + currentAppName: string; + newAppName: string; } export interface IAppTransferCommand extends ICommand { - appName: string; - email: string; + appName: string; + email: string; } export interface ICollaboratorAddCommand extends ICommand { - appName: string; - email: string; + appName: string; + email: string; } export interface ICollaboratorListCommand extends ICommand { - appName: string; - format: string; + appName: string; + format: string; } export interface ICollaboratorRemoveCommand extends ICommand { - appName: string; - email: string; + appName: string; + email: string; } export interface IDebugCommand extends ICommand { - platform: string; + platform: string; } export interface IDeploymentAddCommand extends ICommand { - appName: string; - deploymentName: string; - default: boolean; + appName: string; + deploymentName: string; + default: boolean; } export interface IDeploymentHistoryClearCommand extends ICommand { - appName: string; - deploymentName: string; + appName: string; + deploymentName: string; } export interface IDeploymentHistoryCommand extends ICommand { - appName: string; - deploymentName: string; - format: string; - displayAuthor: boolean; + appName: string; + deploymentName: string; + format: string; + displayAuthor: boolean; } export interface IDeploymentListCommand extends ICommand { - appName: string; - format: string; - displayKeys: boolean; + appName: string; + format: string; + displayKeys: boolean; } export interface IDeploymentRemoveCommand extends ICommand { - appName: string; - deploymentName: string; + appName: string; + deploymentName: string; } export interface IDeploymentRenameCommand extends ICommand { - appName: string; - currentDeploymentName: string; - newDeploymentName: string; + appName: string; + currentDeploymentName: string; + newDeploymentName: string; } export interface ILinkCommand extends ICommand { - serverUrl?: string; + serverUrl?: string; } export interface ILoginCommand extends ICommand { - serverUrl?: string; - accessKey: string; - proxy?: string; - noProxy?: boolean; + serverUrl?: string; + accessKey: string; + proxy?: string; + noProxy?: boolean; } export interface IPackageInfo { - description?: string; - label?: string; - disabled?: boolean; - mandatory?: boolean; - rollout?: number; + description?: string; + label?: string; + disabled?: boolean; + mandatory?: boolean; + rollout?: number; } export interface IPatchCommand extends ICommand, IPackageInfo { - appName: string; - appStoreVersion?: string; - deploymentName: string; - label: string; + appName: string; + appStoreVersion?: string; + deploymentName: string; + label: string; } export interface IPromoteCommand extends ICommand, IPackageInfo { - appName: string; - appStoreVersion?: string; - sourceDeploymentName: string; - destDeploymentName: string; - noDuplicateReleaseError?: boolean; + appName: string; + appStoreVersion?: string; + sourceDeploymentName: string; + destDeploymentName: string; + noDuplicateReleaseError?: boolean; } export interface IRegisterCommand extends ICommand { - serverUrl?: string; - proxy?: string; - noProxy?: boolean; + serverUrl?: string; + proxy?: string; + noProxy?: boolean; } export interface IReleaseBaseCommand extends ICommand, IPackageInfo { - appName: string; - appStoreVersion: string; - deploymentName: string; - noDuplicateReleaseError?: boolean; - privateKeyPath?: string; + appName: string; + appStoreVersion: string; + deploymentName: string; + noDuplicateReleaseError?: boolean; + privateKeyPath?: string; } export interface IReleaseCommand extends IReleaseBaseCommand { - package: string; + package: string; } export interface IReleaseCordovaCommand extends IReleaseBaseCommand { - build: boolean; - platform: string; - isReleaseBuildType?: boolean; + build: boolean; + platform: string; + isReleaseBuildType?: boolean; } export interface IReleaseReactCommand extends IReleaseBaseCommand { - bundleName?: string; - development?: boolean; - entryFile?: string; - gradleFile?: string; - platform: string; - plistFile?: string; - plistFilePrefix?: string; - sourcemapOutput?: string; - sourcemapOutputDir?: string; - outputDir?: string; - config?: string; + bundleName?: string; + development?: boolean; + entryFile?: string; + gradleFile?: string; + podFile?: string; + platform: string; + plistFile?: string; + plistFilePrefix?: string; + sourcemapOutput?: string; + sourcemapOutputDir?: string; + outputDir?: string; + config?: string; + extraBundlerOptions?: string[]; + extraHermesFlags?: string[]; } export interface IRollbackCommand extends ICommand { - appName: string; - deploymentName: string; - targetRelease: string; + appName: string; + deploymentName: string; + targetRelease: string; } export type ReleaseHook = ( - currentCommand: IReleaseCommand, - originalCommand: IReleaseCommand, - sdk: AccountManager + currentCommand: IReleaseCommand, + originalCommand: IReleaseCommand, + sdk: AccountManager, ) => Promise; export interface ReleaseFile { - sourceLocation: string; // The current location of the file on disk - targetLocation: string; // The desired location of the file within the zip + sourceLocation: string; // The current location of the file on disk + targetLocation: string; // The desired location of the file within the zip } diff --git a/src/definitions/parse-duration.d.ts b/src/definitions/parse-duration.d.ts deleted file mode 100644 index a6985986..00000000 --- a/src/definitions/parse-duration.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "parse-duration" { - function parseDuration(duration: string): number; - - export = parseDuration; -} \ No newline at end of file diff --git a/src/definitions/recursive-fs.d.ts b/src/definitions/recursive-fs.d.ts index 170a2802..199278d2 100644 --- a/src/definitions/recursive-fs.d.ts +++ b/src/definitions/recursive-fs.d.ts @@ -1,17 +1,6 @@ -declare module "recursive-fs" { - export interface ICopyDirCallback { - (error?: any): void; - } - - export interface IReadDirCallback { - (error?: any, directories?: string[], files?: string[]): void; - } - - export interface IRemoveDirCallback { - (error?: any): void; - } - - export function cpdirr(sourceDirectoryPath: string, targetDirectoryPath: string, callback: ICopyDirCallback): void; - export function readdirr(directoryPath: string, callback: IReadDirCallback): void; - export function rmdirr(directoryPath: string, callback: IRemoveDirCallback): void; -} \ No newline at end of file +declare module 'recursive-fs' { + export function read(directoryPath: string): Promise<{ + dirs?: string[]; + files?: string[]; + }>; +} diff --git a/src/definitions/slash.d.ts b/src/definitions/slash.d.ts deleted file mode 100644 index d6300867..00000000 --- a/src/definitions/slash.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module "slash" { - function slash(str: string): string; - export = slash; -} \ No newline at end of file diff --git a/src/definitions/wordwrap.d.ts b/src/definitions/wordwrap.d.ts index 72e9ec6e..6f24b4f5 100644 --- a/src/definitions/wordwrap.d.ts +++ b/src/definitions/wordwrap.d.ts @@ -1,4 +1,4 @@ -declare module "wordwrap" { - function wordwrap(width: number): (text: string) => string; - export = wordwrap; -} \ No newline at end of file +declare module 'wordwrap' { + function wordwrap(width: number): (text: string) => string; + export = wordwrap; +} diff --git a/src/definitions/yargs.d.ts b/src/definitions/yargs.d.ts deleted file mode 100644 index 3251e21b..00000000 --- a/src/definitions/yargs.d.ts +++ /dev/null @@ -1,133 +0,0 @@ -/* -This project is licensed under the MIT license. -Copyrights are respective of each contributor listed at the beginning of each definition file. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE -*/ - -// Type definitions for yargs -// Project: https://github.com/chevex/yargs -// Definitions by: Martin Poelstra -// Definitions: https://github.com/borisyankov/DefinitelyTyped - -// This file has been changed from the original. - -declare module "yargs" { - - module yargs { - interface Argv { - argv: any; - (...args: any[]): any; - parse(...args: any[]): any; - - alias(shortName: string, longName: string): Argv; - alias(aliases: { [shortName: string]: string }): Argv; - alias(aliases: { [shortName: string]: string[] }): Argv; - - default(key: string, value: any): Argv; - default(defaults: { [key: string]: any }): Argv; - - demand(key: string, msg: string): Argv; - demand(key: string, required?: boolean): Argv; - demand(keys: string[], msg: string): Argv; - demand(keys: string[], required?: boolean): Argv; - demand(positionals: number, required?: boolean): Argv; - demand(positionals: number, msg: string): Argv; - demand(count: number, max?: number, msg?: string): Argv; // new from original - - require(key: string, msg: string): Argv; - require(key: string, required: boolean): Argv; - require(keys: number[], msg: string): Argv; - require(keys: number[], required: boolean): Argv; - require(positionals: number, required: boolean): Argv; - require(positionals: number, msg: string): Argv; - - required(key: string, msg: string): Argv; - required(key: string, required: boolean): Argv; - required(keys: number[], msg: string): Argv; - required(keys: number[], required: boolean): Argv; - required(positionals: number, required: boolean): Argv; - required(positionals: number, msg: string): Argv; - - requiresArg(key: string): Argv; - requiresArg(keys: string[]): Argv; - - describe(key: string, description: string): Argv; - describe(descriptions: { [key: string]: string }): Argv; - - option(key: string, options: Options): Argv; - option(options: { [key: string]: Options }): Argv; - options(key: string, options: Options): Argv; - options(options: { [key: string]: Options }): Argv; - - usage(message: string, options?: { [key: string]: Options }): Argv; - usage(options?: { [key: string]: Options }): Argv; - - command(command: string, description: string, func?: (yargs: Argv) => any): Argv; // changed from original - - example(command: string, description: string): Argv; - - check(func: (argv: any, aliases: { [alias: string]: string }) => any): Argv; - - boolean(key: string): Argv; - boolean(keys: string[]): Argv; - - string(key: string): Argv; - string(keys: string[]): Argv; - - config(key: string): Argv; - config(keys: string[]): Argv; - - wrap(columns: number): Argv; - - strict(): Argv; - - help(): string; - help(option: string, description?: string): Argv; - - version(version: string, option?: string, description?: string): Argv; - - showHelpOnFail(enable: boolean, message?: string): Argv; - - showHelp(func?: (message: string) => any): Argv; - - terminalWidth(): number; // new from original - - /* Undocumented */ - - normalize(key: string): Argv; - normalize(keys: string[]): Argv; - - implies(key: string, value: string): Argv; - implies(implies: { [key: string]: string }): Argv; - - count(key: string): Argv; - count(keys: string[]): Argv; - - fail(func: (msg: string) => any): Argv; // changed from original - } - - interface Options { - type?: string; - alias?: any; - demand?: any; - required?: any; - require?: any; - default?: any; - boolean?: any; - string?: any; - count?: any; - describe?: any; - description?: any; - desc?: any; - requiresArg?: any; - } - } - - var yargs: yargs.Argv; - export = yargs; -} diff --git a/src/lib/cordova-utils.ts b/src/lib/cordova-utils.ts index 91a1c0a7..40f03ead 100644 --- a/src/lib/cordova-utils.ts +++ b/src/lib/cordova-utils.ts @@ -1,28 +1,34 @@ -import xml2js from "xml2js"; -import fs from "fs"; -import path from "path"; +import xml2js from 'xml2js'; +import fs from 'fs'; +import path from 'path'; export function getCordovaProjectAppVersion(projectRoot?: string): Promise { - return new Promise((resolve, reject) => { - let configString: string; - try { - projectRoot = projectRoot || process.cwd(); - configString = fs.readFileSync(path.join(projectRoot, "config.xml"), { encoding: "utf8" }); - } catch (error) { - return reject( - new Error( - `Unable to find or read "config.xml" in the CWD. The "release-cordova" command must be executed in a Cordova project folder.` - ) - ); - } + return new Promise((resolve, reject) => { + let configString: string; + try { + projectRoot = projectRoot || process.cwd(); + configString = fs.readFileSync(path.join(projectRoot, 'config.xml'), { + encoding: 'utf8', + }); + } catch (error) { + return reject( + new Error( + `Unable to find or read "config.xml" in the CWD. The "release-cordova" command must be executed in a Cordova project folder.`, + ), + ); + } - xml2js.parseString(configString, (err: Error, parsedConfig: any) => { - if (err) { - reject(new Error(`Unable to parse "config.xml" in the CWD. Ensure that the contents of "config.xml" is valid XML.`)); - } + xml2js.parseString(configString, (err: Error, parsedConfig: any) => { + if (err) { + reject( + new Error( + `Unable to parse "config.xml" in the CWD. Ensure that the contents of "config.xml" is valid XML.`, + ), + ); + } - const config: any = parsedConfig.widget; - resolve(config["$"].version); + const config: any = parsedConfig.widget; + resolve(config['$'].version); + }); }); - }); } diff --git a/src/lib/file-utils.ts b/src/lib/file-utils.ts index 6483ae7d..f0b4fa35 100644 --- a/src/lib/file-utils.ts +++ b/src/lib/file-utils.ts @@ -1,29 +1,33 @@ -import fs from "fs"; +import fs from 'fs'; export function isBinaryOrZip(path: string): boolean { - return path.search(/\.zip$/i) !== -1 || path.search(/\.apk$/i) !== -1 || path.search(/\.ipa$/i) !== -1; + return ( + path.search(/\.zip$/i) !== -1 || + path.search(/\.apk$/i) !== -1 || + path.search(/\.ipa$/i) !== -1 + ); } export function isDirectory(path: string): boolean { - return fs.statSync(path).isDirectory(); + return fs.statSync(path).isDirectory(); } export function generateRandomFilename(length: number): string { - let filename: string = ""; - const validChar: string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let filename: string = ''; + const validChar: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (let i = 0; i < length; i++) { - // eslint-disable-next-line no-restricted-properties - filename += validChar.charAt(Math.floor(Math.random() * validChar.length)); - } + for (let i = 0; i < length; i++) { + // eslint-disable-next-line no-restricted-properties + filename += validChar.charAt(Math.floor(Math.random() * validChar.length)); + } - return filename; + return filename; } export function fileDoesNotExistOrIsDirectory(path: string): boolean { - try { - return isDirectory(path); - } catch (error) { - return true; - } + try { + return isDirectory(path); + } catch (error) { + return true; + } } diff --git a/src/lib/hash-utils.ts b/src/lib/hash-utils.ts index 717cdfe5..7ebd998a 100644 --- a/src/lib/hash-utils.ts +++ b/src/lib/hash-utils.ts @@ -3,171 +3,176 @@ * integrity checks) and Management SDK (for end-to-end code signing), please keep them in sync. */ -import crypto from "crypto"; -import fs from "fs"; -import path from "path"; -import stream from "stream"; - -// Do not throw an exception if either of these modules are missing, as they may not be needed by the -// consumer of this file. -// - recursiveFs: Only required for hashing of directories -try { - var recursiveFs = require("recursive-fs"); -} catch (e) {} - -const HASH_ALGORITHM = "sha256"; - -export function generatePackageHashFromDirectory(directoryPath: string, basePath: string): Promise { - if (!fs.lstatSync(directoryPath).isDirectory()) { - throw new Error("Not a directory. Please either create a directory, or use hashFile()."); - } - - return generatePackageManifestFromDirectory(directoryPath, basePath).then((manifest: PackageManifest) => { - return manifest.computePackageHash(); - }); -} +import crypto from 'crypto'; +import fs from 'fs'; +import path from 'path'; +import recursiveFs from 'recursive-fs'; +import stream from 'stream'; + +const HASH_ALGORITHM = 'sha256'; + +export function generatePackageHashFromDirectory( + directoryPath: string, + basePath: string, +): Promise { + if (!fs.lstatSync(directoryPath).isDirectory()) { + throw new Error('Not a directory. Please either create a directory, or use hashFile().'); + } -export function generatePackageManifestFromDirectory(directoryPath: string, basePath: string): Promise { - return new Promise((resolve, reject) => { - var fileHashesMap = new Map(); - - recursiveFs.readdirr(directoryPath, (error?: any, directories?: string[], files?: string[]): void => { - if (error) { - reject(error); - return; - } - - if (!files || files.length === 0) { - reject("Error: Can't sign the release because no files were found."); - return; - } - - // Hash the files sequentially, because streaming them in parallel is not necessarily faster - var generateManifestPromise: Promise = files.reduce((soFar: Promise, filePath: string) => { - return soFar.then(() => { - var relativePath: string = PackageManifest.normalizePath(path.relative(basePath, filePath)); - if (!PackageManifest.isIgnored(relativePath)) { - return hashFile(filePath).then((hash: string) => { - fileHashesMap.set(relativePath, hash); - }); - } - }); - }, Promise.resolve(null as void)); + return generatePackageManifestFromDirectory(directoryPath, basePath).then( + (manifest: PackageManifest) => { + return manifest.computePackageHash(); + }, + ); +} - generateManifestPromise.then(() => { - resolve(new PackageManifest(fileHashesMap)); - }, reject); +export function generatePackageManifestFromDirectory( + directoryPath: string, + basePath: string, +): Promise { + return new Promise(async (resolve, reject) => { + var fileHashesMap = new Map(); + + try { + const { files } = await recursiveFs.read(directoryPath); + if (!files || files.length === 0) { + reject("Error: Can't sign the release because no files were found."); + return; + } + + // Hash the files sequentially, because streaming them in parallel is not necessarily faster + var generateManifestPromise: Promise = files.reduce( + (soFar: Promise, filePath: string) => { + return soFar.then(() => { + var relativePath: string = PackageManifest.normalizePath( + path.relative(basePath, filePath), + ); + if (!PackageManifest.isIgnored(relativePath)) { + return hashFile(filePath).then((hash: string) => { + fileHashesMap.set(relativePath, hash); + }); + } + }); + }, + Promise.resolve(null as void), + ); + + generateManifestPromise.then(() => { + resolve(new PackageManifest(fileHashesMap)); + }, reject); + } catch (error) { + reject(error); + } }); - }); } export function hashFile(filePath: string): Promise { - var readStream: fs.ReadStream = fs.createReadStream(filePath); - return hashStream(readStream); + var readStream: fs.ReadStream = fs.createReadStream(filePath); + return hashStream(readStream); } export function hashStream(readStream: stream.Readable): Promise { - var hashStream = (crypto.createHash(HASH_ALGORITHM)); - - let isPending = true; - return new Promise((resolve, reject) => { - readStream - .on("error", (error: any): void => { - if (isPending) { - isPending = false; - hashStream.end(); - reject(error); - } - }) - .on("end", (): void => { - if (isPending) { - isPending = false; - hashStream.end(); + var hashStream = (crypto.createHash(HASH_ALGORITHM)); + + let isPending = true; + return new Promise((resolve, reject) => { + readStream + .on('error', (error: any): void => { + if (isPending) { + isPending = false; + hashStream.end(); + reject(error); + } + }) + .on('end', (): void => { + if (isPending) { + isPending = false; + hashStream.end(); + + var buffer = hashStream.read(); + var hash: string = buffer.toString('hex'); + + resolve(hash); + } + }); - var buffer = hashStream.read(); - var hash: string = buffer.toString("hex"); + readStream.pipe(hashStream); + }); +} - resolve(hash); +export class PackageManifest { + private _map: Map; + + public constructor(map?: Map) { + if (!map) { + map = new Map(); } - }); + this._map = map; + } - readStream.pipe(hashStream); - }); -} + public toMap(): Map { + return this._map; + } -export class PackageManifest { - private _map: Map; + public computePackageHash(): string { + var entries: string[] = []; + this._map.forEach((hash: string, name: string): void => { + entries.push(name + ':' + hash); + }); - public constructor(map?: Map) { - if (!map) { - map = new Map(); + // Make sure this list is alphabetically ordered so that other clients + // can also compute this hash easily given the update contents. + entries = entries.sort(); + + return crypto.createHash(HASH_ALGORITHM).update(JSON.stringify(entries)).digest('hex'); } - this._map = map; - } - public toMap(): Map { - return this._map; - } + public serialize(): string { + var obj: any = {}; - public computePackageHash(): string { - var entries: string[] = []; - this._map.forEach((hash: string, name: string): void => { - entries.push(name + ":" + hash); - }); + this._map.forEach(function (value, key) { + obj[key] = value; + }); - // Make sure this list is alphabetically ordered so that other clients - // can also compute this hash easily given the update contents. - entries = entries.sort(); + return JSON.stringify(obj); + } - return crypto.createHash(HASH_ALGORITHM).update(JSON.stringify(entries)).digest("hex"); - } + public static deserialize(serializedContents: string): PackageManifest { + try { + var obj: any = JSON.parse(serializedContents); + var map = new Map(); - public serialize(): string { - var obj: any = {}; + for (var key of Object.keys(obj)) { + map.set(key, obj[key]); + } - this._map.forEach(function (value, key) { - obj[key] = value; - }); + return new PackageManifest(map); + } catch (e) {} + } - return JSON.stringify(obj); - } - - public static deserialize(serializedContents: string): PackageManifest { - try { - var obj: any = JSON.parse(serializedContents); - var map = new Map(); - - for (var key of Object.keys(obj)) { - map.set(key, obj[key]); - } - - return new PackageManifest(map); - } catch (e) {} - } - - public static normalizePath(filePath: string): string { - //replace all backslashes coming from cli running on windows machines by slashes - return filePath.replace(/\\/g, "/"); - } - - public static isIgnored(relativeFilePath: string): boolean { - const __MACOSX = "__MACOSX/"; - const DS_STORE = ".DS_Store"; - const CODEPUSH_METADATA = ".codepushrelease"; - return ( - startsWith(relativeFilePath, __MACOSX) || - relativeFilePath === DS_STORE || - endsWith(relativeFilePath, "/" + DS_STORE) || - relativeFilePath === CODEPUSH_METADATA || - endsWith(relativeFilePath, "/" + CODEPUSH_METADATA) - ); - } + public static normalizePath(filePath: string): string { + //replace all backslashes coming from cli running on windows machines by slashes + return filePath.replace(/\\/g, '/'); + } + + public static isIgnored(relativeFilePath: string): boolean { + const __MACOSX = '__MACOSX/'; + const DS_STORE = '.DS_Store'; + const CODEPUSH_METADATA = '.codepushrelease'; + return ( + startsWith(relativeFilePath, __MACOSX) || + relativeFilePath === DS_STORE || + endsWith(relativeFilePath, '/' + DS_STORE) || + relativeFilePath === CODEPUSH_METADATA || + endsWith(relativeFilePath, '/' + CODEPUSH_METADATA) + ); + } } function startsWith(str: string, prefix: string): boolean { - return str && str.substring(0, prefix.length) === prefix; + return str && str.substring(0, prefix.length) === prefix; } function endsWith(str: string, suffix: string): boolean { - return str && str.indexOf(suffix, str.length - suffix.length) !== -1; + return str && str.indexOf(suffix, str.length - suffix.length) !== -1; } diff --git a/src/lib/react-native-utils.ts b/src/lib/react-native-utils.ts index 21705c95..7401ad38 100644 --- a/src/lib/react-native-utils.ts +++ b/src/lib/react-native-utils.ts @@ -1,481 +1,643 @@ -import fs from "fs"; -import path from "path"; -import xml2js from "xml2js"; -import { out } from "../util/interaction"; -import { isValidVersion, isLowVersion } from "./validation-utils"; -import { fileDoesNotExistOrIsDirectory } from "./file-utils"; -import chalk from "chalk"; -import * as cli from "../definitions/cli"; - -const plist = require("plist"); -const g2js = require("gradle-to-js/lib/parser"); -const properties = require("properties"); -const childProcess = require("child_process"); +import fs from 'fs'; +import path from 'path'; +import xml2js from 'xml2js'; +import { out } from '../util/interaction'; +import { isValidVersion, isLowVersion } from './validation-utils'; +import { fileDoesNotExistOrIsDirectory } from './file-utils'; +import chalk from 'chalk'; +import * as cli from '../definitions/cli'; + +const plist = require('plist'); +const g2js = require('gradle-to-js/lib/parser'); +const properties = require('properties'); +const childProcess = require('child_process'); export const spawn = childProcess.spawn; -export function getReactNativeProjectAppVersion(command: cli.IReleaseReactCommand, projectName: string): Promise { - const fileExists = (file: string): boolean => { - try { - return fs.statSync(file).isFile(); - } catch (e) { - return false; - } - }; - - out.text(chalk.cyan(`Detecting ${command.platform} app version:\n`)); - - if (command.platform === "ios") { - let resolvedPlistFile: string = command.plistFile; - if (resolvedPlistFile) { - // If a plist file path is explicitly provided, then we don't - // need to attempt to "resolve" it within the well-known locations. - if (!fileExists(resolvedPlistFile)) { - throw new Error("The specified plist file doesn't exist. Please check that the provided path is correct."); - } - } else { - // Allow the plist prefix to be specified with or without a trailing - // separator character, but prescribe the use of a hyphen when omitted, - // since this is the most commonly used convetion for plist files. - if (command.plistFilePrefix && /.+[^-.]$/.test(command.plistFilePrefix)) { - command.plistFilePrefix += "-"; - } - - const iOSDirectory: string = "ios"; - const plistFileName = `${command.plistFilePrefix || ""}Info.plist`; - - const knownLocations = [path.join(iOSDirectory, projectName, plistFileName), path.join(iOSDirectory, plistFileName)]; - - resolvedPlistFile = (knownLocations).find(fileExists); - - if (!resolvedPlistFile) { - throw new Error( - `Unable to find either of the following plist files in order to infer your app's binary version: "${knownLocations.join( - '", "' - )}". If your plist has a different name, or is located in a different directory, consider using either the "--plistFile" or "--plistFilePrefix" parameters to help inform the CLI how to find it.` - ); - } - } - - const plistContents = fs.readFileSync(resolvedPlistFile).toString(); - - try { - var parsedPlist = plist.parse(plistContents); - } catch (e) { - throw new Error(`Unable to parse "${resolvedPlistFile}". Please ensure it is a well-formed plist file.`); - } +export function getReactNativeProjectAppVersion( + command: cli.IReleaseReactCommand, + projectName: string, +): Promise { + const fileExists = (file: string): boolean => { + try { + return fs.statSync(file).isFile(); + } catch (e) { + return false; + } + }; + + out.text(chalk.cyan(`Detecting ${command.platform} app version:\n`)); + + if (command.platform === 'ios') { + let resolvedPlistFile: string = command.plistFile; + if (resolvedPlistFile) { + // If a plist file path is explicitly provided, then we don't + // need to attempt to "resolve" it within the well-known locations. + if (!fileExists(resolvedPlistFile)) { + throw new Error( + "The specified plist file doesn't exist. Please check that the provided path is correct.", + ); + } + } else { + // Allow the plist prefix to be specified with or without a trailing + // separator character, but prescribe the use of a hyphen when omitted, + // since this is the most commonly used convetion for plist files. + if (command.plistFilePrefix && /.+[^-.]$/.test(command.plistFilePrefix)) { + command.plistFilePrefix += '-'; + } - if (parsedPlist && parsedPlist.CFBundleShortVersionString) { - if (isValidVersion(parsedPlist.CFBundleShortVersionString)) { - out.text(`Using the target binary version value "${parsedPlist.CFBundleShortVersionString}" from "${resolvedPlistFile}".\n`); - return Promise.resolve(parsedPlist.CFBundleShortVersionString); - } else { - throw new Error( - `The "CFBundleShortVersionString" key in the "${resolvedPlistFile}" file needs to specify a valid semver string, containing both a major and minor version (e.g. 1.3.2, 1.1).` - ); - } - } else { - throw new Error(`The "CFBundleShortVersionString" key doesn't exist within the "${resolvedPlistFile}" file.`); - } - } else if (command.platform === "android") { - let buildGradlePath: string = path.join("android", "app"); - if (command.gradleFile) { - buildGradlePath = command.gradleFile; - } - if (fs.lstatSync(buildGradlePath).isDirectory()) { - buildGradlePath = path.join(buildGradlePath, "build.gradle"); - } + const iOSDirectory: string = 'ios'; + const plistFileName = `${command.plistFilePrefix || ''}Info.plist`; - if (fileDoesNotExistOrIsDirectory(buildGradlePath)) { - throw new Error(`Unable to find gradle file "${buildGradlePath}".`); - } + const knownLocations = [ + path.join(iOSDirectory, projectName, plistFileName), + path.join(iOSDirectory, plistFileName), + ]; - return g2js - .parseFile(buildGradlePath) - .catch(() => { - throw new Error(`Unable to parse the "${buildGradlePath}" file. Please ensure it is a well-formed Gradle file.`); - }) - .then((buildGradle: any) => { - let versionName: string = null; + resolvedPlistFile = (knownLocations).find(fileExists); - if (buildGradle.android && buildGradle.android.defaultConfig && buildGradle.android.defaultConfig.versionName) { - versionName = buildGradle.android.defaultConfig.versionName; - } else { - throw new Error( - `The "${buildGradlePath}" file doesn't specify a value for the "android.defaultConfig.versionName" property.` - ); + if (!resolvedPlistFile) { + throw new Error( + `Unable to find either of the following plist files in order to infer your app's binary version: "${knownLocations.join( + '", "', + )}". If your plist has a different name, or is located in a different directory, consider using either the "--plistFile" or "--plistFilePrefix" parameters to help inform the CLI how to find it.`, + ); + } } - if (typeof versionName !== "string") { - throw new Error( - `The "android.defaultConfig.versionName" property value in "${buildGradlePath}" is not a valid string. If this is expected, consider using the --targetBinaryVersion option to specify the value manually.` - ); - } + const plistContents = fs.readFileSync(resolvedPlistFile).toString(); - let appVersion: string = versionName.replace(/"/g, "").trim(); - - if (isValidVersion(appVersion)) { - // The versionName property is a valid semver string, - // so we can safely use that and move on. - out.text(`Using the target binary version value "${appVersion}" from "${buildGradlePath}".\n`); - return appVersion; - } else if (/^\d.*/.test(appVersion)) { - // The versionName property isn't a valid semver string, - // but it starts with a number, and therefore, it can't - // be a valid Gradle property reference. - throw new Error( - `The "android.defaultConfig.versionName" property in the "${buildGradlePath}" file needs to specify a valid semver string, containing both a major and minor version (e.g. 1.3.2, 1.1).` - ); + try { + var parsedPlist = plist.parse(plistContents); + } catch (e) { + throw new Error( + `Unable to parse "${resolvedPlistFile}". Please ensure it is a well-formed plist file.`, + ); } - // The version property isn't a valid semver string - // so we assume it is a reference to a property variable. - const propertyName = appVersion.replace("project.", ""); - const propertiesFileName = "gradle.properties"; - - const knownLocations = [path.join("android", "app", propertiesFileName), path.join("android", propertiesFileName)]; - - // Search for gradle properties across all `gradle.properties` files - var propertiesFile: string = null; - for (var i = 0; i < knownLocations.length; i++) { - propertiesFile = knownLocations[i]; - if (fileExists(propertiesFile)) { - const propertiesContent: string = fs.readFileSync(propertiesFile).toString(); - try { - const parsedProperties: any = properties.parse(propertiesContent); - appVersion = parsedProperties[propertyName]; - if (appVersion) { - break; - } - } catch (e) { - throw new Error(`Unable to parse "${propertiesFile}". Please ensure it is a well-formed properties file.`); + if (parsedPlist && parsedPlist.CFBundleShortVersionString) { + if (/MARKETING_VERSION/i.test(parsedPlist.CFBundleShortVersionString)) { + try { + const xcodeProjectConfig = + path.resolve(resolvedPlistFile, "../") + + ".xcodeproj/project.pbxproj"; + out.text( + 'Using xcodeProjectConfig version, file path "' + .concat(xcodeProjectConfig, '".\n') + ); + const xcodeContents = fs.readFileSync(xcodeProjectConfig).toString(); + + const xcodeVersionRegex = /Release[\s\S]*MARKETING_VERSION = (\d+\.\d+\.\d+)/gm; + let xcodeVersion; + let match; + + while ((match = xcodeVersionRegex.exec(xcodeContents)) !== null) { + // 这个循环将重复执行,直到没有更多匹配项 + // match[1] 将包含第一个捕获组的值,即版本号 + xcodeVersion = match[1]; + break; // 因为我们只需要第一个匹配项,所以找到后就可以退出循环 + } + out.text( + 'Using xcodeProjectConfig version, version "'.concat( + xcodeVersion, + '".\n' + ) + ); + parsedPlist.CFBundleShortVersionString = xcodeVersion; + } catch (error) { + + } + } + if (isValidVersion(parsedPlist.CFBundleShortVersionString)) { + out.text( + `Using the target binary version value "${parsedPlist.CFBundleShortVersionString}" from "${resolvedPlistFile}".\n`, + ); + return Promise.resolve(parsedPlist.CFBundleShortVersionString); + } else { + throw new Error( + `The "CFBundleShortVersionString" key in the "${resolvedPlistFile}" file needs to specify a valid semver string, containing both a major and minor version (e.g. 1.3.2, 1.1).`, + ); } - } + } else { + throw new Error( + `The "CFBundleShortVersionString" key doesn't exist within the "${resolvedPlistFile}" file.`, + ); } - - if (!appVersion) { - throw new Error(`No property named "${propertyName}" exists in the "${propertiesFile}" file.`); + } else if (command.platform === 'android') { + let buildGradlePath: string = path.join('android', 'app'); + if (command.gradleFile) { + buildGradlePath = command.gradleFile; } - - if (!isValidVersion(appVersion)) { - throw new Error( - `The "${propertyName}" property in the "${propertiesFile}" file needs to specify a valid semver string, containing both a major and minor version (e.g. 1.3.2, 1.1).` - ); + if (fs.lstatSync(buildGradlePath).isDirectory()) { + buildGradlePath = path.join(buildGradlePath, 'build.gradle'); } - out.text( - `Using the target binary version value "${appVersion}" from the "${propertyName}" key in the "${propertiesFile}" file.\n` - ); - return appVersion.toString(); - }); - } else { - var appxManifestFileName: string = "Package.appxmanifest"; - try { - var appxManifestContainingFolder: string = path.join("windows", projectName); - var appxManifestContents: string = fs.readFileSync(path.join(appxManifestContainingFolder, "Package.appxmanifest")).toString(); - } catch (err) { - throw new Error(`Unable to find or read "${appxManifestFileName}" in the "${path.join("windows", projectName)}" folder.`); - } - return new Promise((resolve, reject) => { - xml2js.parseString(appxManifestContents, (err: Error, parsedAppxManifest: any) => { - if (err) { - reject( - new Error( - `Unable to parse the "${path.join(appxManifestContainingFolder, appxManifestFileName)}" file, it could be malformed.` - ) - ); - return; + if (fileDoesNotExistOrIsDirectory(buildGradlePath)) { + throw new Error(`Unable to find gradle file "${buildGradlePath}".`); } + + return g2js + .parseFile(buildGradlePath) + .catch(() => { + throw new Error( + `Unable to parse the "${buildGradlePath}" file. Please ensure it is a well-formed Gradle file.`, + ); + }) + .then((buildGradle: any) => { + let versionName: string = null; + + if ( + buildGradle.android && + buildGradle.android.defaultConfig && + buildGradle.android.defaultConfig.versionName + ) { + versionName = buildGradle.android.defaultConfig.versionName; + } else { + throw new Error( + `The "${buildGradlePath}" file doesn't specify a value for the "android.defaultConfig.versionName" property.`, + ); + } + + if (typeof versionName !== 'string') { + throw new Error( + `The "android.defaultConfig.versionName" property value in "${buildGradlePath}" is not a valid string. If this is expected, consider using the --targetBinaryVersion option to specify the value manually.`, + ); + } + + let appVersion: string = versionName.replace(/"/g, '').trim(); + + if (isValidVersion(appVersion)) { + // The versionName property is a valid semver string, + // so we can safely use that and move on. + out.text( + `Using the target binary version value "${appVersion}" from "${buildGradlePath}".\n`, + ); + return appVersion; + } else if (/^\d.*/.test(appVersion)) { + // The versionName property isn't a valid semver string, + // but it starts with a number, and therefore, it can't + // be a valid Gradle property reference. + throw new Error( + `The "android.defaultConfig.versionName" property in the "${buildGradlePath}" file needs to specify a valid semver string, containing both a major and minor version (e.g. 1.3.2, 1.1).`, + ); + } + + // The version property isn't a valid semver string + // so we assume it is a reference to a property variable. + const propertyName = appVersion.replace('project.', ''); + const propertiesFileName = 'gradle.properties'; + + const knownLocations = [ + path.join('android', 'app', propertiesFileName), + path.join('android', propertiesFileName), + ]; + + // Search for gradle properties across all `gradle.properties` files + var propertiesFile: string = null; + for (var i = 0; i < knownLocations.length; i++) { + propertiesFile = knownLocations[i]; + if (fileExists(propertiesFile)) { + const propertiesContent: string = fs + .readFileSync(propertiesFile) + .toString(); + try { + const parsedProperties: any = properties.parse(propertiesContent); + appVersion = parsedProperties[propertyName]; + if (appVersion) { + break; + } + } catch (e) { + throw new Error( + `Unable to parse "${propertiesFile}". Please ensure it is a well-formed properties file.`, + ); + } + } + } + + if (!appVersion) { + throw new Error( + `No property named "${propertyName}" exists in the "${propertiesFile}" file.`, + ); + } + + if (!isValidVersion(appVersion)) { + throw new Error( + `The "${propertyName}" property in the "${propertiesFile}" file needs to specify a valid semver string, containing both a major and minor version (e.g. 1.3.2, 1.1).`, + ); + } + + out.text( + `Using the target binary version value "${appVersion}" from the "${propertyName}" key in the "${propertiesFile}" file.\n`, + ); + return appVersion.toString(); + }); + } else { + var appxManifestFileName: string = 'Package.appxmanifest'; try { - const appVersion: string = parsedAppxManifest.Package.Identity[0]["$"].Version.match(/^\d+\.\d+\.\d+/)[0]; - out.text( - `Using the target binary version value "${appVersion}" from the "Identity" key in the "${appxManifestFileName}" file.\n` - ); - return resolve(appVersion); - } catch (e) { - reject( - new Error( - `Unable to parse the package version from the "${path.join(appxManifestContainingFolder, appxManifestFileName)}" file.` - ) - ); - return; + var appxManifestContainingFolder: string = path.join('windows', projectName); + var appxManifestContents: string = fs + .readFileSync(path.join(appxManifestContainingFolder, 'Package.appxmanifest')) + .toString(); + } catch (err) { + throw new Error( + `Unable to find or read "${appxManifestFileName}" in the "${path.join( + 'windows', + projectName, + )}" folder.`, + ); } - }); - }); - } + return new Promise((resolve, reject) => { + xml2js.parseString(appxManifestContents, (err: Error, parsedAppxManifest: any) => { + if (err) { + reject( + new Error( + `Unable to parse the "${path.join( + appxManifestContainingFolder, + appxManifestFileName, + )}" file, it could be malformed.`, + ), + ); + return; + } + try { + const appVersion: string = + parsedAppxManifest.Package.Identity[0]['$'].Version.match( + /^\d+\.\d+\.\d+/, + )[0]; + out.text( + `Using the target binary version value "${appVersion}" from the "Identity" key in the "${appxManifestFileName}" file.\n`, + ); + return resolve(appVersion); + } catch (e) { + reject( + new Error( + `Unable to parse the package version from the "${path.join( + appxManifestContainingFolder, + appxManifestFileName, + )}" file.`, + ), + ); + return; + } + }); + }); + } +} + +// https://github.com/microsoft/appcenter-cli/blob/master/src/commands/codepush/release-react.ts#L201 +// https://github.com/microsoft/appcenter-cli/blob/13495af812558bd952d8aeb9dc01b5be089cd1fc/src/commands/codepush/lib/react-native-utils.ts#L277 +function getCliPath(): string { + if (process.platform === 'win32') { + return path.join('node_modules', 'react-native', 'local-cli', 'cli.js'); + } + + return path.join('node_modules', '.bin', 'react-native'); } export function runReactNativeBundleCommand( - bundleName: string, - development: boolean, - entryFile: string, - outputFolder: string, - platform: string, - sourcemapOutput: string, - config: string + bundleName: string, + development: boolean, + entryFile: string, + outputFolder: string, + platform: string, + sourcemapOutput: string, + config: string, + extraBundlerOptions?: string[], ): Promise { - let reactNativeBundleArgs: string[] = []; - let envNodeArgs: string = process.env.CODE_PUSH_NODE_ARGS; - - if (typeof envNodeArgs !== "undefined") { - Array.prototype.push.apply(reactNativeBundleArgs, envNodeArgs.trim().split(/\s+/)); - } - - Array.prototype.push.apply(reactNativeBundleArgs, [ - path.join("node_modules", "react-native", "local-cli", "cli.js"), - "bundle", - "--assets-dest", - outputFolder, - "--bundle-output", - path.join(outputFolder, bundleName), - "--dev", - development, - "--entry-file", - entryFile, - "--platform", - platform, - ]); - - if (sourcemapOutput) { - reactNativeBundleArgs.push("--sourcemap-output", sourcemapOutput); - } - - if (config) { - reactNativeBundleArgs.push("--config", config); - } - - out.text(chalk.cyan('Running "react-native bundle" command:\n')); - var reactNativeBundleProcess = spawn("node", reactNativeBundleArgs); - out.text(`node ${reactNativeBundleArgs.join(" ")}`); - - return new Promise((resolve, reject) => { - reactNativeBundleProcess.stdout.on("data", (data: Buffer) => { - out.text(data.toString().trim()); - }); + let reactNativeBundleArgs: string[] = []; + let envNodeArgs: string = process.env.CODE_PUSH_NODE_ARGS; - reactNativeBundleProcess.stderr.on("data", (data: Buffer) => { - console.error(data.toString().trim()); - }); + if (typeof envNodeArgs !== 'undefined') { + Array.prototype.push.apply(reactNativeBundleArgs, envNodeArgs.trim().split(/\s+/)); + } - reactNativeBundleProcess.on("close", (exitCode: number) => { - if (exitCode) { - reject(new Error(`"react-native bundle" command exited with code ${exitCode}.`)); - } + Array.prototype.push.apply(reactNativeBundleArgs, [ + getCliPath(), + 'bundle', + '--assets-dest', + outputFolder, + '--bundle-output', + path.join(outputFolder, bundleName), + '--dev', + development, + '--entry-file', + entryFile, + '--platform', + platform, + ...extraBundlerOptions, + ]); + + if (sourcemapOutput) { + reactNativeBundleArgs.push('--sourcemap-output', sourcemapOutput); + } - resolve(null); + if (config) { + reactNativeBundleArgs.push('--config', config); + } + + out.text(chalk.cyan('Running "react-native bundle" command:\n')); + var reactNativeBundleProcess = spawn('node', reactNativeBundleArgs); + out.text(`node ${reactNativeBundleArgs.join(' ')}`); + + return new Promise((resolve, reject) => { + reactNativeBundleProcess.stdout.on('data', (data: Buffer) => { + out.text(data.toString().trim()); + }); + + reactNativeBundleProcess.stderr.on('data', (data: Buffer) => { + console.error(data.toString().trim()); + }); + + reactNativeBundleProcess.on('close', (exitCode: number) => { + if (exitCode) { + reject(new Error(`"react-native bundle" command exited with code ${exitCode}.`)); + } + + resolve(null); + }); }); - }); } export function runHermesEmitBinaryCommand( - bundleName: string, - outputFolder: string, - sourcemapOutput: string, - extraHermesFlags: string[] + bundleName: string, + outputFolder: string, + sourcemapOutput: string, + extraHermesFlags: string[], ): Promise { - const hermesArgs: string[] = []; - const envNodeArgs: string = process.env.CODE_PUSH_NODE_ARGS; - - if (typeof envNodeArgs !== "undefined") { - Array.prototype.push.apply(hermesArgs, envNodeArgs.trim().split(/\s+/)); - } - - Array.prototype.push.apply(hermesArgs, [ - "-emit-binary", - "-out", - path.join(outputFolder, bundleName + ".hbc"), - path.join(outputFolder, bundleName), - ...extraHermesFlags, - ]); - - if (sourcemapOutput) { - hermesArgs.push("-output-source-map"); - } - - /* + const hermesArgs: string[] = []; + const envNodeArgs: string = process.env.CODE_PUSH_NODE_ARGS; + out.text(chalk.cyan('Converting JS bundle to byte code via Hermes, running command:\n')); + if (typeof envNodeArgs !== 'undefined') { + Array.prototype.push.apply(hermesArgs, envNodeArgs.trim().split(/\s+/)); + } + + Array.prototype.push.apply(hermesArgs, [ + '-emit-binary', + '-out', + path.join(outputFolder, bundleName + '.hbc'), + path.join(outputFolder, bundleName), + ...extraHermesFlags, + ]); + + if (sourcemapOutput) { + hermesArgs.push('-output-source-map'); + } + + /* if (!isDebug()) { hermesArgs.push("-w"); } */ - out.text(chalk.cyan("Converting JS bundle to byte code via Hermes, running command:\n")); + out.text(chalk.cyan('Converting JS bundle to byte code via Hermes, running command:\n')); - const hermesCommand = getHermesCommand(); - const hermesProcess = spawn(hermesCommand, hermesArgs); - out.text(`${hermesCommand} ${hermesArgs.join(" ")}`); + const hermesCommand = getHermesCommand(); + const hermesProcess = spawn(hermesCommand, hermesArgs); + out.text(`${hermesCommand} ${hermesArgs.join(' ')}`); - return new Promise((resolve, reject) => { - hermesProcess.stdout.on("data", (data: Buffer) => { - out.text(data.toString().trim()); - }); + return new Promise((resolve, reject) => { + hermesProcess.stdout.on('data', (data: Buffer) => { + out.text(data.toString().trim()); + }); - hermesProcess.stderr.on("data", (data: Buffer) => { - console.error(data.toString().trim()); - }); + hermesProcess.stderr.on('data', (data: Buffer) => { + console.error(data.toString().trim()); + }); - hermesProcess.on("close", (exitCode: number) => { - if (exitCode) { - reject(new Error(`"hermes" command exited with code ${exitCode}.`)); - } + hermesProcess.on('close', (exitCode: number) => { + if (exitCode) { + reject(new Error(`"hermes" command exited with code ${exitCode}.`)); + } - // Copy HBC bundle to overwrite JS bundle - const source = path.join(outputFolder, bundleName + ".hbc"); - const destination = path.join(outputFolder, bundleName); + // Copy HBC bundle to overwrite JS bundle + const source = path.join(outputFolder, bundleName + '.hbc'); + const destination = path.join(outputFolder, bundleName); + + fs.copyFile(source, destination, (err) => { + if (err) { + console.error(err); + reject( + new Error( + `Copying file ${source} to ${destination} failed. "hermes" previously exited with code ${exitCode}.`, + ), + ); + } + fs.unlink(source, (err) => { + if (err) { + console.error(err); + reject(err); + } + + resolve(null as void); + }); + }); + }); + }).then(() => { + if (!sourcemapOutput) { + // skip source map compose if source map is not enabled + return; + } - fs.copyFile(source, destination, (err) => { - if (err) { - console.error(err); - reject(new Error(`Copying file ${source} to ${destination} failed. "hermes" previously exited with code ${exitCode}.`)); + const composeSourceMapsPath = getComposeSourceMapsPath(); + if (!composeSourceMapsPath) { + throw new Error('react-native compose-source-maps.js scripts is not found'); } - fs.unlink(source, (err) => { - if (err) { - console.error(err); - reject(err); - } - resolve(null as void); + const jsCompilerSourceMapFile = path.join(outputFolder, bundleName + '.hbc' + '.map'); + if (!fs.existsSync(jsCompilerSourceMapFile)) { + throw new Error(`sourcemap file ${jsCompilerSourceMapFile} is not found`); + } + + return new Promise((resolve, reject) => { + const composeSourceMapsArgs = [ + sourcemapOutput, + jsCompilerSourceMapFile, + '-o', + sourcemapOutput, + ]; + + // https://github.com/facebook/react-native/blob/master/react.gradle#L211 + // index.android.bundle.packager.map + index.android.bundle.compiler.map = index.android.bundle.map + const composeSourceMapsProcess = spawn(composeSourceMapsPath, composeSourceMapsArgs); + out.text(`${composeSourceMapsPath} ${composeSourceMapsArgs.join(' ')}`); + + composeSourceMapsProcess.stdout.on('data', (data: Buffer) => { + out.text(data.toString().trim()); + }); + + composeSourceMapsProcess.stderr.on('data', (data: Buffer) => { + console.error(data.toString().trim()); + }); + + composeSourceMapsProcess.on('close', (exitCode: number) => { + if (exitCode) { + reject( + new Error(`"compose-source-maps" command exited with code ${exitCode}.`), + ); + } + + // Delete the HBC sourceMap, otherwise it will be included in 'code-push' bundle as well + fs.unlink(jsCompilerSourceMapFile, (err) => { + if (err) { + console.error(err); + reject(err); + } + + resolve(null); + }); + }); }); - }); }); - }).then(() => { - if (!sourcemapOutput) { - // skip source map compose if source map is not enabled - return; - } +} + +export async function getHermesEnabled(gradleFile?: string): Promise { + let buildGradlePath = gradleFile ?? path.join('android', 'app'); - const composeSourceMapsPath = getComposeSourceMapsPath(); - if (!composeSourceMapsPath) { - throw new Error("react-native compose-source-maps.js scripts is not found"); + if (await fileDoesNotExistOrIsDirectory(buildGradlePath)) { + buildGradlePath = path.join(buildGradlePath, 'build.gradle'); } - const jsCompilerSourceMapFile = path.join(outputFolder, bundleName + ".hbc" + ".map"); - if (!fs.existsSync(jsCompilerSourceMapFile)) { - throw new Error(`sourcemap file ${jsCompilerSourceMapFile} is not found`); + if (await fileDoesNotExistOrIsDirectory(buildGradlePath)) { + throw new Error(`Unable to find gradle file "${buildGradlePath}".`); } - return new Promise((resolve, reject) => { - const composeSourceMapsArgs = [sourcemapOutput, jsCompilerSourceMapFile, "-o", sourcemapOutput]; + let gradlePropertyPath: string = path.join('android', 'gradle.properties'); - // https://github.com/facebook/react-native/blob/master/react.gradle#L211 - // index.android.bundle.packager.map + index.android.bundle.compiler.map = index.android.bundle.map - const composeSourceMapsProcess = spawn(composeSourceMapsPath, composeSourceMapsArgs); - out.text(`${composeSourceMapsPath} ${composeSourceMapsArgs.join(" ")}`); + if (await fileDoesNotExistOrIsDirectory(gradlePropertyPath)) { + throw new Error(`Unable to find gradle file "${gradlePropertyPath}".`); + } - composeSourceMapsProcess.stdout.on("data", (data: Buffer) => { - out.text(data.toString().trim()); - }); + try { + const buildGradle = await g2js.parseFile(buildGradlePath); + const buildProperty = await g2js.parseFile(gradlePropertyPath); - composeSourceMapsProcess.stderr.on("data", (data: Buffer) => { - console.error(data.toString().trim()); - }); + const hermesPropertyEnabled = buildProperty.hermesEnabled ?? false; + let hermesBuildEnabled = false; - composeSourceMapsProcess.on("close", (exitCode: number) => { - if (exitCode) { - reject(new Error(`"compose-source-maps" command exited with code ${exitCode}.`)); + // 如果buildGradle["project.ext.react"]是一个数组,则继续处理 + if (Array.isArray(buildGradle["project.ext.react"])) { + const reactSettings: string[] = buildGradle["project.ext.react"]; + hermesBuildEnabled = reactSettings.some(line => /^enableHermes\s*:\s*true/.test(line)); } - // Delete the HBC sourceMap, otherwise it will be included in 'code-push' bundle as well - fs.unlink(jsCompilerSourceMapFile, (err) => { - if (err) { - console.error(err); - reject(err); - } - - resolve(null); - }); - }); - }); - }); + return hermesPropertyEnabled || hermesBuildEnabled; + } catch (error) { + // error.message 可能需要根据实际在 try 块中发生的错误进行调整 + throw new Error(`An error occurred while processing the Gradle files: ${error.message}`); + } } -export function getHermesEnabled(gradleFile: string): Promise { - let buildGradlePath: string = path.join("android", "app"); - if (gradleFile) { - buildGradlePath = gradleFile; - } - if (fs.lstatSync(buildGradlePath).isDirectory()) { - buildGradlePath = path.join(buildGradlePath, "build.gradle"); - } - - if (fileDoesNotExistOrIsDirectory(buildGradlePath)) { - throw new Error(`Unable to find gradle file "${buildGradlePath}".`); - } - - return g2js - .parseFile(buildGradlePath) - .catch(() => { - throw new Error(`Unable to parse the "${buildGradlePath}" file. Please ensure it is a well-formed Gradle file.`); - }) - .then((buildGradle: any) => { - return Array.from(buildGradle["project.ext.react"]).includes("enableHermes: true"); +export function getiOSHermesEnabled(podFile: string): Promise { + let podPath = path.join('ios', 'Podfile'); + if (podFile) { + podPath = podFile; + } + if (fileDoesNotExistOrIsDirectory(podPath)) { + throw new Error(`Unable to find Podfile file "${podPath}".`); + } + + return new Promise((resolve, reject) => { + fs.readFile(podPath, { encoding: 'utf8' }, (error, res) => { + if (error) { + reject(error); + return; + } + resolve(/:hermes_enabled(\s+|\n+)?=>(\s+|\n+)?true/.test(res)); + }); }); } function getHermesOSBin(): string { - switch (process.platform) { - case "win32": - return "win64-bin"; - case "darwin": - return "osx-bin"; - case "freebsd": - case "linux": - case "sunos": - default: - return "linux64-bin"; - } + switch (process.platform) { + case 'win32': + return 'win64-bin'; + case 'darwin': + return 'osx-bin'; + case 'freebsd': + case 'linux': + case 'sunos': + default: + return 'linux64-bin'; + } } function getHermesOSExe(): string { - const hermesExecutableName = isLowVersion(getReactNativeVersion(), "0.63.0") ? "hermes" : "hermesc"; - switch (process.platform) { - case "win32": - return hermesExecutableName + ".exe"; - default: - return hermesExecutableName; - } + const hermesExecutableName = isLowVersion(getReactNativeVersion(), '0.63.0') + ? 'hermes' + : 'hermesc'; + switch (process.platform) { + case 'win32': + return hermesExecutableName + '.exe'; + default: + return hermesExecutableName; + } } function getHermesCommand(): string { - const fileExists = (file: string): boolean => { - try { - return fs.statSync(file).isFile(); - } catch (e) { - return false; + const fileExists = (file: string): boolean => { + try { + return fs.statSync(file).isFile(); + } catch (e) { + return false; + } + }; + // assume if hermes-engine exists it should be used instead of hermesvm + const hermesEngineNew = path.join( + 'node_modules', + 'react-native', + 'sdks', + 'hermesc', + getHermesOSBin(), + getHermesOSExe() + ); + if (fileExists(hermesEngineNew)) { + return hermesEngineNew; + } + const hermesEngine = path.join( + 'node_modules', + 'hermes-engine', + getHermesOSBin(), + getHermesOSExe(), + ); + if (fileExists(hermesEngine)) { + return hermesEngine; } - }; - // assume if hermes-engine exists it should be used instead of hermesvm - const hermesEngine = path.join("node_modules", "hermes-engine", getHermesOSBin(), getHermesOSExe()); - if (fileExists(hermesEngine)) { - return hermesEngine; - } - return path.join("node_modules", "hermesvm", getHermesOSBin(), "hermes"); + return path.join('node_modules', 'hermesvm', getHermesOSBin(), 'hermes'); } function getComposeSourceMapsPath(): string { - // detect if compose-source-maps.js script exists - const composeSourceMaps = path.join("node_modules", "react-native", "scripts", "compose-source-maps.js"); - if (fs.existsSync(composeSourceMaps)) { - return composeSourceMaps; - } - return null; + // detect if compose-source-maps.js script exists + const composeSourceMaps = path.join( + 'node_modules', + 'react-native', + 'scripts', + 'compose-source-maps.js', + ); + if (fs.existsSync(composeSourceMaps)) { + return composeSourceMaps; + } + return null; } export function getReactNativeVersion(): string { - try { - // eslint-disable-next-line security/detect-non-literal-require - const projectPackageJson: any = require(path.join(process.cwd(), "package.json")); - const projectName: string = projectPackageJson.name; - if (!projectName) { - throw new Error(`The "package.json" file in the CWD does not have the "name" field set.`); - } + try { + // eslint-disable-next-line security/detect-non-literal-require + const projectPackageJson: any = require(path.join(process.cwd(), 'package.json')); + const projectName: string = projectPackageJson.name; + if (!projectName) { + throw new Error( + `The "package.json" file in the CWD does not have the "name" field set.`, + ); + } - return ( - projectPackageJson.dependencies["react-native"] || - (projectPackageJson.devDependencies && projectPackageJson.devDependencies["react-native"]) - ); - } catch (error) { - throw new Error( - `Unable to find or read "package.json" in the CWD. The "release-react" command must be executed in a React Native project folder.` - ); - } + return ( + projectPackageJson.dependencies['react-native'] || + (projectPackageJson.devDependencies && + projectPackageJson.devDependencies['react-native']) + ); + } catch (error) { + throw new Error( + `Unable to find or read "package.json" in the CWD. The "release-react" command must be executed in a React Native project folder.`, + ); + } } diff --git a/src/lib/validation-utils.ts b/src/lib/validation-utils.ts index bb553b09..645db1a7 100644 --- a/src/lib/validation-utils.ts +++ b/src/lib/validation-utils.ts @@ -1,4 +1,4 @@ -import semver from "semver"; +import semver from 'semver'; const regexpForMajor = /^\d+$/; const regexpForMajorMinor = /^\d+\.\d+$/; @@ -6,14 +6,16 @@ const regexpForMajorMinor = /^\d+\.\d+$/; // Check if the given string is a semver-compliant version number (e.g. '1.2.3') // (missing minor/patch values will be added on server side to pass semver.satisfies check) export function isValidVersion(version: string): boolean { - return !!semver.valid(version) || regexpForMajorMinor.test(version) || regexpForMajor.test(version); + return ( + !!semver.valid(version) || regexpForMajorMinor.test(version) || regexpForMajor.test(version) + ); } // Allow plain integer versions (as well as '1.0' values) for now, e.g. '1' is valid here and we assume that it is equal to '1.0.0'. export function isValidRange(semverRange: string): boolean { - return !!semver.validRange(semverRange); + return !!semver.validRange(semverRange); } export function isLowVersion(v1: string, v2: string): boolean { - return semver.compare(v1, v2) === -1 ? true : false; + return semver.compare(v1, v2) === -1 ? true : false; } diff --git a/src/release-hooks/core-release.ts b/src/release-hooks/core-release.ts index 8be4fb8e..bbc6fa4a 100644 --- a/src/release-hooks/core-release.ts +++ b/src/release-hooks/core-release.ts @@ -1,130 +1,131 @@ -import fs from "fs"; -import path from "path"; -import recursiveFs from "recursive-fs"; -import yazl from "yazl"; +import fs from 'fs'; +import path from 'path'; +import recursiveFs from 'recursive-fs'; +import slash from 'slash'; +import yazl from 'yazl'; -import { Package, PackageInfo } from "code-push/script/types"; -import { out } from "../util/interaction"; -import { generateRandomFilename } from "../lib/file-utils"; -import * as cli from "../definitions/cli"; +import { Package, PackageInfo } from 'code-push/script/types'; +import { out } from '../util/interaction'; +import { generateRandomFilename } from '../lib/file-utils'; +import * as cli from '../definitions/cli'; -import slash = require("slash"); -const progress = require("progress"); +const progress = require('progress'); -import AccountManager = require("code-push"); +import AccountManager = require('code-push'); var coreReleaseHook: cli.ReleaseHook = ( - currentCommand: cli.IReleaseCommand, - originalCommand: cli.IReleaseCommand, - sdk: AccountManager + currentCommand: cli.IReleaseCommand, + originalCommand: cli.IReleaseCommand, + sdk: AccountManager, ): Promise => { - return Promise.resolve(null) - .then(() => { - var releaseFiles: cli.ReleaseFile[] = []; - - if (!fs.lstatSync(currentCommand.package).isDirectory()) { - releaseFiles.push({ - sourceLocation: currentCommand.package, - targetLocation: path.basename(currentCommand.package), // Put the file in the root - }); - return Promise.resolve(releaseFiles); - } - - return new Promise((resolve, reject) => { - var directoryPath: string = currentCommand.package; - var baseDirectoryPath = path.join(directoryPath, ".."); // For legacy reasons, put the root directory in the zip - - recursiveFs.readdirr(currentCommand.package, (error?: any, directories?: string[], files?: string[]): void => { - if (error) { - reject(error); - return; - } + return Promise.resolve(null) + .then(() => { + var releaseFiles: cli.ReleaseFile[] = []; + + if (!fs.lstatSync(currentCommand.package).isDirectory()) { + releaseFiles.push({ + sourceLocation: currentCommand.package, + targetLocation: path.basename(currentCommand.package), // Put the file in the root + }); + return Promise.resolve(releaseFiles); + } - files.forEach((filePath: string) => { - var relativePath: string = path.relative(baseDirectoryPath, filePath); - // yazl does not like backslash (\) in the metadata path. - relativePath = slash(relativePath); - releaseFiles.push({ - sourceLocation: filePath, - targetLocation: relativePath, + return new Promise(async (resolve, reject) => { + var directoryPath: string = currentCommand.package; + var baseDirectoryPath = path.join(directoryPath, '..'); // For legacy reasons, put the root directory in the zip + + try { + var { files } = await recursiveFs.read(currentCommand.package); + files.forEach((filePath: string) => { + var relativePath: string = path.relative(baseDirectoryPath, filePath); + // yazl does not like backslash (\) in the metadata path. + relativePath = slash(relativePath); + releaseFiles.push({ + sourceLocation: filePath, + targetLocation: relativePath, + }); + }); + + resolve(releaseFiles); + } catch (error) { + reject(error); + } + }); + }) + .then((releaseFiles: cli.ReleaseFile[]) => { + return new Promise((resolve, reject): void => { + var packagePath: string = path.join( + process.cwd(), + generateRandomFilename(15) + '.zip', + ); + var zipFile = new yazl.ZipFile(); + var writeStream: fs.WriteStream = fs.createWriteStream(packagePath); + + zipFile.outputStream + .pipe(writeStream) + .on('error', (error: Error): void => { + reject(error); + }) + .on('close', (): void => { + resolve(packagePath); + }); + + releaseFiles.forEach((releaseFile: cli.ReleaseFile) => { + zipFile.addFile(releaseFile.sourceLocation, releaseFile.targetLocation); + }); + + zipFile.end(); + }); + }) + .then((packagePath: string): Promise => { + var lastTotalProgress = 0; + var progressBar = new progress('Upload progress:[:bar] :percent :etas', { + complete: '=', + incomplete: ' ', + width: 50, + total: 100, }); - }); - - resolve(releaseFiles); - }); - }); - }) - .then((releaseFiles: cli.ReleaseFile[]) => { - return new Promise((resolve, reject): void => { - var packagePath: string = path.join(process.cwd(), generateRandomFilename(15) + ".zip"); - var zipFile = new yazl.ZipFile(); - var writeStream: fs.WriteStream = fs.createWriteStream(packagePath); - - zipFile.outputStream - .pipe(writeStream) - .on("error", (error: Error): void => { - reject(error); - }) - .on("close", (): void => { - resolve(packagePath); - }); - - releaseFiles.forEach((releaseFile: cli.ReleaseFile) => { - zipFile.addFile(releaseFile.sourceLocation, releaseFile.targetLocation); - }); - zipFile.end(); - }); - }) - .then( - (packagePath: string): Promise => { - var lastTotalProgress = 0; - var progressBar = new progress("Upload progress:[:bar] :percent :etas", { - complete: "=", - incomplete: " ", - width: 50, - total: 100, + var uploadProgress = (currentProgress: number): void => { + progressBar.tick(currentProgress - lastTotalProgress); + lastTotalProgress = currentProgress; + }; + + var updateMetadata: PackageInfo = { + description: currentCommand.description, + isDisabled: currentCommand.disabled, + isMandatory: currentCommand.mandatory, + rollout: currentCommand.rollout, + }; + + return sdk + .isAuthenticated(true) + .then((isAuth: boolean): Promise => { + return sdk.release( + currentCommand.appName, + currentCommand.deploymentName, + packagePath, + currentCommand.appStoreVersion, + updateMetadata, + uploadProgress, + ); + }) + .then((): void => { + out.text( + `Successfully released an update containing the "${originalCommand.package}" ` + + `${ + fs.lstatSync(originalCommand.package).isDirectory() + ? 'directory' + : 'file' + }` + + ` to the "${currentCommand.deploymentName}" deployment of the "${currentCommand.appName}" app.`, + ); + }) + .then(() => currentCommand) + .finally(() => { + fs.unlinkSync(packagePath); + }); }); - - var uploadProgress = (currentProgress: number): void => { - progressBar.tick(currentProgress - lastTotalProgress); - lastTotalProgress = currentProgress; - }; - - var updateMetadata: PackageInfo = { - description: currentCommand.description, - isDisabled: currentCommand.disabled, - isMandatory: currentCommand.mandatory, - rollout: currentCommand.rollout, - }; - - return sdk - .isAuthenticated(true) - .then( - (isAuth: boolean): Promise => { - return sdk.release( - currentCommand.appName, - currentCommand.deploymentName, - packagePath, - currentCommand.appStoreVersion, - updateMetadata, - uploadProgress - ); - } - ) - .then((): void => { - out.text( - `Successfully released an update containing the "${originalCommand.package}" ` + - `${fs.lstatSync(originalCommand.package).isDirectory() ? "directory" : "file"}` + - ` to the "${currentCommand.deploymentName}" deployment of the "${currentCommand.appName}" app.` - ); - }) - .then(() => currentCommand) - .finally(() => { - fs.unlinkSync(packagePath); - }); - } - ); }; export = coreReleaseHook; diff --git a/src/release-hooks/index.ts b/src/release-hooks/index.ts index db6e4339..f4350e58 100644 --- a/src/release-hooks/index.ts +++ b/src/release-hooks/index.ts @@ -1,5 +1,5 @@ -import { ReleaseHook } from "../definitions/cli"; +import { ReleaseHook } from '../definitions/cli'; -var hooks: ReleaseHook[] = [require("./signing"), require("./core-release")]; +var hooks: ReleaseHook[] = [require('./signing'), require('./core-release')]; export default hooks; diff --git a/src/release-hooks/signing.ts b/src/release-hooks/signing.ts index bb174af3..f039f7ad 100644 --- a/src/release-hooks/signing.ts +++ b/src/release-hooks/signing.ts @@ -1,133 +1,147 @@ -import * as cli from "../definitions/cli"; -import fs from "fs"; -import jwt from "jsonwebtoken"; -import os from "os"; -import path from "path"; -import rimraf from "rimraf"; -import { generatePackageHashFromDirectory } from "../lib/hash-utils"; +import * as cli from '../definitions/cli'; +import fs from 'fs'; +import jwt from 'jsonwebtoken'; +import os from 'os'; +import path from 'path'; +import rimraf from 'rimraf'; +import { generatePackageHashFromDirectory } from '../lib/hash-utils'; -import AccountManager = require("code-push"); +import AccountManager = require('code-push'); -var CURRENT_CLAIM_VERSION: string = "1.0.0"; -var METADATA_FILE_NAME: string = ".codepushrelease"; +var CURRENT_CLAIM_VERSION: string = '1.0.0'; +var METADATA_FILE_NAME: string = '.codepushrelease'; interface CodeSigningClaims { - claimVersion: string; - contentHash: string; + claimVersion: string; + contentHash: string; } const deletePreviousSignatureIfExists = (targetPackage: string): Promise => { - let signatureFilePath: string = path.join(targetPackage, METADATA_FILE_NAME); - let prevSignatureExists: boolean = true; - try { - fs.accessSync(signatureFilePath, fs.constants.R_OK); - } catch (err) { - if (err.code === "ENOENT") { - prevSignatureExists = false; - } else { - return Promise.reject( - new Error( - `Could not delete previous release signature at ${signatureFilePath}. - Please, check your access rights.` - ) - ); + let signatureFilePath: string = path.join(targetPackage, METADATA_FILE_NAME); + let prevSignatureExists: boolean = true; + try { + fs.accessSync(signatureFilePath, fs.constants.R_OK); + } catch (err) { + if (err.code === 'ENOENT') { + prevSignatureExists = false; + } else { + return Promise.reject( + new Error( + `Could not delete previous release signature at ${signatureFilePath}. + Please, check your access rights.`, + ), + ); + } } - } - if (prevSignatureExists) { - console.log(`Deleting previous release signature at ${signatureFilePath}`); - rimraf.sync(signatureFilePath); - } + if (prevSignatureExists) { + console.log(`Deleting previous release signature at ${signatureFilePath}`); + rimraf.sync(signatureFilePath); + } - return Promise.resolve(null); + return Promise.resolve(null); }; var sign: cli.ReleaseHook = ( - currentCommand: cli.IReleaseCommand, - originalCommand: cli.IReleaseCommand, - sdk: AccountManager + currentCommand: cli.IReleaseCommand, + originalCommand: cli.IReleaseCommand, + sdk: AccountManager, ): Promise => { - if (!currentCommand.privateKeyPath) { - if (fs.lstatSync(currentCommand.package).isDirectory()) { - // If new update wasn't signed, but signature file for some reason still appears in the package directory - delete it - return deletePreviousSignatureIfExists(currentCommand.package).then(() => { - return Promise.resolve(currentCommand); - }); - } else { - return Promise.resolve(currentCommand); + if (!currentCommand.privateKeyPath) { + if (fs.lstatSync(currentCommand.package).isDirectory()) { + // If new update wasn't signed, but signature file for some reason still appears in the package directory - delete it + return deletePreviousSignatureIfExists(currentCommand.package).then(() => { + return Promise.resolve(currentCommand); + }); + } else { + return Promise.resolve(currentCommand); + } } - } - let privateKey: Buffer; - let signatureFilePath: string; + let privateKey: Buffer; + let signatureFilePath: string; - return Promise.resolve(null) - .then(() => { - signatureFilePath = path.join(currentCommand.package, METADATA_FILE_NAME); - try { - privateKey = fs.readFileSync(currentCommand.privateKeyPath); - } catch (err) { - return Promise.reject(new Error(`The path specified for the signing key ("${currentCommand.privateKeyPath}") was not valid`)); - } + return Promise.resolve(null) + .then(() => { + signatureFilePath = path.join(currentCommand.package, METADATA_FILE_NAME); + try { + privateKey = fs.readFileSync(currentCommand.privateKeyPath); + } catch (err) { + return Promise.reject( + new Error( + `The path specified for the signing key ("${currentCommand.privateKeyPath}") was not valid`, + ), + ); + } - if (!fs.lstatSync(currentCommand.package).isDirectory()) { - // If releasing a single file, copy the file to a temporary 'CodePush' directory in which to publish the release - var outputFolderPath: string = path.join(os.tmpdir(), "CodePush"); - rimraf.sync(outputFolderPath); - fs.mkdirSync(outputFolderPath); + if (!fs.lstatSync(currentCommand.package).isDirectory()) { + // If releasing a single file, copy the file to a temporary 'CodePush' directory in which to publish the release + var outputFolderPath: string = path.join(os.tmpdir(), 'CodePush'); + rimraf.sync(outputFolderPath); + fs.mkdirSync(outputFolderPath); - var outputFilePath: string = path.join(outputFolderPath, path.basename(currentCommand.package)); - fs.writeFileSync(outputFilePath, fs.readFileSync(currentCommand.package)); + var outputFilePath: string = path.join( + outputFolderPath, + path.basename(currentCommand.package), + ); + fs.writeFileSync(outputFilePath, fs.readFileSync(currentCommand.package)); - currentCommand.package = outputFolderPath; - } + currentCommand.package = outputFolderPath; + } - return deletePreviousSignatureIfExists(currentCommand.package); - }) - .then(() => { - return generatePackageHashFromDirectory(currentCommand.package, path.join(currentCommand.package, "..")); - }) - .then((hash: string) => { - return new Promise((resolve, reject) => { - const claims: CodeSigningClaims = { - claimVersion: CURRENT_CLAIM_VERSION, - contentHash: hash, - }; + return deletePreviousSignatureIfExists(currentCommand.package); + }) + .then(() => { + return generatePackageHashFromDirectory( + currentCommand.package, + path.join(currentCommand.package, '..'), + ); + }) + .then((hash: string) => { + return new Promise((resolve, reject) => { + const claims: CodeSigningClaims = { + claimVersion: CURRENT_CLAIM_VERSION, + contentHash: hash, + }; - jwt.sign( - claims, - privateKey, - { - algorithm: "RS256", - }, - (err, token) => { - if (err) { - return reject(new Error("The specified signing key file was not valid")); - } - resolve(token); - } - ); - }); - }) - .then((signedJwt: string) => { - return new Promise((resolve, reject) => { - fs.writeFile(signatureFilePath, signedJwt, (err: Error) => { - if (err) { - reject(err); - } else { - console.log(`Generated a release signature and wrote it to ${signatureFilePath}`); - resolve(null); - } + jwt.sign( + claims, + privateKey, + { + algorithm: 'RS256', + }, + (err, token) => { + if (err) { + return reject( + new Error('The specified signing key file was not valid'), + ); + } + resolve(token); + }, + ); + }); + }) + .then((signedJwt: string) => { + return new Promise((resolve, reject) => { + fs.writeFile(signatureFilePath, signedJwt, (err: Error) => { + if (err) { + reject(err); + } else { + console.log( + `Generated a release signature and wrote it to ${signatureFilePath}`, + ); + resolve(null); + } + }); + }); + }) + .then(() => { + return currentCommand; + }) + .catch((err: Error) => { + err.message = `Could not sign package: ${err.message}`; + return Promise.reject(err); }); - }); - }) - .then(() => { - return currentCommand; - }) - .catch((err: Error) => { - err.message = `Could not sign package: ${err.message}`; - return Promise.reject(err); - }); }; export = sign; diff --git a/src/util/interaction/index.ts b/src/util/interaction/index.ts index de7af83c..4e54c457 100644 --- a/src/util/interaction/index.ts +++ b/src/util/interaction/index.ts @@ -1,4 +1,4 @@ -import * as out from "./out"; +import * as out from './out'; export { out }; -export * from "./io-options"; +export * from './io-options'; diff --git a/src/util/interaction/io-options.ts b/src/util/interaction/io-options.ts index 30f8a94c..625e9297 100644 --- a/src/util/interaction/io-options.ts +++ b/src/util/interaction/io-options.ts @@ -6,26 +6,26 @@ let debug: boolean = false; export function isDebug(): boolean { - return debug; + return debug; } export function setDebug(): void { - debug = true; + debug = true; } let quiet: boolean = false; export function isQuiet() { - return quiet; + return quiet; } export function setQuiet(): void { - quiet = true; + quiet = true; } -let format: "list" | "json" | "csv" = "list"; +let format: 'list' | 'json' | 'csv' = 'list'; // Can be used to prevent output which will make output un-parsable export function formatIsParsingCompatible(): boolean { - return format === "json" || format === "csv"; + return format === 'json' || format === 'csv'; } // Key is a string to be passed to "--output" parameter, e.g. "json" @@ -33,19 +33,19 @@ export function formatIsParsingCompatible(): boolean { export type OutputFormatSupport = { [formatKey: string]: () => void }; export function formatIsJson(): boolean { - return format === "json"; + return format === 'json'; } export function setFormatJson(): void { - format = "json"; + format = 'json'; } export function supportsCsv(supportedFormats: OutputFormatSupport): void { - supportedFormats["csv"] = setFormatCsv; + supportedFormats['csv'] = setFormatCsv; } export function formatIsCsv(): boolean { - return format === "csv"; + return format === 'csv'; } export function setFormatCsv(): void { - format = "csv"; + format = 'csv'; } diff --git a/src/util/interaction/out.ts b/src/util/interaction/out.ts index 29147085..30f9edfa 100644 --- a/src/util/interaction/out.ts +++ b/src/util/interaction/out.ts @@ -1,7 +1,7 @@ // Functions to support outputting stuff to the user -import { formatIsJson, formatIsCsv } from "./io-options"; +import { formatIsJson, formatIsCsv } from './io-options'; -const Table = require("cli-table3"); +const Table = require('cli-table3'); // // Output a line of plain text. Only outputs if the format is regular text. @@ -10,24 +10,24 @@ const Table = require("cli-table3"); export function text(converter: { (data: T): string }, data: T): void; export function text(t: string): void; export function text(...args: any[]): void { - console.assert(!formatIsCsv(), "this function doesn't support CSV mode"); - let converter: { (data: any): string }; - let data: any; - if (args.length === 1) { - converter = null; - data = args[0]; - } else { - [converter, data] = args; - } + console.assert(!formatIsCsv(), "this function doesn't support CSV mode"); + let converter: { (data: any): string }; + let data: any; + if (args.length === 1) { + converter = null; + data = args[0]; + } else { + [converter, data] = args; + } - if (formatIsJson()) { - if (converter) { - console.log(JSON.stringify(data)); + if (formatIsJson()) { + if (converter) { + console.log(JSON.stringify(data)); + } + } else { + converter = converter || ((s) => s); + console.log(converter(data)); } - } else { - converter = converter || ((s) => s); - console.log(converter(data)); - } } // @@ -38,28 +38,28 @@ export function text(...args: any[]): void { // on the module. // export function table(options: any, data: any[]): void { - console.assert(!formatIsCsv(), "this function doesn't support CSV mode"); + console.assert(!formatIsCsv(), "this function doesn't support CSV mode"); - if (!data) { - data = options; - options = undefined; - } + if (!data) { + data = options; + options = undefined; + } - if (!formatIsJson()) { - const cliTable = new Table(options); - data.forEach((item) => cliTable.push(item)); - console.log(cliTable.toString()); - } else { - console.log(JSON.stringify(data)); - } + if (!formatIsJson()) { + const cliTable = new Table(options); + data.forEach((item) => cliTable.push(item)); + console.log(cliTable.toString()); + } else { + console.log(JSON.stringify(data)); + } } // Formatting helper for cli-table3 - default command output table style export function getCommandOutputTableOptions(header: string[]): object { - return { - head: header, - style: { - head: [], - }, - }; + return { + head: header, + style: { + head: [], + }, + }; } diff --git a/tea.yaml b/tea.yaml new file mode 100644 index 00000000..aad4b70f --- /dev/null +++ b/tea.yaml @@ -0,0 +1,6 @@ +# https://tea.xyz/what-is-this-file +--- +version: 1.0.0 +codeOwners: + - '0x6498bd929aA09f9a8ccdF8F176E09B24136388cb' +quorum: 1 diff --git a/tsconfig.json b/tsconfig.json index e5c66dc1..1d562d5b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,6 @@ "module": "commonjs", "noEmitOnError": true, "moduleResolution": "node", - "sourceMap": true, "rootDir": "src", "outDir": "bin", "allowSyntheticDefaultImports": true,