diff --git a/.gitignore b/.gitignore index f9ddbe10..ac5bb385 100644 --- a/.gitignore +++ b/.gitignore @@ -21,8 +21,6 @@ tools/toolchain/network/crypto-material/*.tx tools/toolchain/network/crypto-material/crypto-config tools/toolchain/network/crypto-material/core.yaml -docs/**/_out - # Rush files common/temp/** **/.rush/temp/** @@ -32,3 +30,6 @@ common/temp/** package-deps.json test-results.xml docker.log + +# jsdoc output +docs/gen diff --git a/CHANGELOG.md b/CHANGELOG.md index fc3a152e..b533cea5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,107 @@ +## v2.2.3 +Thu 28 Apr 2022 09:44:19 BST + +* [437c67e](https://github.com/hyperledger/fabric-chaincode-node/commit/437c67e) Recent builds have failued with the browserlist module reporting (on stderr) that it was outdated. This is a dependency of nyc, code coverage. +* [5311536](https://github.com/hyperledger/fabric-chaincode-node/commit/5311536) Rename the root json config file (#301) +* [2957475](https://github.com/hyperledger/fabric-chaincode-node/commit/2957475) Correct TS type definitions +* [bae4955](https://github.com/hyperledger/fabric-chaincode-node/commit/bae4955) Node update (#295) +* [fa2bfe6](https://github.com/hyperledger/fabric-chaincode-node/commit/fa2bfe6) Private data tests added (#290) + +## v2.2.2 +Mon 28 Jun 2021 10:05:22 BST + +* [4918854](https://github.com/hyperledger/fabric-chaincode-node/commit/4918854) Metadata generate updated [FABCN-447](https://jira.hyperledger.org/browse/FABCN-447) (#277) +* [3b94a4b](https://github.com/hyperledger/fabric-chaincode-node/commit/3b94a4b) Shebang issue fixed [FABCN-438](https://jira.hyperledger.org/browse/FABCN-438) (#275) +* [61ea8e4](https://github.com/hyperledger/fabric-chaincode-node/commit/61ea8e4) Pipeline publishing fixed (#274) +* [f75318a](https://github.com/hyperledger/fabric-chaincode-node/commit/f75318a) Transaction metadata tags updated (#265) (#269) +* [8f522ae](https://github.com/hyperledger/fabric-chaincode-node/commit/8f522ae) Refresh updates +* [211f1b0](https://github.com/hyperledger/fabric-chaincode-node/commit/211f1b0) Remove the use of the "phantom" module +* [1fb5641](https://github.com/hyperledger/fabric-chaincode-node/commit/1fb5641) [FABCN-351](https://jira.hyperledger.org/browse/FABCN-351) CORE_PEER_ADDRESS issue fixed (#253) +* [443440f](https://github.com/hyperledger/fabric-chaincode-node/commit/443440f) [FABCN-425](https://jira.hyperledger.org/browse/FABCN-425) getTxTimestamp fixed (#245) +* [4882958](https://github.com/hyperledger/fabric-chaincode-node/commit/4882958) [FABCN-388](https://jira.hyperledger.org/browse/FABCN-388) Tutorial updated (#247) +* [f6bf8a7](https://github.com/hyperledger/fabric-chaincode-node/commit/f6bf8a7) [FABCN-429](https://jira.hyperledger.org/browse/FABCN-429) Iterator tutorial updated (#250) +* [d58fa10](https://github.com/hyperledger/fabric-chaincode-node/commit/d58fa10) Metadata issue solved (#240) +* [0533ba7](https://github.com/hyperledger/fabric-chaincode-node/commit/0533ba7) Bump version to 2.2.2 + +## v2.2.1 +Wed 11 Nov 2020 15:13:14 GMT + +* [a3dafb7](https://github.com/hyperledger/fabric-chaincode-node/commit/a3dafb7) Update node versions +* [23f3ea8](https://github.com/hyperledger/fabric-chaincode-node/commit/23f3ea8) Set node version for jsdoc build +* [3720cb9](https://github.com/hyperledger/fabric-chaincode-node/commit/3720cb9) Publish 2.2 api docs +* [7ce3c34](https://github.com/hyperledger/fabric-chaincode-node/commit/7ce3c34) Update builds for new release-2.2 branch (#225) +* [f71eb0c](https://github.com/hyperledger/fabric-chaincode-node/commit/f71eb0c) [FABCN-432](https://jira.hyperledger.org/browse/FABCN-432) - Update class transformer dependency (#213) +* [fc32346](https://github.com/hyperledger/fabric-chaincode-node/commit/fc32346) [FABCN-430](https://jira.hyperledger.org/browse/FABCN-430) Fix type for timestamp.second (#194) (#209) +* [85188f5](https://github.com/hyperledger/fabric-chaincode-node/commit/85188f5) v2.x tutorials updated (#217) +* [05df03f](https://github.com/hyperledger/fabric-chaincode-node/commit/05df03f) [FABCN-435](https://jira.hyperledger.org/browse/FABCN-435) OOM on Large Arg Size (#207) +* [58387e8](https://github.com/hyperledger/fabric-chaincode-node/commit/58387e8) [FABCN-241](https://jira.hyperledger.org/browse/FABCN-241) Remove to.be.ok (#204) +* [c9a1f5d](https://github.com/hyperledger/fabric-chaincode-node/commit/c9a1f5d) [FABCN-433](https://jira.hyperledger.org/browse/FABCN-433) Update typescript and @types/node (#199) +* [eb39270](https://github.com/hyperledger/fabric-chaincode-node/commit/eb39270) [FABCN-422](https://jira.hyperledger.org/browse/FABCN-422) Add release guide (#187) +* [be2ef68](https://github.com/hyperledger/fabric-chaincode-node/commit/be2ef68) Fix: ChaincodeStub.getMspID should be in lowerCamelCASE +* [7de3c12](https://github.com/hyperledger/fabric-chaincode-node/commit/7de3c12) Bump version to 2.2.1 (#184) + +## v2.2.0 +Thu 2 Jul 11:40:02 BST 2020 + +* [0f1b616](https://github.com/hyperledger/fabric-chaincode-node/commit/0f1b616) [FABCN-421](https://jira.hyperledger.org/browse/FABCN-421) release: 2.2.0 LTS release +* [9f30e90](https://github.com/hyperledger/fabric-chaincode-node/commit/9f30e90) Use Official CouchDB 3.1 Image (#180) +* [eeca625](https://github.com/hyperledger/fabric-chaincode-node/commit/eeca625) [FABCN-420](https://jira.hyperledger.org/browse/FABCN-420) Remove Azure pipeline warnings (#177) +* [cc7fee7](https://github.com/hyperledger/fabric-chaincode-node/commit/cc7fee7) [FABCN-319](https://jira.hyperledger.org/browse/FABCN-319) Update dependnency versions (#176) +* [8966eed](https://github.com/hyperledger/fabric-chaincode-node/commit/8966eed) [FABCN-393](https://jira.hyperledger.org/browse/FABCN-393) Fix broken links in documents (#169) + +## v2.1.4 +Mon 22 Jun 2020 14:51:02 BST + +* [81e1123](https://github.com/hyperledger/fabric-chaincode-node/commit/81e1123) Specify exact version of winston dependency + +## v2.1.3 +Fri 19 Jun 15:26:50 BST 2020 + +* [cb4afae](https://github.com/hyperledger/fabric-chaincode-node/commit/cb4afae) [FABCN-410](https://jira.hyperledger.org/browse/FABCN-410) Use new lifecycle for fv/e2e tests (#160) +* [e02abf4](https://github.com/hyperledger/fabric-chaincode-node/commit/e02abf4) [FABCN-407](https://jira.hyperledger.org/browse/FABCN-407) Update protos (#154) (#157) +* [f4643f4](https://github.com/hyperledger/fabric-chaincode-node/commit/f4643f4) [FABCN-405](https://jira.hyperledger.org/browse/FABCN-405) Fix tutorial reference (#150) (#152) +* [c1979e3](https://github.com/hyperledger/fabric-chaincode-node/commit/c1979e3) Bump version to 2.1.3 (#149) + +## v2.1.2 +Mon 18 May 2020 17:06:23 BST + +* [3d3264d](https://github.com/hyperledger/fabric-chaincode-node/commit/3d3264d) Fix broken tutorials link (#137) (#138) +* [ac5b009](https://github.com/hyperledger/fabric-chaincode-node/commit/ac5b009) [FABCN-401](https://jira.hyperledger.org/browse/FABCN-401) Correct use of Yargs api (#145) +* [a81935a](https://github.com/hyperledger/fabric-chaincode-node/commit/a81935a) [FABCN-395](https://jira.hyperledger.org/browse/FABCN-395): Use @grpc/grpc-js for Node.js chaincode (#143) (#144) +* [8de8a6e](https://github.com/hyperledger/fabric-chaincode-node/commit/8de8a6e) [FABCN-396](https://jira.hyperledger.org/browse/FABCN-396) Add notes on minimum 1.4 module version for node 12 (#139) +* [00fab0a](https://github.com/hyperledger/fabric-chaincode-node/commit/00fab0a) [FABCN-397](https://jira.hyperledger.org/browse/FABCN-397) State queries limited to 100 results (#141) +* [b1f992d](https://github.com/hyperledger/fabric-chaincode-node/commit/b1f992d) Bump version (#134) + +## v2.1.1 +Wed 22 Apr 2020 10:31:05 BST + +* [3e67b8c](https://github.com/hyperledger/fabric-chaincode-node/commit/3e67b8c) [FABCN-394](https://jira.hyperledger.org/browse/FABCN-394) Update typescript interface file (#128) +* [61c253a](https://github.com/hyperledger/fabric-chaincode-node/commit/61c253a) [FABCN-391](https://jira.hyperledger.org/browse/FABCN-391) fix directory for api doc publish (#125) +* [c753261](https://github.com/hyperledger/fabric-chaincode-node/commit/c753261) [FABCN-391](https://jira.hyperledger.org/browse/FABCN-391) Bump to 2.1.1 and fix docker tag (#122) + +## v2.1.0 +Wed 1 Apr 2020 16:12:36 BST + +* [644213a](https://github.com/hyperledger/fabric-chaincode-node/commit/644213a) [FABCN-391](https://jira.hyperledger.org/browse/FABCN-391) Remove references to 2.0 and 2.0.0 - replace with 2.x +* [de8c29c](https://github.com/hyperledger/fabric-chaincode-node/commit/de8c29c) [FABCN-241](https://jira.hyperledger.org/browse/FABCN-241) Change to.be.ok test calls +* [a3ff93c](https://github.com/hyperledger/fabric-chaincode-node/commit/a3ff93c) Add readme to redirect to site +* [659d36d](https://github.com/hyperledger/fabric-chaincode-node/commit/659d36d) Improve build reliability +* [d62ecae](https://github.com/hyperledger/fabric-chaincode-node/commit/d62ecae) [FABCN-373](https://jira.hyperledger.org/browse/FABCN-373) Compatibility Matrix +* [c09385c](https://github.com/hyperledger/fabric-chaincode-node/commit/c09385c) [FABCN-391](https://jira.hyperledger.org/browse/FABCN-391) Use version 2.1 of fabric docker images +* [78f8cf8](https://github.com/hyperledger/fabric-chaincode-node/commit/78f8cf8) Expand node engine version range +* [c9e9e5b](https://github.com/hyperledger/fabric-chaincode-node/commit/c9e9e5b) Update audit level +* [dd51dfa](https://github.com/hyperledger/fabric-chaincode-node/commit/dd51dfa) [FABCN-381](https://jira.hyperledger.org/browse/FABCN-381) Access localmspid + +## v2.0.0 +Wed 22 Jan 2020 16:03:50 GMT + +* [6ef0042](https://github.com/hyperledger/fabric-chaincode-node/commit/6ef0042) [FABCI-482](https://jira.hyperledger.org/browse/FABCI-482) Update Nexus URL's to Artifactory +* [b296d0a](https://github.com/hyperledger/fabric-chaincode-node/commit/b296d0a) [FABCN-241](https://jira.hyperledger.org/browse/FABCN-241) - Remove to.be.ok (#55) +* [b345925](https://github.com/hyperledger/fabric-chaincode-node/commit/b345925) Update maintainers list +* [81eb5a9](https://github.com/hyperledger/fabric-chaincode-node/commit/81eb5a9) Update rush node.js version (#54) +* [084c595](https://github.com/hyperledger/fabric-chaincode-node/commit/084c595) [FABCN-355](https://jira.hyperledger.org/browse/FABCN-355) Added READMEs +* [6b60a98](https://github.com/hyperledger/fabric-chaincode-node/commit/6b60a98) [FABCN-353](https://jira.hyperledger.org/browse/FABCN-353) License updates (#50) + ## v2.0.0-beta Thu 12 Dec 11:46:40 GMT 2019 diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md new file mode 100644 index 00000000..dc18beec --- /dev/null +++ b/COMPATIBILITY.md @@ -0,0 +1,55 @@ +# Support and Compatibility for fabric-chaincode-node + +Github is used for code base management, issues should reported in the [FABCN](https://jira.hyperledger.org/projects/FABCN/issues/) component in JIRA. + + +## Summary of Compatibility + +This table shows the summary of the compatibility of the Node modules at versions 1.4 and 2.x, together with the Nodejs runtime they require and the Fabric Peer versions they can communicate with. + +| | Peer Connectivity v1.4 | NodeJS | Peer Connectivity v2.x | +| ----------------------- | ---------------------- | ------ | ---------------------- | +| Node modules **v1.4.5** | Yes | 8 | Yes | +| Node modules **v2.x.x** | Yes | 12 | Yes | + +By default a Fabric Peer v1.4 will create a Nodejs v8 runtime, and a Fabric Peer v2.x will create a Nodejs 12 runtime. Whilst this is the default, the docker image used to host the chaincode and contracts can be altered. Set the environment variable `CORE_CHAINCODE_NODE_RUNTIME` on the peer to the name of the docker image. + +For example `CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.1` will allow the use of the latest Node 12 runtime to be used within a Peer v1.4. + +The Node modules will connect to the peer whilst running; this is referred to as 'Fabric Peer Connectivity' in the table. For example, whilst the Fabric Peer v1.4 will create a Nodejs 8 runtime, if a Nodejs 12 runtime was configured, the node modules at v2.x still function when connecting to the Fabric Peer v1.4. + +Note that the `fabric-contract-api` & `fabric-shim` node modules must be at v1.4.5 or greater to work with Node version 12. If you therefore use a contract originally written to work with Fabric 1.4, check the node modules before deploying on Fabric v2. + +## Compatibility + +The key elements are :  + +- the version of the Fabric Contract Node modules used +- the version of the Nodejs runtime used to run the code +- When starting a chaincode container to run a Smart Contract, the version of the runtime that is used is determined by these factors: + +Fabric v1.4.2, and Fabric v2.x will, by default, start up docker image to host the chaincode and contracts. The version of the docker image used is defined by the version of Fabric in use. + +With Fabric v2.x, the chaincode container can be configured to be started by other means, and not the Peer. In this case, the environment used is not in the control of Fabric. + +Node modules that are produced are `fabric-contract-api`, `fabric-shim`, `fabric-shim-crypto` & `fabric-shim-api` + +### Supported Runtimes + +v2.x Node modules are supported running in Nodejs 12.16.1, with the x86_64 architecture. + +v1.4.x Node modules are supported running Nodejs 8.16.1 with the x86_64 architecture. + +Architecture Support: all docker images, runtimes, tools are tested under x86_64 ONLY + +### Default Peer Runtime selection + +When using Fabric 2.x, the default docker image that is used to run the Node chaincode is node:12.16.1-alpine  + +*Note:* With the default docker image used by Fabric 2.x, the packaged code will be installed with npm. If a `package-lock.json` or a `npm-shrinkwrap.json` file is present, `npm ci --only=production` will be used. Otherwise `npm install --production` will be used.  + +When using Fabric 1.4.4, the docker image that is used to run the Node chaincode is node v8.16.1. It is installed with npm install --production + +### Supported Runtime communication with the Peer + +Subject to a suitable runtime environment, the 1.4.4 Node modules and 2.x Node modules can be used to communicate with a Fabric 2.x or 1.4.4 Peer - with the level of functionality that is implied by the Fabric version in use.  \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfc25947..bee823d9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ The following [Rush categories](https://rushjs.io/pages/maintainer/add_to_repo/) ### Pre-requisites -* node v10.15.2 (npm v6.4.1) => recommend to use [nvm](https://github.com/nvm-sh/nvm) +* node v12.16.1 (npm v6.4.1) => recommend to use [nvm](https://github.com/nvm-sh/nvm) * rush => `npm install -g @microsoft/rush` > Note that npm v6 has some bugs that mean adding new dependencies etc are not properly picked up. Longer term we should consider moving to yarn or pnpm. However in practice this isn't a serious problem and has been possible to be worked around by issuing `rm ./common/config/rush/npm-shrinkwrap.json` and then `rush update` @@ -33,8 +33,9 @@ They also need to have the `nodeenv` image present - this is build as part of th ## Using the repo -* Clone the repo, and ensure you are using node v10, and have rush installed +* Clone the repo, and ensure you are using node v12, and have rush installed * `rush update` is needed to ensure everything is correctly linked and updated. +* `rush edge-docker` will pull down and tag the very latest docker images for the peers, orderes etc to test against At this point the repo is fully ready for use and running tests, etc. A full sequence of build-test that is equivalent to the CI pipeline is diff --git a/README.md b/README.md index 9589e348..57eda8db 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,38 @@ # Hyperledger Fabric - Node.js Contracts +[![Build Status](https://dev.azure.com/Hyperledger/Fabric-Chaincode-Node/_apis/build/status/Fabric-Chaincode-Node?branchName=master)](https://dev.azure.com/Hyperledger/Fabric-Chaincode-Node/_build/latest?definitionId=33&branchName=master) +[![fabric-contract-api npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-contract-api)](https://www.npmjs.com/package/fabric-contract-api) +[![fabric-shim npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-shim)](https://www.npmjs.com/package/fabric-shim) +[![fabric-shim-api npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-shim-api)](https://www.npmjs.com/package/fabric-shim-api) +[![fabric-shim-crypto npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-shim-crypto)](https://www.npmjs.com/package/fabric-shim-crypto) +[![Rocket.Chat](https://chat.hyperledger.org/images/join-chat.svg)](https://chat.hyperledger.org/channel/fabric-chaincode-dev) + This is the project to support the writing of Contracts with the node.js runtime. -As an application developer, to learn about how to implement **"Smart Contracts"** for Hyperledger Fabric using Node.js, please visit the [API documentation](https://fabric-shim.github.io/) - and follow the tutorial links. A [quick-start tutorial](TUTORIAL.md) is in this repo. +## Documentation + +As an application developer, to learn about how to implement **"Smart Contracts"** for Hyperledger Fabric using Node.js, please visit the [API documentation](https://hyperledger.github.io/fabric-chaincode-node/) and follow the tutorial links. -As a contributor looking to update this repo, please start with the [contributing guide](CONTRIBUTING.md) +- [API documentation](https://hyperledger.github.io/fabric-chaincode-node/) +- [Full Documenation on Hyperledger Fabric](https://hyperledger-fabric.readthedocs.io/) +- [Samples repository](https://github.com/hyperledger/fabric-samples) +- [Quick-start tutorial](TUTORIAL.md) -## Artifacts published from this repo +## Compatibility -- npm modules - - [fabric-chaincode-shim](https://www.npmjs.com/package/fabric-chaincode-shim) - - [fabric-contract-api](https://www.npmjs.com/package/fabric-contract-api) - - [fabric-shim-api](https://www.npmjs.com/package/fabric-shim-api) - - [fabric-shim-crypto](https://www.npmjs.com/package/fabric-shim-crypto) -- docker images - - [fabric-nodeenv](https://hub.docker.com/r/hyperledger/fabric-nodeenv) -- api documentation - - [API docs](https://fabric-shim.github.io/) +For details on what Nodejs runtime and versions of Hyperledger Fabric can be used please see the [compatibility document](COMPATIBILITY.md). -## Where to go from here? +## npm Shrinkwrap -- [API documentation](https://fabric-shim.github.io/) -- [Full Documenation on Hyperledger Fabric](https://hyperledger-fabric.readthedocs.io/en/release-1.4/) -- [Samples repository](https://github.com/hyperledger/fabric-samples) +In line with the advice from [npm on shrinkwrap](https://docs.npmjs.com/files/shrinkwrap.json#description) the modules published do not contain a `npm-shrinkwrap.json` file. + +It is **STRONGLY** recommended therefore that after testing, and before putting your contract into production a `npm-shrinkwrap.json` file is created. When the chaincode is install it will be via a `npm install --production` command. + +## Contributing + +If you are interested in contributing updates to this project, please start with the [contributing guide](CONTRIBUTING.md). + +There is also a [release guide](RELEASING.md) describing the process for publishing new versions. --- diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 00000000..8b3f8599 --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,51 @@ +# Releasing + +The following artifacts are created as a result of releasing Fabric Chaincode Node: + +- docker images + - [fabric-nodeenv](https://hub.docker.com/r/hyperledger/fabric-nodeenv) +- npm modules + - [fabric-contract-api](https://www.npmjs.com/package/fabric-contract-api) + - [fabric-shim](https://www.npmjs.com/package/fabric-shim) + - [fabric-shim-api](https://www.npmjs.com/package/fabric-shim-api) + - [fabric-shim-crypto](https://www.npmjs.com/package/fabric-shim-crypto) + +**Note:** A docker image with a matching V.R version is required before releasing a new version of Fabric. + +## Before releasing + +It's useful to create an issue to keep track of each release, for example [FABCN-377 Release v2.0.0 chaincode-node](https://jira.hyperledger.org/browse/FABCN-377). + +The following tasks are required before releasing: + +- Update version numbers in package.json files to the required version +- Update `tag` in package.json files to the required value, e.g. `beta`, or `latest` +- Update test, sample, and docs files to match the new version +- Create a new release notes file +- Update the `CHANGELOG.md` file + +The `changelog.sh` script in `tools/scripts` will prepopulate the changelog but you must check and edit the file manually afterwards as required + +The `tools/scripts/updateversions.sh` script will update the version in all the `package.json` files. Pass the new version as the first argument. + +```bash +./tools/scripts/updateversions.sh 2.4.1 +``` + +See the [Prepare 2.1.4 release](https://github.com/hyperledger/fabric-chaincode-node/pull/174) pull request for an example, although be careful to search for all versions in the codebase as they're easy to miss and things change! + +## Create release + +Creating a GitHub release on the [releases page](https://github.com/hyperledger/fabric-chaincode-node/releases) will trigger the build to publish the new release. + +When drafting the release, create a new tag for the new version (with a `v` prefix), e.g. `v2.1.4` + +See previous releases for examples of the title and description. + +## After releasing + +- Update version numbers in package.json files to the next version appended with a `-unstable` pre-release label. e.g. `1.2.3-unstable` +- Update `tag` in package.json files to `unstable` +- Update test, sample, and docs files to match the new version + +See the [Bump version to 2.1.5](https://github.com/hyperledger/fabric-chaincode-node/pull/175) pull request for an example. It should include almost all the files changed to prepare for the release, except for the release notes and changelog which do not need updating. diff --git a/TUTORIAL.md b/TUTORIAL.md index bf0ad6b7..a1aaa15d 100644 --- a/TUTORIAL.md +++ b/TUTORIAL.md @@ -1,4 +1,4 @@ -# Quick Start +# Quick Start Aim: to get a simple smart contract up and running @@ -8,15 +8,15 @@ Aim: to get a simple smart contract up and running An initial `package.json` is as follows; -The dependencies of `fabric-chaincode-api` and `fabric-shim` will be required. +The dependencies of `fabric-contract-api` and `fabric-shim` will be required. ``` { "name": "chaincode", "description": "My first exciting chaincode implemented in node.js", "engines": { - "node": ">=8.4.0", - "npm": ">=5.3.0" + "node": "^12.16.1", + "npm": "^6.13.4" }, "scripts": { "test":"mocha..... @@ -28,13 +28,13 @@ The dependencies of `fabric-chaincode-api` and `fabric-shim` will be required. "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-chaincode-api": "^1.4.0", - "fabric-shim": "^1.4.0" + "fabric-contract-api": "^2.2.4-unstable", + "fabric-shim": "^2.2.4-unstable" } } ``` -Remember to add in any additional business logic, and testing libraries needed +Remember to add in any additional business logic, and testing libraries needed Adding `fabric-shim` as a dependency, gives a command `fabric-chaincode-node` that is the script to run for `npm start`. @@ -65,7 +65,7 @@ Within the class you can defined as many or functions as you wish. These transac Node states that module exports are defined in `index.js` -In this example we have a single value that can be queried and updated. This has been split into to parts for demonstration purposes. +In this example we have a single value that can be queried and updated. This has been split into to parts for demonstration purposes. ``` // index.js @@ -77,7 +77,7 @@ const RemoveValues = require('./removevalues') module.exports.contracts = [UpdateValues,RemoveValues]; ``` -This exports two classes that together form the Contract. There can be other code that within the model that is used in a support role. +This exports two classes that together form the Contract. There can be other code that within the model that is used in a support role. *Note that the 'contracts' word is mandatory.* ### 4: What do these classes need to contain? @@ -124,7 +124,7 @@ Note that ALL the functions defined in these modules will be called by the clien - There are 3 functions `setup` `setNewAssetValue` and `doubleAssetValue` that can be called by issuing the appropriate invoke client side - The `ctx` in the function is a transaction context; each time a invoke is called this will be a new instance that can be used by the function implementation to access apis such as the world state of information on invoking identity. -- The arguments are split out from the array passed on the invoke. +- The arguments are split out from the array passed on the invoke. - The constructor contains a 'name' to help identify the sets of functions ## Running chaincode in development mode @@ -158,21 +158,21 @@ Will get things working... Then you can invoke the chaincode via this command. ``` -$ peer chaincode invoke --orderer localhost:7050 --channelID mychannel -c '{"Args":["UpdateValuesContract:getAssetValue"]}' -n mycontract4 +$ peer chaincode invoke --orderer localhost:7050 --channelID mychannel -c '{"Args":["UpdateValuesContract:getAssetValue"]}' -n mycontract4 ``` ## Additional support provided by the SmartContract class -In the case where you ask for a function to be executed, it could be the case that this doesn't exist. -You can provide you own function to be executed in this case, the default is to throw and error but you're able to customise this if you wish. +In the case where you ask for a function to be executed, it could be the case that this doesn't exist. +You can provide you own function to be executed in this case, the default is to throw and error but you're able to customise this if you wish. For example ``` - /** - * Sets a name so that the functions in this particular class can + /** + * Sets a name so that the functions in this particular class can * be separated from others. */ constructor() { @@ -180,7 +180,7 @@ For example } /** The function to invoke if something unkown comes in. - * + * */ async unknownTransaction(ctx){ throw new Error('a custom error message') @@ -199,15 +199,15 @@ For example ### Structure of the Transaction Context -In Fabric, there is a *stub* api that provides chaincode with functionality. +In Fabric, there is a *stub* api that provides chaincode with functionality. No functionality has been removed, but a new approach to providing abstractions on this to facilitate programming. *user additions*: additional properties can be added to the object to support for example common handling of the data serialization. -The context object contains +The context object contains - `ctx.stub` the same stub instance as in earlier versions for compatibility -- `ctx.identity` and instance of the Client Identity object +- `ctx.identity` and instance of the Client Identity object You are at liberty to create a subclass of the Context to provide additional functions, or per-transaction context storage. For example @@ -220,7 +220,7 @@ You are at liberty to create a subclass of the Context to provide additional fun } ``` -and the Context class itself is +and the Context class itself is ``` const { Context } = require('fabric-contract-api'); @@ -255,7 +255,7 @@ Definitions as per https://www.ietf.org/rfc/rfc2119.txt - as per node.js language standard - Duplicate function names in a single class is an error - Any function that is dynamically added will not be registered as an invokable function -- There are no specific function that is invoked per Fabric's *init* chaincode spi. The instantiate flow can pass function name and parameters; therefore consider +- There are no specific function that is invoked per Fabric's *init* chaincode spi. The instantiate flow can pass function name and parameters; therefore consider a dedicated function that will be called for new chaincode deployments, and for upgrade deployments. ## Restrictions on programming in side a Contract function @@ -263,9 +263,9 @@ a dedicated function that will be called for new chaincode deployments, and for Hyperledger Fabric's consensus algorithm permits the ability to use general purpose languages; rather than a more restrictive language. But the following restrictions apply - Functions should not create random variables, or use any function whose return values are functions of the current time or location of execution - - i.e. the function will be executed in another context (i.e. peer process). This could potentially be in a different time zone in a different locale. + - i.e. the function will be executed in another context (i.e. peer process). This could potentially be in a different time zone in a different locale. - Functions should be away that they may read state, and write state. But they are producing a set of changes that will be applied to the state. The implication is that updates to the state -may not be read back. +may not be read back. ``` let v1 = getState("key") @@ -276,9 +276,9 @@ let v2 = getState("key") v2=="world" // is false, v2 is "hello" ``` -In any subsequent invocation, the value would be seen to be updated. +In any subsequent invocation, the value would be seen to be updated. -Note that if you have use any Flux architecture implications such as Redux, the above restrictions will be familiar. +Note that if you have use any Flux architecture implications such as Redux, the above restrictions will be familiar. diff --git a/apis/fabric-contract-api/README.md b/apis/fabric-contract-api/README.md index cb9f2da2..218f9fd9 100644 --- a/apis/fabric-contract-api/README.md +++ b/apis/fabric-contract-api/README.md @@ -4,13 +4,13 @@ [![Version](https://badge.fury.io/js/fabric-shim.svg)](http://badge.fury.io/js/fabric-shim) -The `fabric-contract-api` provides the *contract interface* a high level API for application developers to implement [Smart Contracts](https://hyperledger-fabric.readthedocs.io/en/latest/glossary.html#smart-contract). Working with this API provides a high level entry point to writing business logic. +The `fabric-contract-api` provides the *contract interface* a high level API for application developers to implement [Smart Contracts](https://hyperledger-fabric.readthedocs.io/en/release-2.1/glossary.html#smart-contract). Working with this API provides a high level entry point to writing business logic. -Within Hyperledger Fabric, Smart Contracts can also be referred to as [Chaincode](https://hyperledger-fabric.readthedocs.io/en/latest/glossary.html#chaincode). To be more specific, the term chaincode is preferred to be used to refer to the overall container that is hosting the contracts. +Within Hyperledger Fabric, Smart Contracts can also be referred to as [Chaincode](https://hyperledger-fabric.readthedocs.io/en/release-2.1/glossary.html#chaincode). To be more specific, the term chaincode is preferred to be used to refer to the overall container that is hosting the contracts. The `fabric-shim` provides the *chaincode interface*, a lower level API for implementing "Smart Contracts". It also _currently_ provides the implementation to support communication with Hyperledger Fabric peers for Smart Contracts written using the `fabric-contract-api`. To confirm that this is the same as the `fabric-shim` in previous versions of Hyperledger Fabric. -Detailed explanation on the concept and programming model can be found here: [http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html](http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html). +Detailed explanation on the concept and programming model can be found here: [https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html](https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html). ## Contract Interface @@ -89,7 +89,7 @@ npm install --save fabric-shim ``` ### Usage -The [chaincode interface](https://fabric-shim.github.io/ChaincodeInterface.html) contains two methods to be implemented: +The [chaincode interface](https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/fabric-shim.ChaincodeInterface.html) contains two methods to be implemented: ```javascript const shim = require('fabric-shim'); @@ -124,12 +124,12 @@ shim.start(new Chaincode()); ``` ### API Reference -Visit [fabric-shim.github.io](https://fabric-shim.github.io/) and click on "Classes" link in the navigation bar on the top to view the list of class APIs. +Visit [API Reference](https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/) and click on "Classes" link in the navigation bar on the top to view the list of class APIs. ## Support -Tested with node.js 8.9, and also the v10 LTS release. +Tested with Node v12 LTS release. ## License diff --git a/apis/fabric-contract-api/lib/annotations/transaction.js b/apis/fabric-contract-api/lib/annotations/transaction.js index 019384ec..70dcb913 100644 --- a/apis/fabric-contract-api/lib/annotations/transaction.js +++ b/apis/fabric-contract-api/lib/annotations/transaction.js @@ -68,7 +68,10 @@ module.exports.Transaction = function Transaction (commit = true) { const tag = []; if (commit) { + tag.push('SUBMIT'); tag.push('submitTx'); + } else { + tag.push('EVALUATE'); } utils.appendOrUpdate(transactions, 'name', propertyKey, { diff --git a/apis/fabric-contract-api/lib/contract.js b/apis/fabric-contract-api/lib/contract.js index 77bc3fba..16b96c16 100644 --- a/apis/fabric-contract-api/lib/contract.js +++ b/apis/fabric-contract-api/lib/contract.js @@ -33,8 +33,6 @@ class Contract { } else { this.name = name.trim(); } - - logger.info('Creating new Contract', name); } /** diff --git a/apis/fabric-contract-api/package.json b/apis/fabric-contract-api/package.json index f4475a7d..c4d128b5 100644 --- a/apis/fabric-contract-api/package.json +++ b/apis/fabric-contract-api/package.json @@ -1,7 +1,7 @@ { "name": "fabric-contract-api", - "version": "2.0.0-beta.1", - "tag": "beta", + "version": "2.2.4-unstable", + "tag": "unstable", "description": "A node.js implementation of Hyperledger Fabric chaincode shim, to allow endorsing peers and user-provided chaincodes to communicate with each other", "main": "index.js", "repository": { @@ -10,7 +10,7 @@ }, "scripts": { "buildt": "tsc --project test/typescript", - "test": "nyc mocha --recursive 'test/unit/**/*.js'", + "test": "nyc mocha --recursive 'test/unit/**/*.js' 2>&1", "build": "npm run lint && npm run test:unit && npm run test:schema", "lint": "eslint ./lib/", "test:unit": "npm run test", @@ -22,7 +22,7 @@ "Fabric Shim" ], "engines": { - "node": "10.15.2", + "node": "^12.16.1", "npm": "^6.4.1" }, "license": "Apache-2.0", @@ -46,26 +46,26 @@ "lines": 100 }, "dependencies": { - "fabric-shim-api": "2.0.0-beta.1", - "class-transformer": "^0.2.2", - "fast-safe-stringify": "~2.0.7", + "fabric-shim-api": "2.2.4-unstable", + "class-transformer": "^0.3.1", + "fast-safe-stringify": "^2.0.7", "get-params": "^0.1.2", - "reflect-metadata": "^0.1.12", - "winston": "^3.2.1" + "reflect-metadata": "^0.1.13", + "winston": "^3.3.2" }, "devDependencies": { - "ajv": "^6.5.5", - "ajv-cli": "^3.0.0", + "ajv": "^6.12.2", + "ajv-cli": "^3.2.1", "chai": "^4.1.1", "chai-as-promised": "^7.1.1", "chai-things": "^0.2.0", "eslint": "6.6.0", - "gulp": "^4.0.0", + "gulp": "^4.0.2", "gulp-debug": "~4.0.0", "gulp-eslint": "~6.0.0", - "mocha": "6.2.2", - "nyc": "14.1.1", - "rewire": "4.0.1", + "mocha": "9.1.2", + "nyc": "15.1.0", + "rewire": "5.0.0", "sinon": "7.5.0", "typescript": "3.0.1" } diff --git a/apis/fabric-contract-api/schema/example-full.json b/apis/fabric-contract-api/schema/example-full.json index 4cd062fb..10092b7e 100644 --- a/apis/fabric-contract-api/schema/example-full.json +++ b/apis/fabric-contract-api/schema/example-full.json @@ -88,6 +88,7 @@ } ], "tag": [ + "SUBMIT", "submitTx" ] }, @@ -157,6 +158,7 @@ } ], "tag": [ + "SUBMIT", "submitTx" ] }, @@ -209,6 +211,7 @@ } ], "tag": [ + "SUBMIT", "submitTx" ] } diff --git a/apis/fabric-contract-api/schema/helloworld.json b/apis/fabric-contract-api/schema/helloworld.json index f7cc315e..bfd15ff7 100644 --- a/apis/fabric-contract-api/schema/helloworld.json +++ b/apis/fabric-contract-api/schema/helloworld.json @@ -8,6 +8,7 @@ "transactions": [ { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [], @@ -15,6 +16,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -30,6 +32,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -54,6 +57,7 @@ ], "name": "getGreeting", "tag": [ + "SUBMIT", "submitTx" ], "parameters": [] diff --git a/apis/fabric-contract-api/test/unit/annotations/transaction.js b/apis/fabric-contract-api/test/unit/annotations/transaction.js index 74cd0114..f6d3f358 100644 --- a/apis/fabric-contract-api/test/unit/annotations/transaction.js +++ b/apis/fabric-contract-api/test/unit/annotations/transaction.js @@ -75,7 +75,7 @@ describe('Transaction.js', () => { const getMetadataStub = sandbox.stub(Reflect, 'getMetadata').onFirstCall().returns([{ name: 'someTransaction', - tag: ['submitTx'] + tag: ['SUBMIT', 'submitTx'] }]).onSecondCall().returns([ MockContext, 'some type', @@ -100,10 +100,10 @@ describe('Transaction.js', () => { sinon.assert.calledOnce(defineMetadataStub); sinon.assert.calledWith(defineMetadataStub, 'fabric:transactions', [{ name: 'someTransaction', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], }, { name: 'mockKey', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [ { name: 'param1', @@ -122,7 +122,7 @@ describe('Transaction.js', () => { sandbox.stub(Reflect, 'getMetadata').onFirstCall().returns([{ name: 'someTransaction', - tag: ['submitTx'] + tag: ['SUBMIT', 'submitTx'] }]).onSecondCall().returns([ MockContext, 'Object' @@ -140,7 +140,7 @@ describe('Transaction.js', () => { it ('should handle existing transactions of which matches name and already has param metadata', () => { const transactions = [{ name: 'mockKey', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [{ name: 'param1', schema: 'some special schema', @@ -186,7 +186,7 @@ describe('Transaction.js', () => { sinon.assert.calledOnce(defineMetadataStub); sinon.assert.calledWith(defineMetadataStub, 'fabric:transactions', [{ name: 'mockKey', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [ { name: 'param1', @@ -226,7 +226,7 @@ describe('Transaction.js', () => { sinon.assert.calledOnce(defineMetadataStub); sinon.assert.calledWith(defineMetadataStub, 'fabric:transactions', [{ name: 'mockKey', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [] }], mockTarget); }); @@ -250,7 +250,7 @@ describe('Transaction.js', () => { sinon.assert.calledOnce(defineMetadataStub); sinon.assert.calledWith(defineMetadataStub, 'fabric:transactions', [{ name: 'mockKey', - tag: [], + tag: ["EVALUATE"], parameters: [] }], mockTarget); }); @@ -266,7 +266,7 @@ describe('Transaction.js', () => { it ('should handle existing transactions', () => { const getMetadataStub = sandbox.stub(Reflect, 'getMetadata').returns([{ name: 'someTransaction', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [] }]); @@ -280,7 +280,7 @@ describe('Transaction.js', () => { sinon.assert.calledOnce(defineMetadataStub); sinon.assert.calledWith(defineMetadataStub, 'fabric:transactions', [{ name: 'someTransaction', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [] }, { name: 'mockKey', diff --git a/apis/fabric-contract-api/test/unit/metadata.json b/apis/fabric-contract-api/test/unit/metadata.json index 9eaff633..5eb88936 100644 --- a/apis/fabric-contract-api/test/unit/metadata.json +++ b/apis/fabric-contract-api/test/unit/metadata.json @@ -1,5 +1,5 @@ { - "$schema": "https://fabric-shim.github.io/master/contract-schema.json", + "$schema": "https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json", "contracts": { "ShippingContract": { "name": "ShippingContract", @@ -10,6 +10,7 @@ "transactions": [ { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [], @@ -22,6 +23,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -37,6 +39,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -89,6 +92,7 @@ "transactions": [ { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [], @@ -101,6 +105,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -116,6 +121,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -168,6 +174,7 @@ "transactions": [ { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [], @@ -180,6 +187,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -195,6 +203,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -247,6 +256,7 @@ "transactions": [ { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [], @@ -259,6 +269,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -274,6 +285,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ diff --git a/apis/fabric-shim-api/README.md b/apis/fabric-shim-api/README.md index 31c1f978..e068762e 100644 --- a/apis/fabric-shim-api/README.md +++ b/apis/fabric-shim-api/README.md @@ -5,7 +5,7 @@ This `fabric-shim-api` library provides type definitions for the `fabric-shim` module. It is also a dependency of the `fabric-contract-api` As this is a pure interface module it allows the `fabric-contract-api` annotations to be used in client application without the need to pull in unneeded required dependencies. -Detailed explanation on the concepts and programming model can be found here: [http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html](http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html). +Detailed explanation on the concepts and programming model can be found here: [https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html](https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html). ## License diff --git a/apis/fabric-shim-api/package.json b/apis/fabric-shim-api/package.json index f642806c..b1d95ed0 100644 --- a/apis/fabric-shim-api/package.json +++ b/apis/fabric-shim-api/package.json @@ -1,7 +1,7 @@ { "name": "fabric-shim-api", - "version": "2.0.0-beta.1", - "tag": "beta", + "version": "2.2.4-unstable", + "tag": "unstable", "description": "A node.js API of Hyperledger Fabric chaincode shim, to allow endorsing peers and user-provided chaincodes to communicate with each other", "main": "index.js", "repository": { @@ -17,10 +17,13 @@ "Fabric Shim" ], "engines": { - "node": "10.15.2", + "node": "^12.16.1", "npm": "^6.4.1", "eslint": "6.6.0" }, "types": "./types/index.d.ts", - "license": "Apache-2.0" -} \ No newline at end of file + "license": "Apache-2.0", + "devDependencies": { + "@types/long": "^4.0.1" + } +} diff --git a/apis/fabric-shim-api/types/index.d.ts b/apis/fabric-shim-api/types/index.d.ts index d1d2fa7c..fac575ed 100644 --- a/apis/fabric-shim-api/types/index.d.ts +++ b/apis/fabric-shim-api/types/index.d.ts @@ -5,9 +5,10 @@ */ declare module 'fabric-shim-api' { + import Long = require("long"); interface Timestamp { - seconds: number; + seconds: Long; nanos: number; } @@ -54,10 +55,12 @@ declare module 'fabric-shim-api' { getTxID(): string; getChannelID(): string; getCreator(): SerializedIdentity; + getMspID(): string; getTransient(): Map; getSignedProposal(): ChaincodeProposal.SignedProposal; getTxTimestamp(): Timestamp; + getDateTimestamp(): Date; getBinding(): string; getState(key: string): Promise; diff --git a/ci/azure-pipelines.yml b/ci/azure-pipelines.yml index 1ac8aa79..7ca8c713 100644 --- a/ci/azure-pipelines.yml +++ b/ci/azure-pipelines.yml @@ -13,7 +13,7 @@ schedules: displayName: 'Chaincode Node Nightly Driver' branches: include: - - master + - release-2.2 always: true @@ -23,7 +23,7 @@ schedules: trigger: branches: include: - - 'master' + - 'release-2.2' tags: include: - '*' @@ -41,7 +41,11 @@ variables: - name: pipeline value: ci - name: node_version_spec - value: '12.x' + value: '12.22.6' + - name: rewire_node_version_spec # see https://github.com/jhnns/rewire/issues/178 + value: '12.22.6' + - name: FABRIC_VERSION + value: 2.2 # Build on Ubuntu pool: @@ -64,7 +68,7 @@ stages: steps: - task: NodeTool@0 inputs: - versionSpec: $(node_version_spec) + versionSpec: $(rewire_node_version_spec) - script: | set -ev node common/scripts/install-run-rush.js install @@ -73,7 +77,9 @@ stages: set -ev node common/scripts/install-run-rush.js rebuild displayName: 'Full rebuild' - + - script: | + npx cobertura-merge -o merged_coverage.xml shimcrypto=./libraries/fabric-shim-crypto/coverage/cobertura-coverage.xml shim=./libraries/fabric-shim/coverage/cobertura-coverage.xml contractapi=./apis/fabric-contract-api/coverage/cobertura-coverage.xml -p + condition: or(succeeded(), failed()) - task: PublishTestResults@2 condition: or(succeeded(), failed()) # publish either way inputs: @@ -84,33 +90,24 @@ stages: condition: or(succeeded(), failed()) # publish either way inputs: codeCoverageTool: 'cobertura' - summaryFileLocation: '**/cobertura-coverage.xml' + summaryFileLocation: 'merged_coverage.xml' artifactName: 'Unit Test Coverage' - # CopyFiles can follow symlinks hence be careful with node_modules - - task: CopyFiles@2 - condition: or(succeeded(), failed()) # publish either way - inputs: - contents: | - **/*.build*.log - !**/node_modules/** - targetFolder: $(Build.ArtifactStagingDirectory)/logs + - script: | + mkdir -p $(Build.ArtifactStagingDirectory)/logs + find . \( -type d -name 'node_modules' \) -prune -o -name '*.build*.log' -exec cp {} $(Build.ArtifactStagingDirectory)/logs \; + displayName: 'Copy build logs' - task: PublishBuildArtifacts@1 condition: or(succeeded(), failed()) # publish either way inputs: pathToPublish: $(Build.ArtifactStagingDirectory)/logs artifactName: 'Build logs' - - task: PublishBuildArtifacts@1 - condition: or(succeeded(), failed()) # publish either way - inputs: - pathToPublish: docs/apidocs/_out - artifactName: 'JS API Doc' + displayName: 'Publish build logs' # Copy the built artifacts to the staging directory, tgz, and the docker image - script: | set -ev node common/scripts/install-run-rush.js publish --include-all --pack --release-folder $(Build.ArtifactStagingDirectory)/tgz --publish docker image save hyperledger/fabric-nodeenv | gzip > $(Build.ArtifactStagingDirectory)/fabric-nodeenv.tar.gz - displayName: 'Package tgz and docker image' - task: PublishBuildArtifacts@1 inputs: pathToPublish: $(Build.ArtifactStagingDirectory)/tgz @@ -149,8 +146,8 @@ stages: node common/scripts/install-run-rush.js start-fabric node common/scripts/install-run-rush.js start-verdaccio # script will check for the ci variable and use built images docker images | grep hyperledger && docker ps -a - node common/scripts/install-run-rush.js test:fv - node common/scripts/install-run-rush.js test:e2e + node common/scripts/install-run-rush.js test:fv --verbose + node common/scripts/install-run-rush.js test:e2e --verbose displayName: 'FV Tests' - task: PublishTestResults@2 @@ -166,16 +163,18 @@ stages: **/*.build*.log !**/node_modules/** targetFolder: $(Build.ArtifactStagingDirectory)/testlogs + - script: | + mkdir -p $(Build.ArtifactStagingDirectory)/testlogs + find . \( -type d -name 'node_modules' \) -prune -o -name '*.build*.log' -exec cp {} $(Build.ArtifactStagingDirectory)/testlogs \; + condition: or(succeeded(), failed()) + displayName: 'Copy test logs' - task: PublishBuildArtifacts@1 condition: or(succeeded(), failed()) # publish either way inputs: pathToPublish: $(Build.ArtifactStagingDirectory)/testlogs artifactName: 'Test logs' - - task: PublishBuildArtifacts@1 - condition: or(succeeded(), failed()) # publish either way - inputs: - pathToPublish: tools/toolchain/network/docker-compose/logs/docker.log - artifactName: nodeenv-docker-image + displayName: 'Publish test logs' + # Job to handle the auditing of the code # NPM audit is run on a 'fake' installation of the libraries @@ -197,24 +196,75 @@ stages: node common/scripts/install-run-rush.js start-verdaccio # script will check for the ci variable and use built images mkdir -p $(Build.SourcesDirectory)/audit && cd $(Build.SourcesDirectory)/audit && npm init -y npm install --registry http://localhost:4873 fabric-shim fabric-shim-crypto fabric-shim-api fabric-contract-api --save - npm audit + npm audit --audit-level=moderate displayName: 'Run npm audit' - # Publish the snapshot images - - job: snapshot_publish + # Build and publish API docs on every merge build + - job: jsdoc + dependsOn: displayenv condition: and(succeeded(),eq(variables['Build.Reason'], 'IndividualCI')) - dependsOn: fvt + variables: + ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/master') }}: + jsdoc_release: master + ${{ if ne(variables['Build.SourceBranch'], 'refs/heads/master') }}: + jsdoc_release: $[format('release-{0}',dependencies.displayenv.outputs['BuildData.MINOR_PACKAGE_VERSION'])] steps: - - task: DownloadPipelineArtifact@2 + - task: NodeTool@0 inputs: - artifact: nodeenv-docker-image - path: $(Build.SourcesDirectory)/build - - script: ./ci/scripts/publish_docker.sh - env: - NEXUS_USERNAME: $(nexus-user) - NEXUS_PASSWORD: $(nexus-password) - NEXUS_URL: nexus3.hyperledger.org:10003/hyperledger - displayName: 'docker push to nexus' + versionSpec: $(node_version_spec) + - script: | + set -ev + node common/scripts/install-run-rush.js install + displayName: 'Setup the rush environment' + - script: | + set -ev + node common/scripts/install-run-rush.js rebuild --to fabric-shim-docs + displayName: 'Build JSDoc' + - task: CopyFiles@2 + inputs: + contents: | + gen/** + sourceFolder: '$(Build.SourcesDirectory)/docs' + targetFolder: $(Build.ArtifactStagingDirectory)/jsdoc + cleanTargetFolder: true + displayName: 'Copy JSDoc' + - task: CopyFiles@2 + condition: eq(variables['Build.SourceBranch'], 'refs/heads/master') + inputs: + contents: | + _config.yml + **/?(*.md|*.html) + !_jsdoc.json + !_jsdoc/** + !gen/** + !node_modules/** + sourceFolder: '$(Build.SourcesDirectory)/docs' + targetFolder: $(Build.ArtifactStagingDirectory)/gh-pages + cleanTargetFolder: true + displayName: 'Copy gh-pages doc (master branch only)' + - script: | + git reset --hard HEAD + git clean -xdf + git fetch origin + git checkout -b gh-pages origin/gh-pages + git clean -xdf + + mkdir -p $(jsdoc_release)/api + rm -rf $(jsdoc_release)/api/* + cp -r $(Build.ArtifactStagingDirectory)/jsdoc/gen/* $(jsdoc_release)/api + if [ -d $(Build.ArtifactStagingDirectory)/gh-pages ]; then + find . -maxdepth 1 ! \( -name [.]* -o -name 'gh-pages' -o -name 'master' -o -name 'release-*' \) -exec rm -rf {} \; + cp -r $(Build.ArtifactStagingDirectory)/gh-pages/* . + fi + displayName: 'Update gh-pages branch' + - script: | + git config --global user.email "hlfdev.azp@gmail.com" + git config --global user.name "Hyperledger Bot" + git add -A + git commit -m "Publishing GitHub Pages" + git push https://$(GITHUB-PAT)@github.com/hyperledger/fabric-chaincode-node.git gh-pages + displayName: 'Commit gh-pages changes' + continueOnError: true # Need to fix jsdoc publishing after release # Publish a new version, triggered by a git tag - stage: Publish_tag @@ -242,14 +292,8 @@ stages: workingFile: '$(Agent.TempDirectory)/.npmrc' customEndpoint: 'fabric-chainode-node-npm' - script: | - find $(Pipeline.Workspace)/node-tgz/ -maxdepth 1 -type f -name 'fabric-*.tgz' -exec npm publish {} --tag beta \; + find $(Pipeline.Workspace)/node-tgz/ -maxdepth 1 -type f -name 'fabric-*.tgz' -exec npm publish {} --tag latest \; displayName: 'npm publish' - - job: jsdoc_publish - steps: - - script: | - set -ev - echo "checkout docs branch" - echo "checking" - job: dockerhub_publish steps: - template: templates/build-data.yaml @@ -257,22 +301,23 @@ stages: inputs: artifact: nodeenv-docker-image path: $(Build.SourcesDirectory)/build - + - script: | wget -qO "$PWD/manifest-tool" https://github.com/estesp/manifest-tool/releases/download/v1.0.0/manifest-tool-linux-amd64 chmod +x ./manifest-tool docker image load --input build/fabric-nodeenv.tar.gz docker images - # Publish docker images to nexus repository docker login ${DOCKER_REGISTRY_URL} --username=${DOCKER_REGISTRY_USERNAME} --password=${DOCKER_REGISTRY_PASSWORD} echo "Logged in to docker registry" # tag nodeenv image to PACKAGE_VERSION - docker tag hyperledger/fabric-nodeenv fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION)-beta + docker tag hyperledger/fabric-nodeenv hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION) # push nodeenv to repository - docker push hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION)-beta - ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION)-beta" --target "hyperledger/fabric-nodeenv:$(BuildData.PACKAGE_VERSION)-beta" - ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION)-beta" --target "hyperledger/fabric-nodeenv:2.0" + docker push hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION) + # publish patch version (3-digit) image + ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION)" --target "hyperledger/fabric-nodeenv:$(BuildData.PACKAGE_VERSION)" + # publish minor version (2-digit) image + ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-nodeenv:amd64-$(BuildData.PACKAGE_VERSION)" --target "hyperledger/fabric-nodeenv:$(BuildData.MINOR_PACKAGE_VERSION)" env: DOCKER_REGISTRY_USERNAME: $(DockerHub-Username) - DOCKER_REGISTRY_PASSWORD: $(DockerHub-Password) \ No newline at end of file + DOCKER_REGISTRY_PASSWORD: $(DockerHub-Password) diff --git a/ci/scripts/publish_docker.sh b/ci/scripts/publish_docker.sh deleted file mode 100755 index 5e5c2cb4..00000000 --- a/ci/scripts/publish_docker.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -set -euo pipefail - -docker image load --input build/fabric-nodeenv.tar.gz # gets the build image of nodeenv -docker images - -docker login nexus3.hyperledger.org:10003 --username="${NEXUS_USERNAME}" --password="${NEXUS_PASSWORD}" -docker tag hyperledger/fabric-nodeenv "${NEXUS_URL}/fabric-nodeenv:amd64-2.0.0-beta" -docker push "${NEXUS_URL}/fabric-nodeenv:amd64-2.0.0-beta" diff --git a/ci/templates/build-data.yaml b/ci/templates/build-data.yaml index 3cd79236..ceac4aeb 100644 --- a/ci/templates/build-data.yaml +++ b/ci/templates/build-data.yaml @@ -1,8 +1,16 @@ steps: - script: | + #!/bin/bash + set -ex -o pipefail + env | sort - VERSION=$(jq '.version' $(Build.SourcesDirectory)/package.json | sed -r "s/\"([0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]?[0-9]).*/\1/") + # handle full version number + VERSION=$(jq '.version' $(Build.SourcesDirectory)/docker/fabric-nodeenv/package.json | sed -r "s/\"([0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]?[0-9]).*/\1/") echo Current version in code is :${VERSION}: echo "##vso[task.setvariable variable=PACKAGE_VERSION;isOutput=true]${VERSION}" + # handle minor version + MINOR_VERSION=$(jq '.version' $(Build.SourcesDirectory)/docker/fabric-nodeenv/package.json | sed -r "s/\"([0-9]?[0-9]\.[0-9]?[0-9])\.[0-9]?[0-9].*/\1/") + echo Current minor version in code is :${MINOR_VERSION}: + echo "##vso[task.setvariable variable=MINOR_PACKAGE_VERSION;isOutput=true]${MINOR_VERSION}" name: BuildData displayName: 'Build data' \ No newline at end of file diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json index 5f447fb9..9df2b5a3 100644 --- a/common/config/rush/command-line.json +++ b/common/config/rush/command-line.json @@ -25,7 +25,7 @@ "description": "Runs the Scenario e2e tests.", "enableParallelism": true, "ignoreMissingScript": true - }, + }, { "commandKind": "global", "name": "update-protos", @@ -60,14 +60,14 @@ "name": "start-fabric", "summary": "Starts local Fabric test network ", "description": "Run this command to start local Fabric network for testing", - "shellCommand": "gulp -f ./tools/toolchain/fabric.js" + "shellCommand": "rm -rf ./fabric-samples && curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.4.6 1.5.5 && cd ./fabric-samples/test-network && ./network.sh down && ./network.sh up createChannel -ca -s couchdb && cd -" }, { "commandKind": "global", "name": "stop-fabric", "summary": "Starts local Fabric test network ", "description": "Run this command to stop local Fabric network created for testing", - "shellCommand": "gulp -f ./tools/toolchain/fabric.js stopFabric" + "shellCommand": "cd ./fabric-samples/test-network && ./network.sh down && cd -" }, { "commandKind": "global", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index f3dbec8c..3438c037 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1,234 +1,449 @@ +lockfileVersion: 5.3 + +specifiers: + '@fidm/x509': ^1.2.1 + '@grpc/grpc-js': ^1.1.1 + '@grpc/proto-loader': ^0.5.4 + '@rush-temp/fabric-contract-api': file:./projects/fabric-contract-api.tgz + '@rush-temp/fabric-e2e-tests': file:./projects/fabric-e2e-tests.tgz + '@rush-temp/fabric-nodeenv': file:./projects/fabric-nodeenv.tgz + '@rush-temp/fabric-shim': file:./projects/fabric-shim.tgz + '@rush-temp/fabric-shim-api': file:./projects/fabric-shim-api.tgz + '@rush-temp/fabric-shim-crypto': file:./projects/fabric-shim-crypto.tgz + '@rush-temp/fabric-shim-docs': file:./projects/fabric-shim-docs.tgz + '@rush-temp/fvtests': file:./projects/fvtests.tgz + '@rush-temp/toolchain': file:./projects/toolchain.tgz + '@sinonjs/referee-sinon': ~5.0.0 + '@types/long': ^4.0.1 + '@types/node': ^14.0.13 + chai: ^4.1.1 + chai-as-promised: ^7.1.1 + chai-things: ^0.2.0 + class-transformer: ^0.3.1 + cpx: ^1.5.0 + del: ^3.0.0 + delay: 4.3.0 + elliptic: ^6.5.3 + eslint: 6.6.0 + fast-safe-stringify: ^2.0.7 + fs-extra: ^9.0.1 + get-params: ^0.1.2 + git-rev-sync: 1.12.0 + gulp-cli: 2.3.0 + gulp-debug: ~4.0.0 + gulp-eslint: ~6.0.0 + gulp-rename: ~1.4.0 + gulp-shell: ~0.7.1 + ink-docstrap: ^1.3.2 + istanbul-api: ^1.1.13 + jsdoc: ^3.6.3 + jsrsasign: ^10.2 + jsverify: ~0.8.4 + merge-stream: ~2.0.0 + mockery: ^2.1.0 + npm-cli-login: ~0.1.1 + reflect-metadata: ^0.1.13 + rimraf: ^3.0.0 + sinon-test: ^2.2.0 + spec-junit-splitter-mocha-reporter: 1.0.1 + typescript: 3.0.1 + winston: ^3.3.2 + yargs: ^15.3.1 + yargs-parser: ^18.1.3 + dependencies: '@fidm/x509': 1.2.1 - '@grpc/proto-loader': 0.5.3 - '@rush-temp/apidocs': 'file:projects/apidocs.tgz' - '@rush-temp/azure-mocha-reporter': 'file:projects/azure-mocha-reporter.tgz' - '@rush-temp/fabric-contract-api': 'file:projects/fabric-contract-api.tgz' - '@rush-temp/fabric-e2e-tests': 'file:projects/fabric-e2e-tests.tgz' - '@rush-temp/fabric-nodeenv': 'file:projects/fabric-nodeenv.tgz' - '@rush-temp/fabric-shim': 'file:projects/fabric-shim.tgz' - '@rush-temp/fabric-shim-api': 'file:projects/fabric-shim-api.tgz' - '@rush-temp/fabric-shim-crypto': 'file:projects/fabric-shim-crypto.tgz' - '@rush-temp/fvtests': 'file:projects/fvtests.tgz' - '@rush-temp/toolchain': 'file:projects/toolchain.tgz' + '@grpc/grpc-js': 1.3.7 + '@grpc/proto-loader': 0.5.6 + '@rush-temp/fabric-contract-api': file:projects/fabric-contract-api.tgz + '@rush-temp/fabric-e2e-tests': file:projects/fabric-e2e-tests.tgz + '@rush-temp/fabric-nodeenv': file:projects/fabric-nodeenv.tgz + '@rush-temp/fabric-shim': file:projects/fabric-shim.tgz + '@rush-temp/fabric-shim-api': file:projects/fabric-shim-api.tgz + '@rush-temp/fabric-shim-crypto': file:projects/fabric-shim-crypto.tgz + '@rush-temp/fabric-shim-docs': file:projects/fabric-shim-docs.tgz + '@rush-temp/fvtests': file:projects/fvtests.tgz + '@rush-temp/toolchain': file:projects/toolchain.tgz '@sinonjs/referee-sinon': 5.0.0 - '@types/node': 8.10.59 - ajv: 6.10.2 - ajv-cli: 3.0.0 - chai: 4.2.0 - chai-as-promised: 7.1.1_chai@4.2.0 + '@types/long': 4.0.1 + '@types/node': 14.17.21 + chai: 4.3.4 + chai-as-promised: 7.1.1_chai@4.3.4 chai-things: 0.2.0 - class-transformer: 0.2.3 + class-transformer: 0.3.1 cpx: 1.5.0 del: 3.0.0 delay: 4.3.0 - elliptic: 6.5.2 + elliptic: 6.5.4 eslint: 6.6.0 - fast-safe-stringify: 2.0.7 - fs-extra: 8.1.0 + fast-safe-stringify: 2.1.1 + fs-extra: 9.1.0 get-params: 0.1.2 git-rev-sync: 1.12.0 - grpc: 1.24.2 - gulp: 4.0.2 - gulp-debug: 4.0.0_gulp@4.0.2 + gulp-cli: 2.3.0 + gulp-debug: 4.0.0 gulp-eslint: 6.0.0 - gulp-jsdoc3: 2.0.0 gulp-rename: 1.4.0 - gulp-replace: 0.6.1 gulp-shell: 0.7.1 - ip: 1.1.5 + ink-docstrap: 1.3.2 istanbul-api: 1.3.7 - jsrsasign: 8.0.12 + jsdoc: 3.6.7 + jsrsasign: 10.4.1 jsverify: 0.8.4 merge-stream: 2.0.0 - mocha: 6.2.2 - mocha-junit-reporter: 1.23.1_mocha@6.2.2 mockery: 2.1.0 npm-cli-login: 0.1.1 - nyc: 14.1.1 reflect-metadata: 0.1.13 - rewire: 4.0.1 - rimraf: 3.0.0 - sinon: 7.5.0 - sinon-test: 2.4.0_sinon@7.5.0 + rimraf: 3.0.2 + sinon-test: 2.4.3 + spec-junit-splitter-mocha-reporter: 1.0.1 typescript: 3.0.1 - winston: 3.2.1 - yargs: 13.3.0 - yargs-parser: 13.1.1 -lockfileVersion: 5.1 + winston: 3.3.3 + yargs: 15.4.1 + yargs-parser: 18.1.3 + packages: - /@babel/code-frame/7.5.5: - dependencies: - '@babel/highlight': 7.5.0 + + /@babel/code-frame/7.15.8: + resolution: {integrity: sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.14.5 + dev: false + + /@babel/compat-data/7.15.0: + resolution: {integrity: sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core/7.15.8: + resolution: {integrity: sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.15.8 + '@babel/generator': 7.15.8 + '@babel/helper-compilation-targets': 7.15.4_@babel+core@7.15.8 + '@babel/helper-module-transforms': 7.15.8 + '@babel/helpers': 7.15.4 + '@babel/parser': 7.15.8 + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 + convert-source-map: 1.8.0 + debug: 4.3.2 + gensync: 1.0.0-beta.2 + json5: 2.2.0 + semver: 6.3.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color dev: false - resolution: - integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - /@babel/generator/7.7.4: + + /@babel/generator/7.15.8: + resolution: {integrity: sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.7.4 + '@babel/types': 7.15.6 jsesc: 2.5.2 - lodash: 4.17.15 source-map: 0.5.7 dev: false - resolution: - integrity: sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== - /@babel/helper-function-name/7.7.4: - dependencies: - '@babel/helper-get-function-arity': 7.7.4 - '@babel/template': 7.7.4 - '@babel/types': 7.7.4 - dev: false - resolution: - integrity: sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== - /@babel/helper-get-function-arity/7.7.4: - dependencies: - '@babel/types': 7.7.4 - dev: false - resolution: - integrity: sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== - /@babel/helper-split-export-declaration/7.7.4: + + /@babel/helper-compilation-targets/7.15.4_@babel+core@7.15.8: + resolution: {integrity: sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.7.4 + '@babel/compat-data': 7.15.0 + '@babel/core': 7.15.8 + '@babel/helper-validator-option': 7.14.5 + browserslist: 4.17.3 + semver: 6.3.0 dev: false - resolution: - integrity: sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== - /@babel/highlight/7.5.0: - dependencies: + + /@babel/helper-function-name/7.15.4: + resolution: {integrity: sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-get-function-arity': 7.15.4 + '@babel/template': 7.15.4 + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-get-function-arity/7.15.4: + resolution: {integrity: sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-hoist-variables/7.15.4: + resolution: {integrity: sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-member-expression-to-functions/7.15.4: + resolution: {integrity: sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-module-imports/7.15.4: + resolution: {integrity: sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-module-transforms/7.15.8: + resolution: {integrity: sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-module-imports': 7.15.4 + '@babel/helper-replace-supers': 7.15.4 + '@babel/helper-simple-access': 7.15.4 + '@babel/helper-split-export-declaration': 7.15.4 + '@babel/helper-validator-identifier': 7.15.7 + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-optimise-call-expression/7.15.4: + resolution: {integrity: sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-replace-supers/7.15.4: + resolution: {integrity: sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-member-expression-to-functions': 7.15.4 + '@babel/helper-optimise-call-expression': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-simple-access/7.15.4: + resolution: {integrity: sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-split-export-declaration/7.15.4: + resolution: {integrity: sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.15.6 + dev: false + + /@babel/helper-validator-identifier/7.15.7: + resolution: {integrity: sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option/7.14.5: + resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers/7.15.4: + resolution: {integrity: sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/highlight/7.14.5: + resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.15.7 chalk: 2.4.2 - esutils: 2.0.3 js-tokens: 4.0.0 dev: false - resolution: - integrity: sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - /@babel/parser/7.7.4: - dev: false - engines: - node: '>=6.0.0' + + /@babel/parser/7.15.8: + resolution: {integrity: sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==} + engines: {node: '>=6.0.0'} hasBin: true - resolution: - integrity: sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== - /@babel/template/7.7.4: - dependencies: - '@babel/code-frame': 7.5.5 - '@babel/parser': 7.7.4 - '@babel/types': 7.7.4 - dev: false - resolution: - integrity: sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== - /@babel/traverse/7.7.4: - dependencies: - '@babel/code-frame': 7.5.5 - '@babel/generator': 7.7.4 - '@babel/helper-function-name': 7.7.4 - '@babel/helper-split-export-declaration': 7.7.4 - '@babel/parser': 7.7.4 - '@babel/types': 7.7.4 - debug: 4.1.1 + dev: false + + /@babel/template/7.15.4: + resolution: {integrity: sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.15.8 + '@babel/parser': 7.15.8 + '@babel/types': 7.15.6 + dev: false + + /@babel/traverse/7.15.4: + resolution: {integrity: sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.15.8 + '@babel/generator': 7.15.8 + '@babel/helper-function-name': 7.15.4 + '@babel/helper-hoist-variables': 7.15.4 + '@babel/helper-split-export-declaration': 7.15.4 + '@babel/parser': 7.15.8 + '@babel/types': 7.15.6 + debug: 4.3.2 globals: 11.12.0 - lodash: 4.17.15 + transitivePeerDependencies: + - supports-color dev: false - resolution: - integrity: sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== - /@babel/types/7.7.4: + + /@babel/types/7.15.6: + resolution: {integrity: sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==} + engines: {node: '>=6.9.0'} dependencies: - esutils: 2.0.3 - lodash: 4.17.15 + '@babel/helper-validator-identifier': 7.15.7 to-fast-properties: 2.0.0 dev: false - resolution: - integrity: sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + + /@dabh/diagnostics/2.0.2: + resolution: {integrity: sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==} + dependencies: + colorspace: 1.1.2 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + /@fidm/asn1/1.0.4: + resolution: {integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==} + engines: {node: '>= 8'} dev: false - engines: - node: '>= 8' - resolution: - integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ== + /@fidm/x509/1.2.1: + resolution: {integrity: sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==} + engines: {node: '>= 8'} dependencies: '@fidm/asn1': 1.0.4 - tweetnacl: 1.0.1 + tweetnacl: 1.0.3 + dev: false + + /@grpc/grpc-js/1.3.7: + resolution: {integrity: sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@types/node': 14.17.21 dev: false - engines: - node: '>= 8' - resolution: - integrity: sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w== - /@grpc/proto-loader/0.5.3: + + /@grpc/proto-loader/0.5.6: + resolution: {integrity: sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==} + engines: {node: '>=6'} dependencies: lodash.camelcase: 4.3.0 - protobufjs: 6.8.8 + protobufjs: 6.11.2 + dev: false + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-8qvUtGg77G2ZT2HqdqYoM/OY97gQd/0crSG34xNmZ4ZOsv3aQT/FQV9QfZPazTGna6MIoyUd+u6AxsoZjJ/VMQ== + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: false + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha1-m4sMxmPWaafY9vXQiToU00jzD78=} dev: false - resolution: - integrity: sha1-m4sMxmPWaafY9vXQiToU00jzD78= + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - resolution: - integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - resolution: - integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha1-NVy8mLr61ZePntCV85diHx0Ga3A=} dev: false - resolution: - integrity: sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - resolution: - integrity: sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + /@protobufjs/float/1.0.2: + resolution: {integrity: sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=} dev: false - resolution: - integrity: sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=} dev: false - resolution: - integrity: sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + /@protobufjs/path/1.1.2: + resolution: {integrity: sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=} dev: false - resolution: - integrity: sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=} dev: false - resolution: - integrity: sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=} dev: false - resolution: - integrity: sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= - /@sinonjs/commons/1.6.0: + + /@sinonjs/commons/1.8.3: + resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: type-detect: 4.0.8 dev: false - resolution: - integrity: sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== + + /@sinonjs/fake-timers/7.1.2: + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} + dependencies: + '@sinonjs/commons': 1.8.3 + dev: false + /@sinonjs/formatio/3.2.2: + resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} dependencies: - '@sinonjs/commons': 1.6.0 + '@sinonjs/commons': 1.8.3 '@sinonjs/samsam': 3.3.3 dev: false - resolution: - integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== + /@sinonjs/referee-sinon/5.0.0: + resolution: {integrity: sha512-n/TZslEabxCQLId5fT0ZFPDWL0U6JRf7eim3dfnRVShLkyhQk69cTTWswT5aUZxS4Fayk1fn9+x2OhP1Nz2vyA==} dependencies: - '@sinonjs/commons': 1.6.0 + '@sinonjs/commons': 1.8.3 '@sinonjs/formatio': 3.2.2 '@sinonjs/referee': 3.2.0 sinon: 7.5.0 dev: false - resolution: - integrity: sha512-n/TZslEabxCQLId5fT0ZFPDWL0U6JRf7eim3dfnRVShLkyhQk69cTTWswT5aUZxS4Fayk1fn9+x2OhP1Nz2vyA== + /@sinonjs/referee/3.2.0: + resolution: {integrity: sha512-t+sDpTvUmqgYWkPwTuO4gEivScbEKbF6eqFB9Cv70PqcyJla3w7Mj0JQyXn18uCDR2bIZglD4NNGeWGg8YfaGw==} dependencies: - '@sinonjs/commons': 1.6.0 + '@sinonjs/commons': 1.8.3 '@sinonjs/formatio': 3.2.2 '@sinonjs/samsam': 3.3.3 array-from: 2.1.1 @@ -237,673 +452,508 @@ packages: lodash.isarguments: 3.1.0 object-assign: 4.1.1 dev: false - resolution: - integrity: sha512-t+sDpTvUmqgYWkPwTuO4gEivScbEKbF6eqFB9Cv70PqcyJla3w7Mj0JQyXn18uCDR2bIZglD4NNGeWGg8YfaGw== + /@sinonjs/samsam/3.3.3: + resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} dependencies: - '@sinonjs/commons': 1.6.0 + '@sinonjs/commons': 1.8.3 array-from: 2.1.1 - lodash: 4.17.15 - dev: false - resolution: - integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== - /@sinonjs/text-encoding/0.7.1: - dev: false - resolution: - integrity: sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - /@snyk/cli-interface/1.5.0: - dependencies: - tslib: 1.10.0 - dev: false - resolution: - integrity: sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg== - /@snyk/cli-interface/2.2.0: - dependencies: - tslib: 1.9.3 - dev: false - resolution: - integrity: sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg== - /@snyk/cli-interface/2.3.0: - dependencies: - tslib: 1.10.0 - dev: false - resolution: - integrity: sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ== - /@snyk/cocoapods-lockfile-parser/3.0.0: - dependencies: - '@snyk/dep-graph': 1.13.1 - '@snyk/ruby-semver': 2.0.4 - '@types/js-yaml': 3.12.1 - core-js: 3.4.4 - js-yaml: 3.13.1 - source-map-support: 0.5.16 - tslib: 1.10.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-AebCc+v9vtOL9tFkU4/tommgVsXxqdx6t45kCkBW+FC4PaYvfYEg9Eg/9GqlY9+nFrLFo/uTr+E/aR0AF/KqYA== - /@snyk/composer-lockfile-parser/1.2.0: - dependencies: - lodash: 4.17.15 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-kZT+HTqgNcQMeoE5NM9M3jj463M8zI7ZxqZXLw9WoyVs5JTt9g0qFWxIG1cNwZdGVI+y7tzZbNWw9BlMD1vCCQ== - /@snyk/dep-graph/1.13.1: - dependencies: - graphlib: 2.1.7 - lodash: 4.17.15 - object-hash: 1.3.1 - semver: 6.3.0 - source-map-support: 0.5.16 - tslib: 1.10.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-Ww2xvm5UQgrq9eV0SdTBCh+w/4oI2rCx5vn1IOSeypaR0CO4p+do1vm3IDZ2ugg4jLSfHP8+LiD6ORESZMkQ2w== - /@snyk/gemfile/1.2.0: - dev: false - engines: - node: '>= 4.2.4' - resolution: - integrity: sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA== - /@snyk/ruby-semver/2.0.4: - dependencies: - lodash: 4.17.15 + lodash: 4.17.21 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-ceMD4CBS3qtAg+O0BUvkKdsheUNCqi+/+Rju243Ul8PsUgZnXmGiqfk/2z7DCprRQnxUTra4+IyeDQT7wAheCQ== - /@snyk/snyk-cocoapods-plugin/2.0.1: + + /@sinonjs/samsam/6.0.2: + resolution: {integrity: sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==} dependencies: - '@snyk/cli-interface': 1.5.0 - '@snyk/cocoapods-lockfile-parser': 3.0.0 - '@snyk/dep-graph': 1.13.1 - source-map-support: 0.5.16 - tslib: 1.10.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-XVkvaMvMzQ3miJi/YZmsRJSAUfDloYhfg6pXPgzAeAugB4p+cNi01Z68pT62ypB8U/Ugh1Xx2pb9aoOFqBbSjA== - /@types/agent-base/4.2.0: - dependencies: - '@types/events': 3.0.0 - '@types/node': 8.10.59 - dev: false - resolution: - integrity: sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q== - /@types/bunyan/1.8.6: - dependencies: - '@types/node': 8.10.59 - dev: false - resolution: - integrity: sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ== - /@types/bytebuffer/5.0.40: - dependencies: - '@types/long': 4.0.0 - '@types/node': 8.10.59 - dev: false - resolution: - integrity: sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g== - /@types/debug/4.1.5: - dev: false - resolution: - integrity: sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== - /@types/events/3.0.0: - dev: false - resolution: - integrity: sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - /@types/js-yaml/3.12.1: - dev: false - resolution: - integrity: sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== - /@types/long/4.0.0: - dev: false - resolution: - integrity: sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== - /@types/node/10.17.6: - dev: false - resolution: - integrity: sha512-0a2X6cgN3RdPBL2MIlR6Lt0KlM7fOFsutuXcdglcOq6WvLnYXgPQSh0Mx6tO1KCAE8MxbHSOSTWDoUxRq+l3DA== - /@types/node/6.14.9: - dev: false - resolution: - integrity: sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w== - /@types/node/8.10.59: + '@sinonjs/commons': 1.8.3 + lodash.get: 4.4.2 + type-detect: 4.0.8 dev: false - resolution: - integrity: sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ== - /@types/restify/4.3.6: - dependencies: - '@types/bunyan': 1.8.6 - '@types/node': 8.10.59 + + /@sinonjs/text-encoding/0.7.1: + resolution: {integrity: sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==} dev: false - resolution: - integrity: sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA== - /@types/semver/5.5.0: + + /@types/long/4.0.1: + resolution: {integrity: sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==} dev: false - resolution: - integrity: sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== - /@types/xml2js/0.4.3: - dependencies: - '@types/events': 3.0.0 - '@types/node': 8.10.59 + + /@types/node/14.17.21: + resolution: {integrity: sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA==} dev: false - resolution: - integrity: sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g== - /@yarnpkg/lockfile/1.1.0: + + /@ungap/promise-all-settled/1.1.2: + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} dev: false - resolution: - integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false - resolution: - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /acorn-jsx/3.0.1: + resolution: {integrity: sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=} dependencies: acorn: 3.3.0 dev: false - resolution: - integrity: sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - /acorn-jsx/5.1.0_acorn@7.1.0: + + /acorn-jsx/5.3.2_acorn@7.4.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 7.1.0 + acorn: 7.4.1 dev: false - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 - resolution: - integrity: sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + /acorn/3.3.0: - dev: false - engines: - node: '>=0.4.0' + resolution: {integrity: sha1-ReN/s56No/JbruP/U2niu18iAXo=} + engines: {node: '>=0.4.0'} hasBin: true - resolution: - integrity: sha1-ReN/s56No/JbruP/U2niu18iAXo= - /acorn/5.7.3: dev: false - engines: - node: '>=0.4.0' + + /acorn/5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} hasBin: true - resolution: - integrity: sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - /acorn/7.1.0: dev: false - engines: - node: '>=0.4.0' + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} hasBin: true - resolution: - integrity: sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - /agent-base/4.2.1: - dependencies: - es6-promisify: 5.0.0 dev: false - engines: - node: '>= 4.0.0' - resolution: - integrity: sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - /agent-base/4.3.0: + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} dependencies: - es6-promisify: 5.0.0 + clean-stack: 2.2.0 + indent-string: 4.0.0 dev: false - engines: - node: '>= 4.0.0' - resolution: - integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - /ajv-cli/3.0.0: + + /ajv-cli/3.3.0: + resolution: {integrity: sha512-4eiNNjDlainn5Rm+rU3egxLUUxzevcB+gviBLs9sm6etHNrE7l2JSQ3yoz5hE+eqrth3pTygELOafhSIO8Hiig==} + hasBin: true dependencies: - ajv: 6.10.2 + ajv: 6.12.6 ajv-pack: 0.3.1 - fast-json-patch: 0.5.7 - glob: 7.1.6 + fast-json-patch: 2.2.1 + glob: 7.2.0 + js-yaml: 3.14.1 json-schema-migrate: 0.2.0 - minimist: 1.2.0 + json5: 2.2.0 + minimist: 1.2.5 dev: false - hasBin: true - resolution: - integrity: sha1-WCMjH2TigzBUEwaQsYCZYJ6YDyk= + /ajv-keywords/2.1.1_ajv@5.5.2: + resolution: {integrity: sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=} + peerDependencies: + ajv: ^5.0.0 dependencies: ajv: 5.5.2 dev: false - peerDependencies: - ajv: ^5.0.0 - resolution: - integrity: sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + /ajv-pack/0.3.1: + resolution: {integrity: sha1-tyxNQhnjko5ihC10Le2Tv1B5ZWA=} dependencies: - js-beautify: 1.10.2 + js-beautify: 1.14.0 require-from-string: 1.2.1 dev: false - resolution: - integrity: sha1-tyxNQhnjko5ihC10Le2Tv1B5ZWA= + /ajv/5.5.2: + resolution: {integrity: sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=} dependencies: co: 4.6.0 fast-deep-equal: 1.1.0 - fast-json-stable-stringify: 2.0.0 + fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.3.1 dev: false - resolution: - integrity: sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - /ajv/6.10.2: + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: - fast-deep-equal: 2.0.1 - fast-json-stable-stringify: 2.0.0 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 - uri-js: 4.2.2 - dev: false - resolution: - integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - /ansi-align/2.0.0: - dependencies: - string-width: 2.1.1 + uri-js: 4.4.1 dev: false - resolution: - integrity: sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + /ansi-colors/1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} dependencies: ansi-wrap: 0.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + /ansi-colors/3.2.3: + resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + + /ansi-colors/4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + dev: false + /ansi-escapes/3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - /ansi-escapes/4.3.0: + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} dependencies: - type-fest: 0.8.1 + type-fest: 0.21.3 dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + /ansi-gray/0.1.1: + resolution: {integrity: sha1-KWLPVOyXksSFEKPetSRDaGHvclE=} + engines: {node: '>=0.10.0'} dependencies: ansi-wrap: 0.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + /ansi-regex/2.1.1: + resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + /ansi-regex/3.0.0: + resolution: {integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + /ansi-regex/4.1.0: + resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - /ansi-regex/5.0.0: + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + /ansi-styles/2.2.1: + resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - /ansi-wrap/0.1.0: + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qCJQ3bABXponyoLoLqYDu/pF768= - /ansicolors/0.3.2: + + /ansi-wrap/0.1.0: + resolution: {integrity: sha1-qCJQ3bABXponyoLoLqYDu/pF768=} + engines: {node: '>=0.10.0'} dev: false - resolution: - integrity: sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + /anymatch/1.3.2: + resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} dependencies: micromatch: 2.3.11 normalize-path: 2.1.1 dev: false - resolution: - integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + /anymatch/2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} dependencies: micromatch: 3.1.10 normalize-path: 2.1.1 dev: false - resolution: - integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.0 + dev: false + /append-buffer/1.0.2: + resolution: {integrity: sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=} + engines: {node: '>=0.10.0'} dependencies: buffer-equal: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + /append-transform/0.4.0: + resolution: {integrity: sha1-126/jKlNJ24keja61EpLdKthGZE=} + engines: {node: '>=0.10.0'} dependencies: default-require-extensions: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-126/jKlNJ24keja61EpLdKthGZE= + /append-transform/1.0.0: + resolution: {integrity: sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==} + engines: {node: '>=4'} dependencies: default-require-extensions: 2.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + + /append-transform/2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + dependencies: + default-require-extensions: 3.0.0 + dev: false + /aproba/1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} dev: false optional: true - resolution: - integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + /archy/1.0.0: + resolution: {integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=} dev: false - resolution: - integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - /are-we-there-yet/1.1.5: + + /are-we-there-yet/1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} dependencies: delegates: 1.0.0 - readable-stream: 2.3.6 + readable-stream: 2.3.7 dev: false optional: true - resolution: - integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: false - resolution: - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + /arr-diff/2.0.0: + resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} + engines: {node: '>=0.10.0'} dependencies: arr-flatten: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + /arr-diff/4.0.0: + resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + /arr-filter/1.1.2: + resolution: {integrity: sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=} + engines: {node: '>=0.10.0'} dependencies: make-iterator: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + /arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + /arr-map/2.0.2: + resolution: {integrity: sha1-Onc0X/wc814qkYJWAfnljy4kysQ=} + engines: {node: '>=0.10.0'} dependencies: make-iterator: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + /arr-union/3.1.0: + resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + /array-each/1.0.1: + resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + /array-from/2.1.1: + resolution: {integrity: sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=} dev: false - resolution: - integrity: sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + /array-initial/1.1.0: + resolution: {integrity: sha1-L6dLJnOTccOUe9enrcc74zSz15U=} + engines: {node: '>=0.10.0'} dependencies: array-slice: 1.1.0 is-number: 4.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-L6dLJnOTccOUe9enrcc74zSz15U= + /array-last/1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} dependencies: is-number: 4.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + /array-slice/1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + /array-sort/1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} dependencies: default-compare: 1.0.0 get-value: 2.0.6 kind-of: 5.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + /array-union/1.0.2: + resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} + engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + /array-uniq/1.0.3: + resolution: {integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + /array-unique/0.2.1: + resolution: {integrity: sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + /array-unique/0.3.2: + resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - /asap/2.0.6: - dev: false - resolution: - integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - /ascli/1.0.1: - dependencies: - colour: 0.7.1 - optjs: 3.2.2 - dev: false - resolution: - integrity: sha1-vPpZdKYvGOgcq660lzKrSoj5Brw= + /asn1/0.2.4: + resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} dependencies: safer-buffer: 2.1.2 dev: false - resolution: - integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + /assert-plus/1.0.0: + resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} + engines: {node: '>=0.8'} dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: false - resolution: - integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + /assign-symbols/1.0.0: + resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - /ast-types/0.13.2: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + /astral-regex/1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + /async-done/1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} dependencies: end-of-stream: 1.4.4 once: 1.4.0 process-nextick-args: 2.0.1 stream-exhaust: 1.0.2 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== + /async-each/1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} dev: false - resolution: - integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + /async-settle/1.0.0: + resolution: {integrity: sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=} + engines: {node: '>= 0.10'} dependencies: async-done: 1.3.2 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= - /async/1.5.2: - dev: false - resolution: - integrity: sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + /async/2.6.3: + resolution: {integrity: sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==} dependencies: - lodash: 4.17.15 + lodash: 4.17.21 dev: false - resolution: - integrity: sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + + /async/3.2.1: + resolution: {integrity: sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==} + dev: false + /asynckit/0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: false - resolution: - integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= - /atob/2.1.2: + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} dev: false - engines: - node: '>= 4.5.0' + + /atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} hasBin: true - resolution: - integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + dev: false + /aws-sign2/0.7.0: + resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} dev: false - resolution: - integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - /aws4/1.9.0: + + /aws4/1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} dev: false - resolution: - integrity: sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== + /babel-code-frame/6.26.0: + resolution: {integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=} dependencies: chalk: 1.1.3 esutils: 2.0.3 js-tokens: 3.0.2 dev: false - resolution: - integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + /babel-generator/6.26.1: + resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} dependencies: babel-messages: 6.23.0 babel-runtime: 6.26.0 babel-types: 6.26.0 detect-indent: 4.0.0 jsesc: 1.3.0 - lodash: 4.17.15 + lodash: 4.17.21 source-map: 0.5.7 trim-right: 1.0.1 dev: false - resolution: - integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + /babel-messages/6.23.0: + resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} dependencies: babel-runtime: 6.26.0 dev: false - resolution: - integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + /babel-runtime/6.26.0: + resolution: {integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4=} dependencies: - core-js: 2.6.10 + core-js: 2.6.12 regenerator-runtime: 0.11.1 dev: false - resolution: - integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + /babel-template/6.26.0: + resolution: {integrity: sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=} dependencies: babel-runtime: 6.26.0 babel-traverse: 6.26.0 babel-types: 6.26.0 babylon: 6.18.0 - lodash: 4.17.15 + lodash: 4.17.21 dev: false - resolution: - integrity: sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + /babel-traverse/6.26.0: + resolution: {integrity: sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=} dependencies: babel-code-frame: 6.26.0 babel-messages: 6.23.0 @@ -913,25 +963,26 @@ packages: debug: 2.6.9 globals: 9.18.0 invariant: 2.2.4 - lodash: 4.17.15 + lodash: 4.17.21 dev: false - resolution: - integrity: sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + /babel-types/6.26.0: + resolution: {integrity: sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=} dependencies: babel-runtime: 6.26.0 esutils: 2.0.3 - lodash: 4.17.15 + lodash: 4.17.21 to-fast-properties: 1.0.3 dev: false - resolution: - integrity: sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + /babylon/6.18.0: - dev: false + resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} hasBin: true - resolution: - integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + dev: false + /bach/1.2.0: + resolution: {integrity: sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=} + engines: {node: '>= 0.10'} dependencies: arr-filter: 1.1.2 arr-flatten: 1.1.0 @@ -943,19 +994,19 @@ packages: async-settle: 1.0.0 now-and-later: 2.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= - /balanced-match/1.0.0: + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false - resolution: - integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /bane/1.1.2: + resolution: {integrity: sha1-vGQkjMgjFgx98/I4uH/mLEThB7k=} + deprecated: No longer maintained - use the built-in EventEmitter in Node.js dev: false - resolution: - integrity: sha1-vGQkjMgjFgx98/I4uH/mLEThB7k= + /base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} dependencies: cache-base: 1.0.1 class-utils: 0.3.6 @@ -965,131 +1016,114 @@ packages: mixin-deep: 1.3.2 pascalcase: 0.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} dependencies: tweetnacl: 0.14.5 dev: false - resolution: - integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - /beeper/1.1.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= + /binary-extensions/1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - /binaryextensions/1.0.1: + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} dev: false - resolution: - integrity: sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U= - /bl/3.0.0: + + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true dependencies: - readable-stream: 3.4.0 - dev: false - resolution: - integrity: sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== - /bluebird/3.7.1: + file-uri-to-path: 1.0.0 dev: false - resolution: - integrity: sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== - /bn.js/4.11.8: + optional: true + + /bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: false - resolution: - integrity: sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - /boxen/1.3.0: - dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.2 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 + + /bn.js/4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: - balanced-match: 1.0.0 + balanced-match: 1.0.2 concat-map: 0.0.1 dev: false - resolution: - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/1.8.5: + resolution: {integrity: sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=} + engines: {node: '>=0.10.0'} dependencies: expand-range: 1.8.2 preserve: 0.2.0 - repeat-element: 1.1.3 + repeat-element: 1.1.4 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + /braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} dependencies: arr-flatten: 1.1.0 array-unique: 0.3.2 extend-shallow: 2.0.1 fill-range: 4.0.0 isobject: 3.0.1 - repeat-element: 1.1.3 + repeat-element: 1.1.4 snapdragon: 0.8.2 snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + /brorand/1.1.0: + resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=} dev: false - resolution: - integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + /browser-stdout/1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: false - resolution: - integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + + /browserslist/4.17.3: + resolution: {integrity: sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001265 + electron-to-chromium: 1.3.862 + escalade: 3.1.1 + node-releases: 1.1.77 + picocolors: 0.2.1 + dev: false + /buffer-equal/1.0.0: + resolution: {integrity: sha1-WWFrSYME1Var1GaWayLu2j7KX74=} + engines: {node: '>=0.4.0'} dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-WWFrSYME1Var1GaWayLu2j7KX74= - /buffer-from/1.1.1: + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: false - resolution: - integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + /builtins/1.0.3: + resolution: {integrity: sha1-y5T662HIaWRR2zZTThQi+U8K7og=} dev: false - resolution: - integrity: sha1-y5T662HIaWRR2zZTThQi+U8K7og= - /bytebuffer/5.0.1: - dependencies: - long: 3.2.0 - dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= - /bytes/3.1.0: - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + /cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} dependencies: collection-visit: 1.0.0 component-emitter: 1.3.0 @@ -1101,110 +1135,109 @@ packages: union-value: 1.0.1 unset-value: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + /caching-transform/3.0.2: + resolution: {integrity: sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==} + engines: {node: '>=6'} dependencies: hasha: 3.0.0 make-dir: 2.1.0 package-hash: 3.0.0 write-file-atomic: 2.4.3 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== + + /caching-transform/4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + dev: false + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: false + /caller-path/0.1.0: + resolution: {integrity: sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=} + engines: {node: '>=0.10.0'} dependencies: callsites: 0.2.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + /callsites/0.2.0: + resolution: {integrity: sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - /camelcase/2.1.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + /camelcase/3.0.0: + resolution: {integrity: sha1-MvxLn82vhF/N9+c7uXysImHwqwo=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - /camelcase/4.1.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /camelcase/6.2.0: + resolution: {integrity: sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==} + engines: {node: '>=10'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - /capture-stack-trace/1.0.1: + + /caniuse-lite/1.0.30001265: + resolution: {integrity: sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + /caseless/0.12.0: + resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} dev: false - resolution: - integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - /catharsis/0.8.11: + + /catharsis/0.9.0: + resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} + engines: {node: '>= 10'} dependencies: - lodash: 4.17.15 + lodash: 4.17.21 dev: false - engines: - node: '>= 8' - resolution: - integrity: sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== - /chai-as-promised/7.1.1_chai@4.2.0: + + /chai-as-promised/7.1.1_chai@4.3.4: + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' dependencies: - chai: 4.2.0 + chai: 4.3.4 check-error: 1.0.2 dev: false - peerDependencies: - chai: '>= 2.1.2 < 5' - resolution: - integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + /chai-things/0.2.0: + resolution: {integrity: sha1-xVEoN4+bs5nplPAAUhUZhO1uvnA=} dev: false - resolution: - integrity: sha1-xVEoN4+bs5nplPAAUhUZhO1uvnA= - /chai/4.2.0: + + /chai/4.3.4: + resolution: {integrity: sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==} + engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 check-error: 1.0.2 deep-eql: 3.0.1 get-func-name: 2.0.0 - pathval: 1.1.0 + pathval: 1.1.1 type-detect: 4.0.8 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + /chalk/1.1.3: + resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} + engines: {node: '>=0.10.0'} dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 @@ -1212,37 +1245,43 @@ packages: strip-ansi: 3.0.1 supports-color: 2.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + /chardet/0.4.2: + resolution: {integrity: sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=} dev: false - resolution: - integrity: sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + /chardet/0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false - resolution: - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + /charenc/0.0.2: + resolution: {integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=} dev: false - resolution: - integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + /check-error/1.0.2: + resolution: {integrity: sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=} dev: false - resolution: - integrity: sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + /chokidar/1.7.0: + resolution: {integrity: sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=} + deprecated: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies. dependencies: anymatch: 1.3.2 async-each: 1.0.3 @@ -1252,12 +1291,13 @@ packages: is-glob: 2.0.1 path-is-absolute: 1.0.1 readdirp: 2.2.1 - dev: false optionalDependencies: - fsevents: 1.2.9 - resolution: - integrity: sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + fsevents: 1.2.13 + dev: false + /chokidar/2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies. dependencies: anymatch: 2.0.0 async-each: 1.0.3 @@ -1265,358 +1305,333 @@ packages: glob-parent: 3.1.0 inherits: 2.0.4 is-binary-path: 1.0.1 - is-glob: 4.0.1 + is-glob: 4.0.3 normalize-path: 3.0.0 path-is-absolute: 1.0.1 readdirp: 2.2.1 upath: 1.2.0 - dev: false optionalDependencies: - fsevents: 1.2.9 - resolution: - integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - /ci-info/1.6.0: + fsevents: 1.2.13 + dev: false + + /chokidar/3.5.2: + resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 dev: false - resolution: - integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + /circular-json/0.3.3: - deprecated: 'CircularJSON is in maintenance only, flatted is its successor.' + resolution: {integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==} + deprecated: CircularJSON is in maintenance only, flatted is its successor. dev: false - resolution: - integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - /class-transformer/0.2.3: + + /class-transformer/0.3.1: + resolution: {integrity: sha512-cKFwohpJbuMovS8xVLmn8N2AUbAuc8pVo4zEfsUVo8qgECOogns1WVk/FkOZoxhOPTyTYFckuoH+13FO+MQ8GA==} dev: false - resolution: - integrity: sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ== + /class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} dependencies: arr-union: 3.1.0 define-property: 0.2.5 isobject: 3.0.1 static-extend: 0.1.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - /cli-boxes/1.0.0: + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-T6kXw+WclKAEzWH47lCdplFocUM= + /cli-cursor/2.1.0: + resolution: {integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=} + engines: {node: '>=4'} dependencies: restore-cursor: 2.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - /cli-spinner/0.2.10: + + /cli-width/2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== - /cli-width/2.2.0: + + /cli-width/3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} dev: false - resolution: - integrity: sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + /cliui/3.2.0: + resolution: {integrity: sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=} dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 wrap-ansi: 2.1.0 dev: false - resolution: - integrity: sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + /cliui/5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 strip-ansi: 5.2.0 wrap-ansi: 5.1.0 dev: false - resolution: - integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - /clone-buffer/1.0.0: + + /cliui/6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - /clone-deep/0.3.0: + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: - for-own: 1.0.0 - is-plain-object: 2.0.4 - kind-of: 3.2.2 - shallow-clone: 0.1.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone-buffer/1.0.0: + resolution: {integrity: sha1-4+JbIHrE5wGvch4staFnksrD3Fg=} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg= + /clone-stats/1.0.0: + resolution: {integrity: sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=} dev: false - resolution: - integrity: sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + /clone/2.1.2: + resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + engines: {node: '>=0.8'} dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + /cloneable-readable/1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} dependencies: inherits: 2.0.4 process-nextick-args: 2.0.1 - readable-stream: 2.3.6 + readable-stream: 2.3.7 dev: false - resolution: - integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + /co/4.6.0: + resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: false - engines: - iojs: '>= 1.0.0' - node: '>= 0.12.0' - resolution: - integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + /code-point-at/1.1.0: + resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + /collection-map/1.0.0: + resolution: {integrity: sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=} + engines: {node: '>=0.10.0'} dependencies: arr-map: 2.0.2 for-own: 1.0.0 make-iterator: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + /collection-visit/1.0.0: + resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} + engines: {node: '>=0.10.0'} dependencies: map-visit: 1.0.0 object-visit: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: false - resolution: - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + /color-name/1.1.3: + resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} dev: false - resolution: - integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false - resolution: - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - /color-string/1.5.3: + + /color-string/1.6.0: + resolution: {integrity: sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==} dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 dev: false - resolution: - integrity: sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + /color-support/1.1.3: - dev: false + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true - resolution: - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + dev: false + /color/3.0.0: + resolution: {integrity: sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==} dependencies: color-convert: 1.9.3 - color-string: 1.5.3 - dev: false - resolution: - integrity: sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== - /colornames/1.1.1: + color-string: 1.6.0 dev: false - resolution: - integrity: sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= + /colors/1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} dev: false - engines: - node: '>=0.1.90' - resolution: - integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + /colorspace/1.1.2: + resolution: {integrity: sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==} dependencies: color: 3.0.0 text-hex: 1.0.0 dev: false - resolution: - integrity: sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== - /colour/0.7.1: - dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g= + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false - resolution: - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + /commondir/1.0.1: + resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} dev: false - resolution: - integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + /component-emitter/1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: false - resolution: - integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: false - resolution: - integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} dependencies: - buffer-from: 1.1.1 + buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.6 + readable-stream: 2.3.7 typedarray: 0.0.6 dev: false - engines: - '0': node >= 0.8 - resolution: - integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - /config-chain/1.1.12: + + /config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: - ini: 1.3.5 + ini: 1.3.8 proto-list: 1.2.4 dev: false - resolution: - integrity: sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - /configstore/3.1.2: - dependencies: - dot-prop: 4.2.0 - graceful-fs: 4.2.3 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + /console-control-strings/1.1.0: + resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} dev: false optional: true - resolution: - integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - /convert-source-map/1.7.0: + + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 dev: false - resolution: - integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + /copy-descriptor/0.1.1: + resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - /copy-props/2.0.4: + + /copy-props/2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} dependencies: each-props: 1.3.2 - is-plain-object: 2.0.4 - dev: false - resolution: - integrity: sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== - /core-js/2.6.10: - deprecated: 'core-js@<3.0 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.' + is-plain-object: 5.0.0 dev: false + + /core-js/2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. requiresBuild: true - resolution: - integrity: sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== - /core-js/3.4.4: dev: false - requiresBuild: true - resolution: - integrity: sha512-vKea1DrcLA80Hrfc7AQgfoGvEaByfR5mH08t+zuWOWY94TFBmabdEL56mUbcijvadG9RxsXR2gUUFrfj4/iTcA== + /core-util-is/1.0.2: + resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} + dev: false + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false - resolution: - integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /cp-file/6.2.0: + resolution: {integrity: sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==} + engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 make-dir: 2.1.0 nested-error-stacks: 2.1.0 pify: 4.0.1 - safe-buffer: 5.2.0 + safe-buffer: 5.2.1 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== + /cpx/1.5.0: + resolution: {integrity: sha1-GFvgGFEdhycN7czCkxceN2VauI8=} + hasBin: true dependencies: babel-runtime: 6.26.0 chokidar: 1.7.0 - duplexer: 0.1.1 - glob: 7.1.6 + duplexer: 0.1.2 + glob: 7.2.0 glob2base: 0.0.12 minimatch: 3.0.4 - mkdirp: 0.5.1 - resolve: 1.13.1 - safe-buffer: 5.2.0 + mkdirp: 0.5.5 + resolve: 1.20.0 + safe-buffer: 5.2.1 shell-quote: 1.7.2 subarg: 1.0.0 dev: false - hasBin: true - resolution: - integrity: sha1-GFvgGFEdhycN7czCkxceN2VauI8= - /create-error-class/3.0.2: - dependencies: - capture-stack-trace: 1.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + /cross-spawn/4.0.2: + resolution: {integrity: sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=} dependencies: lru-cache: 4.1.5 which: 1.3.1 dev: false - resolution: - integrity: sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + /cross-spawn/5.1.0: + resolution: {integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=} dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 dev: false - resolution: - integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} dependencies: nice-try: 1.0.5 path-key: 2.0.1 @@ -1624,165 +1639,169 @@ packages: shebang-command: 1.2.0 which: 1.3.1 dev: false - engines: - node: '>=4.8' - resolution: - integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - /crypt/0.0.2: + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 dev: false - resolution: - integrity: sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - /crypto-random-string/1.0.0: + + /crypt/0.0.2: + resolution: {integrity: sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + /d/1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: es5-ext: 0.10.53 type: 1.2.0 dev: false - resolution: - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + /dashdash/1.14.1: + resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} + engines: {node: '>=0.10'} dependencies: assert-plus: 1.0.0 dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - /data-uri-to-buffer/1.2.0: - dev: false - resolution: - integrity: sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} dependencies: ms: 2.0.0 dev: false - resolution: - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - /debug/3.1.0: + + /debug/3.2.6: + resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + dependencies: + ms: 2.1.3 + dev: false + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} dependencies: - ms: 2.0.0 + ms: 2.1.3 dev: false - resolution: - integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - /debug/3.2.6: + + /debug/4.3.2: + resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 dev: false - resolution: - integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - /debug/4.1.1: + + /debug/4.3.2_supports-color@8.1.1: + resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 + supports-color: 8.1.1 dev: false - resolution: - integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + /decamelize/1.2.0: + resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + + /decamelize/4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: false + /decode-uri-component/0.2.0: + resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} + engines: {node: '>=0.10'} dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + /deep-eql/3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} dependencies: type-detect: 4.0.8 dev: false - engines: - node: '>=0.12' - resolution: - integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - /deep-extend/0.6.0: - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - /deep-is/0.1.3: + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: false - resolution: - integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + /default-compare/1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} dependencies: kind-of: 5.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + /default-require-extensions/1.0.0: + resolution: {integrity: sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=} + engines: {node: '>=0.10.0'} dependencies: strip-bom: 2.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= + /default-require-extensions/2.0.0: + resolution: {integrity: sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=} + engines: {node: '>=4'} dependencies: strip-bom: 3.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + + /default-require-extensions/3.0.0: + resolution: {integrity: sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==} + engines: {node: '>=8'} + dependencies: + strip-bom: 4.0.0 + dev: false + /default-resolution/2.0.0: + resolution: {integrity: sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= + /define-properties/1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} dependencies: object-keys: 1.1.1 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + /define-property/0.2.5: + resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} + engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + /define-property/1.0.0: + resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} + engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + /define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - /degenerator/1.0.4: - dependencies: - ast-types: 0.13.2 - escodegen: 1.12.0 - esprima: 3.1.3 - dev: false - resolution: - integrity: sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= + /del/3.0.0: + resolution: {integrity: sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=} + engines: {node: '>=4'} dependencies: globby: 6.1.0 is-path-cwd: 1.0.0 @@ -1791,181 +1810,137 @@ packages: pify: 3.0.0 rimraf: 2.7.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + /delay/4.3.0: + resolution: {integrity: sha512-Lwaf3zVFDMBop1yDuFZ19F9WyGcZcGacsbdlZtWjQmM50tOcMntm1njF/Nb/Vjij3KaSvCF+sEYGKrrjObu2NA==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-Lwaf3zVFDMBop1yDuFZ19F9WyGcZcGacsbdlZtWjQmM50tOcMntm1njF/Nb/Vjij3KaSvCF+sEYGKrrjObu2NA== + /delayed-stream/1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /delegates/1.0.0: + resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} dev: false optional: true - resolution: - integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - /depd/1.1.2: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + /detect-file/1.0.0: + resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + /detect-indent/4.0.0: + resolution: {integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg=} + engines: {node: '>=0.10.0'} dependencies: repeating: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - /diagnostics/1.1.1: - dependencies: - colorspace: 1.1.2 - enabled: 1.0.2 - kuler: 1.0.1 - dev: false - resolution: - integrity: sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== + /diff/3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} dev: false - engines: - node: '>=0.3.1' - resolution: - integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - /diff/4.0.1: - dev: false - engines: - node: '>=0.3.1' - resolution: - integrity: sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== - /dockerfile-ast/0.0.16: - dependencies: - vscode-languageserver-types: 3.14.0 + + /diff/5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} dev: false - resolution: - integrity: sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw== + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - /dom-serializer/0.2.2: + + /dom-serializer/1.3.2: + resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} dependencies: - domelementtype: 2.0.1 - entities: 2.0.0 - dev: false - resolution: - integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - /domelementtype/1.3.1: + domelementtype: 2.2.0 + domhandler: 4.2.2 + entities: 2.2.0 dev: false - resolution: - integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - /domelementtype/2.0.1: + + /domelementtype/2.2.0: + resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} dev: false - resolution: - integrity: sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - /domhandler/2.4.2: + + /domhandler/3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} dependencies: - domelementtype: 1.3.1 + domelementtype: 2.2.0 dev: false - resolution: - integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - /domutils/1.7.0: + + /domhandler/4.2.2: + resolution: {integrity: sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==} + engines: {node: '>= 4'} dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 + domelementtype: 2.2.0 dev: false - resolution: - integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - /dot-prop/4.2.0: + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: - is-obj: 1.0.1 + dom-serializer: 1.3.2 + domelementtype: 2.2.0 + domhandler: 4.2.2 + dev: false + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - /dotnet-deps-parser/4.5.2: - dependencies: - '@types/xml2js': 0.4.3 - lodash: 4.17.15 - source-map-support: 0.5.16 - tslib: 1.10.0 - xml2js: 0.4.19 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-bk5Q1luEwQ10rrBwZbtTxUNadaLz2dM6xzOLoTK+oUBcaq6saCeELmkIgdG+Fwkn58XRgLQvOySVS0gp4OG6RA== - /duplexer/0.1.1: - dev: false - resolution: - integrity: sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - /duplexer3/0.1.4: - dev: false - resolution: - integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + /duplexify/3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 - readable-stream: 2.3.6 - stream-shift: 1.0.0 + readable-stream: 2.3.7 + stream-shift: 1.0.1 dev: false - resolution: - integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + /each-props/1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} dependencies: is-plain-object: 2.0.4 object.defaults: 1.1.0 dev: false - resolution: - integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + /ecc-jsbn/0.1.2: + resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 dev: false - resolution: - integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /editorconfig/0.15.3: + resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} + hasBin: true dependencies: commander: 2.20.3 lru-cache: 4.1.5 semver: 5.7.1 sigmund: 1.0.1 dev: false - hasBin: true - resolution: - integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== - /elliptic/6.5.2: + + /electron-to-chromium/1.3.862: + resolution: {integrity: sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==} + dev: false + + /elliptic/6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: - bn.js: 4.11.8 + bn.js: 4.12.0 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -1973,211 +1948,189 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 dev: false - resolution: - integrity: sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - /email-validator/2.0.4: - dev: false - engines: - node: '>4.0' - resolution: - integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== + /emoji-regex/7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: false - resolution: - integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false - resolution: - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - /enabled/1.0.2: - dependencies: - env-variable: 0.0.5 + + /enabled/2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} dev: false - resolution: - integrity: sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: false - resolution: - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - /entities/1.1.2: - dev: false - resolution: - integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - /entities/2.0.0: + + /entities/2.0.3: + resolution: {integrity: sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==} dev: false - resolution: - integrity: sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== - /env-variable/0.0.5: + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: false - resolution: - integrity: sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA== + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: false - resolution: - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - /es-abstract/1.16.2: + + /es-abstract/1.19.1: + resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} + engines: {node: '>= 0.4'} dependencies: + call-bind: 1.0.2 es-to-primitive: 1.2.1 function-bind: 1.1.1 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 has: 1.0.3 - has-symbols: 1.0.1 - is-callable: 1.1.4 - is-regex: 1.0.4 - object-inspect: 1.7.0 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.1 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.1 + is-string: 1.0.7 + is-weakref: 1.0.1 + object-inspect: 1.11.0 object-keys: 1.1.1 - string.prototype.trimleft: 2.1.0 - string.prototype.trimright: 2.1.0 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA== + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} dependencies: - is-callable: 1.1.4 - is-date-object: 1.0.1 - is-symbol: 1.0.3 + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + /es5-ext/0.10.53: + resolution: {integrity: sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==} dependencies: es6-iterator: 2.0.3 es6-symbol: 3.1.3 next-tick: 1.0.0 dev: false - resolution: - integrity: sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + /es6-error/4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} dev: false - resolution: - integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + /es6-iterator/2.0.3: + resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=} dependencies: d: 1.0.1 es5-ext: 0.10.53 es6-symbol: 3.1.3 dev: false - resolution: - integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - /es6-promise/4.2.8: - dev: false - resolution: - integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - /es6-promisify/5.0.0: - dependencies: - es6-promise: 4.2.8 - dev: false - resolution: - integrity: sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + /es6-symbol/3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} dependencies: d: 1.0.1 - ext: 1.2.1 + ext: 1.6.0 dev: false - resolution: - integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + /es6-weak-map/2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} dependencies: d: 1.0.1 es5-ext: 0.10.53 es6-iterator: 2.0.3 es6-symbol: 3.1.3 dev: false - resolution: - integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + /escape-string-regexp/1.0.5: + resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + engines: {node: '>=0.8.0'} dev: false - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - /escodegen/1.12.0: - dependencies: - esprima: 3.1.3 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} dev: false - engines: - node: '>=4.0' - hasBin: true - optionalDependencies: - source-map: 0.6.1 - resolution: - integrity: sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + /eslint-scope/3.7.3: + resolution: {integrity: sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==} + engines: {node: '>=4.0.0'} dependencies: - esrecurse: 4.2.1 + esrecurse: 4.3.0 estraverse: 4.3.0 dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== - /eslint-scope/5.0.0: + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} dependencies: - esrecurse: 4.2.1 + esrecurse: 4.3.0 estraverse: 4.3.0 dev: false - engines: - node: '>=8.0.0' - resolution: - integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + /eslint-utils/1.4.3: + resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} + engines: {node: '>=6'} dependencies: - eslint-visitor-keys: 1.1.0 + eslint-visitor-keys: 1.3.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - /eslint-visitor-keys/1.1.0: + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + /eslint/4.19.1: + resolution: {integrity: sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==} + engines: {node: '>=4'} + hasBin: true dependencies: ajv: 5.5.2 babel-code-frame: 6.26.0 chalk: 2.4.2 concat-stream: 1.6.2 cross-spawn: 5.1.0 - debug: 3.2.6 + debug: 3.2.7 doctrine: 2.1.0 eslint-scope: 3.7.3 - eslint-visitor-keys: 1.1.0 + eslint-visitor-keys: 1.3.0 espree: 3.5.4 - esquery: 1.0.1 + esquery: 1.4.0 esutils: 2.0.3 file-entry-cache: 2.0.0 functional-red-black-tree: 1.0.1 - glob: 7.1.6 + glob: 7.2.0 globals: 11.12.0 ignore: 3.3.10 imurmurhash: 0.1.4 inquirer: 3.3.0 is-resolvable: 1.1.0 - js-yaml: 3.13.1 + js-yaml: 3.14.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.3.0 - lodash: 4.17.15 + lodash: 4.17.21 minimatch: 3.0.4 - mkdirp: 0.5.1 + mkdirp: 0.5.5 natural-compare: 1.4.0 optionator: 0.8.3 path-is-inside: 1.0.2 @@ -2191,154 +2144,161 @@ packages: table: 4.0.2 text-table: 0.2.0 dev: false - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== + /eslint/6.6.0: + resolution: {integrity: sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + hasBin: true dependencies: - '@babel/code-frame': 7.5.5 - ajv: 6.10.2 + '@babel/code-frame': 7.15.8 + ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.5 - debug: 4.1.1 + debug: 4.3.2 doctrine: 3.0.0 - eslint-scope: 5.0.0 + eslint-scope: 5.1.1 eslint-utils: 1.4.3 - eslint-visitor-keys: 1.1.0 - espree: 6.1.2 - esquery: 1.0.1 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + esquery: 1.4.0 esutils: 2.0.3 file-entry-cache: 5.0.1 functional-red-black-tree: 1.0.1 - glob-parent: 5.1.0 + glob-parent: 5.1.2 globals: 11.12.0 ignore: 4.0.6 - import-fresh: 3.2.1 + import-fresh: 3.3.0 imurmurhash: 0.1.4 - inquirer: 7.0.0 - is-glob: 4.0.1 - js-yaml: 3.13.1 + inquirer: 7.3.3 + is-glob: 4.0.3 + js-yaml: 3.14.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.3.0 - lodash: 4.17.15 + lodash: 4.17.21 minimatch: 3.0.4 - mkdirp: 0.5.1 + mkdirp: 0.5.5 natural-compare: 1.4.0 optionator: 0.8.3 progress: 2.0.3 regexpp: 2.0.1 semver: 6.3.0 strip-ansi: 5.2.0 - strip-json-comments: 3.0.1 + strip-json-comments: 3.1.1 table: 5.4.6 text-table: 0.2.0 - v8-compile-cache: 2.1.0 - dev: false - engines: - node: ^8.10.0 || ^10.13.0 || >=11.10.1 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /eslint/6.8.0: + resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} hasBin: true - resolution: - integrity: sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== + dependencies: + '@babel/code-frame': 7.15.8 + ajv: 6.12.6 + chalk: 2.4.2 + cross-spawn: 6.0.5 + debug: 4.3.2 + doctrine: 3.0.0 + eslint-scope: 5.1.1 + eslint-utils: 1.4.3 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + esquery: 1.4.0 + esutils: 2.0.3 + file-entry-cache: 5.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + inquirer: 7.3.3 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.21 + minimatch: 3.0.4 + mkdirp: 0.5.5 + natural-compare: 1.4.0 + optionator: 0.8.3 + progress: 2.0.3 + regexpp: 2.0.1 + semver: 6.3.0 + strip-ansi: 5.2.0 + strip-json-comments: 3.1.1 + table: 5.4.6 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /espree/3.5.4: + resolution: {integrity: sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==} + engines: {node: '>=0.10.0'} dependencies: - acorn: 5.7.3 + acorn: 5.7.4 acorn-jsx: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== - /espree/6.1.2: + + /espree/6.2.1: + resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} + engines: {node: '>=6.0.0'} dependencies: - acorn: 7.1.0 - acorn-jsx: 5.1.0_acorn@7.1.0 - eslint-visitor-keys: 1.1.0 + acorn: 7.4.1 + acorn-jsx: 5.3.2_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== - /esprima/3.1.3: - dev: false - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + /esprima/4.0.1: - dev: false - engines: - node: '>=4' + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true - resolution: - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - /esquery/1.0.1: + dev: false + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} dependencies: - estraverse: 4.3.0 + estraverse: 5.2.0 dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - /esrecurse/4.2.1: + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: - estraverse: 4.3.0 + estraverse: 5.2.0 dev: false - engines: - node: '>=4.0' - resolution: - integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} dev: false - engines: - node: '>=4.0' - resolution: - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - /esutils/2.0.3: + + /estraverse/5.2.0: + resolution: {integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==} + engines: {node: '>=4.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - /execa/0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.2 - strip-eof: 1.0.0 + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - /execa/1.0.0: - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.2 - strip-eof: 1.0.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + /expand-brackets/0.1.5: + resolution: {integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=} + engines: {node: '>=0.10.0'} dependencies: is-posix-bracket: 0.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + /expand-brackets/2.1.4: + resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} + engines: {node: '>=0.10.0'} dependencies: debug: 2.6.9 define-property: 0.2.5 @@ -2348,82 +2308,74 @@ packages: snapdragon: 0.8.2 to-regex: 3.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + /expand-range/1.8.2: + resolution: {integrity: sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=} + engines: {node: '>=0.10.0'} dependencies: fill-range: 2.2.4 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + /expand-tilde/2.0.2: + resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=} + engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - /ext/1.2.1: + + /ext/1.6.0: + resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} dependencies: - type: 2.0.0 + type: 2.5.0 dev: false - resolution: - integrity: sha512-x+OKKC57tNiLhDW26UmWtvQBpvO+2wxdC/A0jP7RkmjAc4gze9/U98hQyIYJUzo9A+o9ntMHpC+LH3pWMSbrVQ== + /extend-shallow/2.0.1: + resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} + engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + /extend-shallow/3.0.2: + resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} + engines: {node: '>=0.10.0'} dependencies: assign-symbols: 1.0.0 is-extendable: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false - resolution: - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /external-editor/2.2.0: + resolution: {integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==} + engines: {node: '>=0.12'} dependencies: chardet: 0.4.2 iconv-lite: 0.4.24 tmp: 0.0.33 dev: false - engines: - node: '>=0.12' - resolution: - integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + /external-editor/3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + /extglob/0.3.2: + resolution: {integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + /extglob/2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 @@ -2434,184 +2386,212 @@ packages: snapdragon: 0.8.2 to-regex: 3.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + /extsprintf/1.3.0: + resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} + engines: {'0': node >=0.6.0} dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /fancy-log/1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} dependencies: ansi-gray: 0.1.1 color-support: 1.1.3 parse-node-version: 1.0.1 time-stamp: 1.1.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + /fast-deep-equal/1.1.0: + resolution: {integrity: sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=} dev: false - resolution: - integrity: sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + /fast-deep-equal/2.0.1: + resolution: {integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=} + dev: false + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-json-patch/2.2.1: + resolution: {integrity: sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==} + engines: {node: '>= 0.4.0'} + dependencies: + fast-deep-equal: 2.0.1 dev: false - resolution: - integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - /fast-json-patch/0.5.7: + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: false - engines: - node: '>= 0.4.0' - resolution: - integrity: sha1-taj0nSWWJFlu+YuHLz/aiVtNhmU= - /fast-json-stable-stringify/2.0.0: + + /fast-levenshtein/1.1.4: + resolution: {integrity: sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=} dev: false - resolution: - integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + /fast-levenshtein/2.0.6: + resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} dev: false - resolution: - integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - /fast-safe-stringify/2.0.7: + + /fast-safe-stringify/2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false - resolution: - integrity: sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - /fecha/2.3.3: + + /fecha/4.2.1: + resolution: {integrity: sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==} dev: false - resolution: - integrity: sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== + /figures/2.0.0: + resolution: {integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=} + engines: {node: '>=4'} dependencies: escape-string-regexp: 1.0.5 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - /figures/3.1.0: + + /figures/3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + /file-entry-cache/2.0.0: + resolution: {integrity: sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=} + engines: {node: '>=0.10.0'} dependencies: flat-cache: 1.3.4 object-assign: 4.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + /file-entry-cache/5.0.1: + resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} + engines: {node: '>=4'} dependencies: flat-cache: 2.0.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true dev: false - resolution: - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + optional: true + /filename-regex/2.0.1: + resolution: {integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + /fileset/2.0.3: + resolution: {integrity: sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=} dependencies: - glob: 7.1.6 + glob: 7.2.0 minimatch: 3.0.4 dev: false - resolution: - integrity: sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + /fill-range/2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} dependencies: is-number: 2.1.0 isobject: 2.1.0 randomatic: 3.1.1 - repeat-element: 1.1.3 + repeat-element: 1.1.4 repeat-string: 1.6.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + /fill-range/4.0.0: + resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} + engines: {node: '>=0.10.0'} dependencies: extend-shallow: 2.0.1 is-number: 3.0.0 repeat-string: 1.6.1 to-regex-range: 2.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + /find-cache-dir/2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} dependencies: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + + /find-cache-dir/3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: false + /find-index/0.1.1: + resolution: {integrity: sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=} dev: false - resolution: - integrity: sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= + /find-up/1.1.2: + resolution: {integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=} + engines: {node: '>=0.10.0'} dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} dependencies: locate-path: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + /findup-sync/2.0.0: + resolution: {integrity: sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=} + engines: {node: '>= 0.10'} dependencies: detect-file: 1.0.0 is-glob: 3.1.0 micromatch: 3.1.10 resolve-dir: 1.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + /findup-sync/3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} dependencies: detect-file: 1.0.0 - is-glob: 4.0.1 + is-glob: 4.0.3 micromatch: 3.1.10 resolve-dir: 1.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + /fined/1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} dependencies: expand-tilde: 2.0.2 is-plain-object: 2.0.4 @@ -2619,324 +2599,305 @@ packages: object.pick: 1.3.0 parse-filepath: 1.0.2 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + /flagged-respawn/1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + /flat-cache/1.3.4: + resolution: {integrity: sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==} + engines: {node: '>=0.10.0'} dependencies: circular-json: 0.3.3 - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 rimraf: 2.6.3 write: 0.2.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + /flat-cache/2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} dependencies: - flatted: 2.0.1 + flatted: 2.0.2 rimraf: 2.6.3 write: 1.0.3 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - /flat/4.1.0: + + /flat/4.1.1: + resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} + hasBin: true dependencies: - is-buffer: 2.0.4 + is-buffer: 2.0.5 dev: false + + /flat/5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - resolution: - integrity: sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - /flatted/2.0.1: dev: false - resolution: - integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + + /flatted/2.0.2: + resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: false + /flush-write-stream/1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} dependencies: inherits: 2.0.4 - readable-stream: 2.3.6 + readable-stream: 2.3.7 dev: false - resolution: - integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - /for-in/0.1.8: + + /fn.name/1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + /for-in/1.0.2: + resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + /for-own/0.1.5: + resolution: {integrity: sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=} + engines: {node: '>=0.10.0'} dependencies: for-in: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + /for-own/1.0.0: + resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} + engines: {node: '>=0.10.0'} dependencies: for-in: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + /foreground-child/1.5.6: + resolution: {integrity: sha1-T9ca0t/elnibmApcCilZN8svXOk=} dependencies: cross-spawn: 4.0.2 - signal-exit: 3.0.2 + signal-exit: 3.0.5 + dev: false + + /foreground-child/2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.5 dev: false - resolution: - integrity: sha1-T9ca0t/elnibmApcCilZN8svXOk= + /forever-agent/0.6.1: + resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} dev: false - resolution: - integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.25 + mime-types: 2.1.33 dev: false - engines: - node: '>= 0.12' - resolution: - integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /fragment-cache/0.2.1: + resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} + engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - /fs-constants/1.0.0: + + /fromentries/1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} dev: false - resolution: - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - /fs-extra/8.1.0: + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} dependencies: - graceful-fs: 4.2.3 - jsonfile: 4.0.0 - universalify: 0.1.2 + at-least-node: 1.0.0 + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 dev: false - engines: - node: '>=6 <7 || >=8' - resolution: - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + /fs-mkdirp-stream/1.0.0: + resolution: {integrity: sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=} + engines: {node: '>= 0.10'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 through2: 2.0.5 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + /fs.realpath/1.0.0: - dev: false - resolution: - integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - /fsevents/1.2.9: - bundledDependencies: - - node-pre-gyp + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + dev: false + + /fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. + requiresBuild: true dependencies: - nan: 2.14.0 - deprecated: 'One of your dependencies needs to upgrade to fsevents v2: 1) Proper nodejs v10+ support 2) No more fetching binaries from AWS, smaller package size' + bindings: 1.5.0 + nan: 2.15.0 dev: false - engines: - node: '>=4.0' optional: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] requiresBuild: true - resolution: - integrity: sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - /ftp/0.3.10: - dependencies: - readable-stream: 1.1.14 - xregexp: 2.0.0 dev: false - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= + optional: true + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false - resolution: - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} dev: false - resolution: - integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + /gauge/2.7.4: + resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=} dependencies: aproba: 1.2.0 console-control-strings: 1.1.0 has-unicode: 2.0.1 object-assign: 4.1.1 - signal-exit: 3.0.2 + signal-exit: 3.0.5 string-width: 1.0.2 strip-ansi: 3.0.1 wide-align: 1.1.3 dev: false optional: true - resolution: - integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + /get-caller-file/1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} dev: false - resolution: - integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} dev: false - engines: - node: 6.* || 8.* || >= 10.* - resolution: - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + /get-func-name/2.0.0: + resolution: {integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=} dev: false - resolution: - integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - /get-own-enumerable-property-symbols/3.0.1: + + /get-intrinsic/1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 dev: false - resolution: - integrity: sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== - /get-params/0.1.2: + + /get-own-enumerable-property-symbols/3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: false - resolution: - integrity: sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4= - /get-stream/3.0.0: + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - /get-stream/4.1.0: - dependencies: - pump: 3.0.0 + + /get-params/0.1.2: + resolution: {integrity: sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - /get-uri/2.0.4: + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} dependencies: - data-uri-to-buffer: 1.2.0 - debug: 2.6.9 - extend: 3.0.2 - file-uri-to-path: 1.0.0 - ftp: 0.3.10 - readable-stream: 2.3.6 + call-bind: 1.0.2 + get-intrinsic: 1.1.1 dev: false - resolution: - integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q== + /get-value/2.0.6: + resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + /getpass/0.1.7: + resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} dependencies: assert-plus: 1.0.0 dev: false - resolution: - integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /git-rev-sync/1.12.0: + resolution: {integrity: sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=} dependencies: escape-string-regexp: 1.0.5 graceful-fs: 4.1.11 shelljs: 0.7.7 dev: false - resolution: - integrity: sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U= - /git-up/4.0.1: - dependencies: - is-ssh: 1.3.1 - parse-url: 5.0.1 - dev: false - resolution: - integrity: sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== - /git-url-parse/11.1.2: - dependencies: - git-up: 4.0.1 - dev: false - resolution: - integrity: sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== + /glob-base/0.3.0: + resolution: {integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=} + engines: {node: '>=0.10.0'} dependencies: glob-parent: 2.0.0 is-glob: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + /glob-parent/2.0.0: + resolution: {integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=} dependencies: is-glob: 2.0.1 dev: false - resolution: - integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + /glob-parent/3.1.0: + resolution: {integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=} dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 dev: false - resolution: - integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - /glob-parent/5.1.0: + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: - is-glob: 4.0.1 + is-glob: 4.0.3 dev: false - engines: - node: '>= 6' - resolution: - integrity: sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + /glob-stream/6.1.0: + resolution: {integrity: sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=} + engines: {node: '>= 0.10'} dependencies: extend: 3.0.2 - glob: 7.1.6 + glob: 7.2.0 glob-parent: 3.1.0 is-negated-glob: 1.0.0 ordered-read-streams: 1.0.1 pumpify: 1.5.1 - readable-stream: 2.3.6 + readable-stream: 2.3.7 remove-trailing-separator: 1.1.0 to-absolute-glob: 2.0.2 unique-stream: 2.3.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= - /glob-watcher/5.0.3: + + /glob-watcher/5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} dependencies: anymatch: 2.0.0 async-done: 1.3.2 chokidar: 2.1.8 is-negated-glob: 1.0.0 - just-debounce: 1.0.0 + just-debounce: 1.1.0 + normalize-path: 3.0.0 object.defaults: 1.1.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== + /glob/7.1.3: + resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2945,9 +2906,9 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 dev: false - resolution: - integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - /glob/7.1.6: + + /glob/7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2956,144 +2917,108 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 dev: false - resolution: - integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - /glob2base/0.0.12: + + /glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: - find-index: 0.1.1 + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= - /global-dirs/0.1.1: + + /glob2base/0.0.12: + resolution: {integrity: sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=} + engines: {node: '>= 0.10'} dependencies: - ini: 1.3.5 + find-index: 0.1.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + /global-modules/1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + /global-prefix/1.0.2: + resolution: {integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=} + engines: {node: '>=0.10.0'} dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 - ini: 1.3.5 + ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /globals/12.4.0: + resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.8.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + /globals/9.18.0: + resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + /globby/6.1.0: + resolution: {integrity: sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=} + engines: {node: '>=0.10.0'} dependencies: array-union: 1.0.2 - glob: 7.1.6 + glob: 7.2.0 object-assign: 4.1.1 pify: 2.3.0 pinkie-promise: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + /glogg/1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} dependencies: sparkles: 1.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== - /got/6.7.1: - dependencies: - create-error-class: 3.0.2 - duplexer3: 0.1.4 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.2.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.2.0 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + /graceful-fs/4.1.11: + resolution: {integrity: sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=} + engines: {node: '>=0.4.0'} dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - /graceful-fs/4.2.3: - dev: false - resolution: - integrity: sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - /graphlib/2.1.7: - dependencies: - lodash: 4.17.15 + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} dev: false - resolution: - integrity: sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w== + /growl/1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} dev: false - engines: - node: '>=4.x' - resolution: - integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - /grpc/1.24.2: - bundledDependencies: - - node-pre-gyp - dependencies: - '@types/bytebuffer': 5.0.40 - lodash.camelcase: 4.3.0 - lodash.clone: 4.5.0 - nan: 2.14.0 - protobufjs: 5.0.3 - dev: false - engines: - node: '>=4' - requiresBuild: true - resolution: - integrity: sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw== - /gulp-cli/2.2.0: + + /gulp-cli/2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true dependencies: ansi-colors: 1.1.0 archy: 1.0.0 array-sort: 1.0.0 color-support: 1.1.3 concat-stream: 1.6.2 - copy-props: 2.0.4 + copy-props: 2.0.5 fancy-log: 1.3.3 gulplog: 1.0.0 - interpret: 1.2.0 + interpret: 1.4.0 isobject: 3.0.1 liftoff: 3.1.0 matchdep: 2.0.0 @@ -3101,863 +3026,792 @@ packages: pretty-hrtime: 1.0.3 replace-homedir: 1.0.0 semver-greatest-satisfied-range: 1.1.0 - v8flags: 3.1.3 - yargs: 7.1.0 + v8flags: 3.2.0 + yargs: 7.1.2 dev: false - engines: - node: '>= 0.10' - hasBin: true - resolution: - integrity: sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA== - /gulp-debug/4.0.0_gulp@4.0.2: + + /gulp-debug/4.0.0: + resolution: {integrity: sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g==} + engines: {node: '>=6'} + peerDependencies: + gulp: '>=4' dependencies: chalk: 2.4.2 fancy-log: 1.3.3 - gulp: 4.0.2 plur: 3.1.1 stringify-object: 3.3.0 through2: 2.0.5 tildify: 1.2.0 dev: false - engines: - node: '>=6' + + /gulp-debug/4.0.0_gulp@4.0.2: + resolution: {integrity: sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g==} + engines: {node: '>=6'} peerDependencies: gulp: '>=4' - resolution: - integrity: sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g== - /gulp-eslint/6.0.0: dependencies: - eslint: 6.6.0 + chalk: 2.4.2 fancy-log: 1.3.3 - plugin-error: 1.0.1 + gulp: 4.0.2 + plur: 3.1.1 + stringify-object: 3.3.0 + through2: 2.0.5 + tildify: 1.2.0 dev: false - resolution: - integrity: sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig== - /gulp-jsdoc3/2.0.0: + + /gulp-eslint/6.0.0: + resolution: {integrity: sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==} dependencies: - ansi-colors: 1.1.0 - beeper: 1.1.1 - bluebird: 3.7.1 - debug: 3.2.6 + eslint: 6.6.0 fancy-log: 1.3.3 - ink-docstrap: 1.3.2 - jsdoc: 3.6.3 - map-stream: 0.0.7 - tmp: 0.0.33 + plugin-error: 1.0.1 + transitivePeerDependencies: + - supports-color dev: false - resolution: - integrity: sha512-R0US0cHc5v/u8/g9oQ4/4hXEl/QqFcU3/sladKWlTpDUJPDIkeLNHZpq9PFqnuNvC2yZ/Pegs2KpgUmFghZUIg== + /gulp-rename/1.4.0: + resolution: {integrity: sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg== - /gulp-replace/0.6.1: - dependencies: - istextorbinary: 1.0.2 - readable-stream: 2.3.6 - replacestream: 4.0.3 - dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY= + /gulp-shell/0.7.1: + resolution: {integrity: sha512-5dKf1eJDdBiUS4LKCt4tm9IkDnWeXKGCKjQG5EJj/bVeVOisAPse5RLxccGh1OtfbzQdOWCywu936DTB8isZRw==} + engines: {node: '>=6.0.0'} dependencies: chalk: 2.4.2 fancy-log: 1.3.3 lodash.template: 4.5.0 plugin-error: 1.0.1 - through2: 3.0.1 - tslib: 1.10.0 + through2: 3.0.2 + tslib: 1.14.1 dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-5dKf1eJDdBiUS4LKCt4tm9IkDnWeXKGCKjQG5EJj/bVeVOisAPse5RLxccGh1OtfbzQdOWCywu936DTB8isZRw== + /gulp/4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true dependencies: - glob-watcher: 5.0.3 - gulp-cli: 2.2.0 - undertaker: 1.2.1 + glob-watcher: 5.0.5 + gulp-cli: 2.3.0 + undertaker: 1.3.0 vinyl-fs: 3.0.3 dev: false - engines: - node: '>= 0.10' - hasBin: true - resolution: - integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== + /gulplog/1.0.0: + resolution: {integrity: sha1-4oxNRdBey77YGDY86PnFkmIp/+U=} + engines: {node: '>= 0.10'} dependencies: glogg: 1.0.2 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-4oxNRdBey77YGDY86PnFkmIp/+U= - /handlebars/4.5.3: + + /handlebars/4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true dependencies: - neo-async: 2.6.1 - optimist: 0.6.1 + minimist: 1.2.5 + neo-async: 2.6.2 source-map: 0.6.1 - dev: false - engines: - node: '>=0.4.7' - hasBin: true + wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.7.0 - resolution: - integrity: sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== + uglify-js: 3.14.2 + dev: false + /har-schema/2.0.0: + resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - /har-validator/5.1.3: + + /har-validator/5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported dependencies: - ajv: 6.10.2 + ajv: 6.12.6 har-schema: 2.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + /has-ansi/2.0.0: + resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} + engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + + /has-bigints/1.0.1: + resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} + dev: false + /has-flag/1.0.0: + resolution: {integrity: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + /has-flag/3.0.0: + resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - /has-symbols/1.0.1: + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + + /has-symbols/1.0.2: + resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: false + /has-unicode/2.0.1: + resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} dev: false optional: true - resolution: - integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + /has-value/0.3.1: + resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=} + engines: {node: '>=0.10.0'} dependencies: get-value: 2.0.6 has-values: 0.1.4 isobject: 2.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + /has-value/1.0.0: + resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} + engines: {node: '>=0.10.0'} dependencies: get-value: 2.0.6 has-values: 1.0.0 isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + /has-values/0.1.4: + resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E= + /has-values/1.0.0: + resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} + engines: {node: '>=0.10.0'} dependencies: is-number: 3.0.0 kind-of: 4.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: false - engines: - node: '>= 0.4.0' - resolution: - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + /hash.js/1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: false - resolution: - integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + /hasha/3.0.0: + resolution: {integrity: sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=} + engines: {node: '>=4'} dependencies: is-stream: 1.1.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk= - /he/1.2.0: + + /hasha/5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 dev: false + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - resolution: - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + dev: false + /hmac-drbg/1.0.1: + resolution: {integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 dev: false - resolution: - integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - /hosted-git-info/2.8.5: + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: false - resolution: - integrity: sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - /htmlparser2/3.10.1: - dependencies: - domelementtype: 1.3.1 - domhandler: 2.4.2 - domutils: 1.7.0 - entities: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.4.0 + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: false - resolution: - integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - /http-errors/1.7.3: + + /htmlparser2/4.1.0: + resolution: {integrity: sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==} dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.1.1 - statuses: 1.5.0 - toidentifier: 1.0.0 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - /http-proxy-agent/2.1.0: - dependencies: - agent-base: 4.3.0 - debug: 3.1.0 - dev: false - engines: - node: '>= 4.5.0' - resolution: - integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + domelementtype: 2.2.0 + domhandler: 3.3.0 + domutils: 2.8.0 + entities: 2.2.0 + dev: false + /http-signature/1.2.0: + resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} + engines: {node: '>=0.8', npm: '>=1.3.7'} dependencies: assert-plus: 1.0.0 jsprim: 1.4.1 sshpk: 1.16.1 dev: false - engines: - node: '>=0.8' - npm: '>=1.3.7' - resolution: - integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - /https-proxy-agent/3.0.1: - dependencies: - agent-base: 4.3.0 - debug: 3.2.6 - dev: false - engines: - node: '>= 4.5.0' - resolution: - integrity: sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /ignore/3.3.10: + resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} dev: false - resolution: - integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + /ignore/4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} dev: false - engines: - node: '>= 4' - resolution: - integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - /immediate/3.0.6: - dev: false - resolution: - integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= - /import-fresh/3.2.1: + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - /import-lazy/2.1.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + /imurmurhash/0.1.4: + resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + engines: {node: '>=0.8.19'} + dev: false + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} dev: false - engines: - node: '>=0.8.19' - resolution: - integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= + /inflight/1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: false - resolution: - integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false - resolution: - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - /ini/1.3.5: + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - resolution: - integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + /ink-docstrap/1.3.2: + resolution: {integrity: sha512-STx5orGQU1gfrkoI/fMU7lX6CSP7LBGO10gXNgOZhwKhUqbtNjCkYSewJtNnLmWP1tAGN6oyEpG1HFPw5vpa5Q==} dependencies: - moment: 2.24.0 - sanitize-html: 1.20.1 + moment: 2.29.1 + sanitize-html: 1.27.5 dev: false - resolution: - integrity: sha512-STx5orGQU1gfrkoI/fMU7lX6CSP7LBGO10gXNgOZhwKhUqbtNjCkYSewJtNnLmWP1tAGN6oyEpG1HFPw5vpa5Q== + /inquirer/3.3.0: + resolution: {integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==} dependencies: ansi-escapes: 3.2.0 chalk: 2.4.2 cli-cursor: 2.1.0 - cli-width: 2.2.0 + cli-width: 2.2.1 external-editor: 2.2.0 figures: 2.0.0 - lodash: 4.17.15 + lodash: 4.17.21 mute-stream: 0.0.7 - run-async: 2.3.0 + run-async: 2.4.1 rx-lite: 4.0.8 rx-lite-aggregates: 4.0.8 string-width: 2.1.1 strip-ansi: 4.0.0 through: 2.3.8 dev: false - resolution: - integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - /inquirer/6.5.2: - dependencies: - ansi-escapes: 3.2.0 - chalk: 2.4.2 - cli-cursor: 2.1.0 - cli-width: 2.2.0 - external-editor: 3.1.0 - figures: 2.0.0 - lodash: 4.17.15 - mute-stream: 0.0.7 - run-async: 2.3.0 - rxjs: 6.5.3 - string-width: 2.1.1 - strip-ansi: 5.2.0 - through: 2.3.8 - dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - /inquirer/7.0.0: + + /inquirer/7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} dependencies: - ansi-escapes: 4.3.0 - chalk: 2.4.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 cli-cursor: 3.1.0 - cli-width: 2.2.0 + cli-width: 3.0.0 external-editor: 3.1.0 - figures: 3.1.0 - lodash: 4.17.15 + figures: 3.2.0 + lodash: 4.17.21 mute-stream: 0.0.8 - run-async: 2.3.0 - rxjs: 6.5.3 - string-width: 4.2.0 - strip-ansi: 5.2.0 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 through: 2.3.8 dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== - /interpret/1.2.0: + + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: false + + /interpret/1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + /invariant/2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 dev: false - resolution: - integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + /invert-kv/1.0.0: + resolution: {integrity: sha1-EEqOSqym09jNFXqO+L+rLXo//bY=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + /ip/1.1.5: + resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} dev: false - resolution: - integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + /irregular-plurals/2.0.0: + resolution: {integrity: sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== + /is-absolute/1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} dependencies: is-relative: 1.0.0 is-windows: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + /is-accessor-descriptor/0.1.6: + resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + /is-accessor-descriptor/1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} dependencies: - kind-of: 6.0.2 + kind-of: 6.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + /is-arrayish/0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: false - resolution: - integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.1 dev: false - resolution: - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + /is-binary-path/1.0.1: + resolution: {integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=} + engines: {node: '>=0.10.0'} dependencies: binary-extensions: 1.13.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false - resolution: - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - /is-buffer/2.0.4: + + /is-buffer/2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - /is-callable/1.1.4: + + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - /is-ci/1.2.1: + + /is-core-module/2.7.0: + resolution: {integrity: sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==} dependencies: - ci-info: 1.6.0 + has: 1.0.3 dev: false - hasBin: true - resolution: - integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + /is-data-descriptor/0.1.4: + resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + /is-data-descriptor/1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} dependencies: - kind-of: 6.0.2 + kind-of: 6.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - /is-date-object/1.0.1: + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + /is-descriptor/0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} dependencies: is-accessor-descriptor: 0.1.6 is-data-descriptor: 0.1.4 kind-of: 5.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + /is-descriptor/1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} dependencies: is-accessor-descriptor: 1.0.0 is-data-descriptor: 1.0.0 - kind-of: 6.0.2 + kind-of: 6.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + /is-dotfile/1.0.3: + resolution: {integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + /is-equal-shallow/0.1.3: + resolution: {integrity: sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=} + engines: {node: '>=0.10.0'} dependencies: is-primitive: 2.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + /is-extendable/0.1.1: + resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + /is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + /is-extglob/1.0.0: + resolution: {integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + /is-extglob/2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - /is-finite/1.0.2: - dependencies: - number-is-nan: 1.0.1 + + /is-finite/1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + /is-fullwidth-code-point/1.0.0: + resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=} + engines: {node: '>=0.10.0'} dependencies: number-is-nan: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + /is-fullwidth-code-point/2.0.0: + resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + /is-glob/2.0.1: + resolution: {integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + /is-glob/3.1.0: + resolution: {integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - /is-glob/4.0.1: + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - /is-installed-globally/0.1.0: - dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + /is-negated-glob/1.0.0: + resolution: {integrity: sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= - /is-npm/1.0.0: + + /is-negative-zero/2.0.1: + resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==} + engines: {node: '>= 0.4'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + + /is-number-object/1.0.6: + resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + /is-number/2.1.0: + resolution: {integrity: sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + /is-number/3.0.0: + resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + /is-number/4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + /is-obj/1.0.1: + resolution: {integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + /is-path-cwd/1.0.0: + resolution: {integrity: sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + /is-path-in-cwd/1.0.1: + resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==} + engines: {node: '>=0.10.0'} dependencies: is-path-inside: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + /is-path-inside/1.0.1: + resolution: {integrity: sha1-jvW33lBDej/cprToZe96pVy0gDY=} + engines: {node: '>=0.10.0'} dependencies: path-is-inside: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-jvW33lBDej/cprToZe96pVy0gDY= + + /is-plain-obj/2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: false + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + /is-posix-bracket/0.1.1: + resolution: {integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + /is-primitive/2.0.0: + resolution: {integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - /is-promise/2.1.0: - dev: false - resolution: - integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - /is-redirect/1.0.0: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - /is-regex/1.0.4: + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: - has: 1.0.3 + call-bind: 1.0.2 + has-tostringtag: 1.0.0 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + /is-regexp/1.0.0: + resolution: {integrity: sha1-/S2INUXEa6xaYz57mgnof6LLUGk=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + /is-relative/1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} dependencies: is-unc-path: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + /is-resolvable/1.1.0: + resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} dev: false - resolution: - integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - /is-retry-allowed/1.2.0: + + /is-shared-array-buffer/1.0.1: + resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - /is-ssh/1.3.1: - dependencies: - protocols: 1.4.7 - dev: false - resolution: - integrity: sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + /is-stream/1.1.0: + resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} + engines: {node: '>=0.10.0'} + dev: false + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - /is-symbol/1.0.3: + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.1 + has-symbols: 1.0.2 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + /is-typedarray/1.0.0: + resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} dev: false - resolution: - integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-unc-path/1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} dependencies: unc-path-regex: 0.1.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + + /is-unicode-supported/0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + /is-utf8/0.2.1: + resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=} dev: false - resolution: - integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + /is-valid-glob/1.0.0: + resolution: {integrity: sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= - /is-windows/1.0.2: + + /is-weakref/1.0.1: + resolution: {integrity: sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==} + dependencies: + call-bind: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - /is-wsl/1.1.0: + + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + /isarray/0.0.1: + resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=} dev: false - resolution: - integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + /isarray/1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} dev: false - resolution: - integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isexe/2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: false - resolution: - integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + /isobject/2.1.0: + resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=} + engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + /isobject/3.0.1: + resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + /isstream/0.1.2: + resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} dev: false - resolution: - integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /istanbul-api/1.3.7: + resolution: {integrity: sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==} dependencies: async: 2.6.3 fileset: 2.0.3 @@ -3967,37 +3821,47 @@ packages: istanbul-lib-report: 1.1.5 istanbul-lib-source-maps: 1.2.6 istanbul-reports: 1.5.1 - js-yaml: 3.13.1 - mkdirp: 0.5.1 + js-yaml: 3.14.1 + mkdirp: 0.5.5 once: 1.4.0 dev: false - resolution: - integrity: sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== + /istanbul-lib-coverage/1.2.1: + resolution: {integrity: sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==} dev: false - resolution: - integrity: sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + /istanbul-lib-coverage/2.0.5: + resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} + engines: {node: '>=6'} + dev: false + + /istanbul-lib-coverage/3.0.0: + resolution: {integrity: sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==} + engines: {node: '>=8'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + /istanbul-lib-hook/1.2.2: + resolution: {integrity: sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==} dependencies: append-transform: 0.4.0 dev: false - resolution: - integrity: sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== + /istanbul-lib-hook/2.0.7: + resolution: {integrity: sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==} + engines: {node: '>=6'} dependencies: append-transform: 1.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== + + /istanbul-lib-hook/3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + dependencies: + append-transform: 2.0.0 + dev: false + /istanbul-lib-instrument/1.10.2: + resolution: {integrity: sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==} dependencies: babel-generator: 6.26.1 babel-template: 6.26.0 @@ -4007,353 +3871,370 @@ packages: istanbul-lib-coverage: 1.2.1 semver: 5.7.1 dev: false - resolution: - integrity: sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + /istanbul-lib-instrument/3.3.0: - dependencies: - '@babel/generator': 7.7.4 - '@babel/parser': 7.7.4 - '@babel/template': 7.7.4 - '@babel/traverse': 7.7.4 - '@babel/types': 7.7.4 + resolution: {integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==} + engines: {node: '>=6'} + dependencies: + '@babel/generator': 7.15.8 + '@babel/parser': 7.15.8 + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 istanbul-lib-coverage: 2.0.5 semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /istanbul-lib-instrument/4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.15.8 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.0.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + + /istanbul-lib-processinfo/2.0.2: + resolution: {integrity: sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==} + engines: {node: '>=8'} + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.0.0 + make-dir: 3.1.0 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 3.4.0 + dev: false + /istanbul-lib-report/1.1.5: + resolution: {integrity: sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==} dependencies: istanbul-lib-coverage: 1.2.1 - mkdirp: 0.5.1 - path-parse: 1.0.6 + mkdirp: 0.5.5 + path-parse: 1.0.7 supports-color: 3.2.3 dev: false - resolution: - integrity: sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== + /istanbul-lib-report/2.0.8: + resolution: {integrity: sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==} + engines: {node: '>=6'} dependencies: istanbul-lib-coverage: 2.0.5 make-dir: 2.1.0 supports-color: 6.1.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.0.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: false + /istanbul-lib-source-maps/1.2.6: + resolution: {integrity: sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==} dependencies: - debug: 3.2.6 + debug: 3.2.7 istanbul-lib-coverage: 1.2.1 - mkdirp: 0.5.1 + mkdirp: 0.5.5 rimraf: 2.7.1 source-map: 0.5.7 dev: false - resolution: - integrity: sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== + /istanbul-lib-source-maps/3.0.6: + resolution: {integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==} + engines: {node: '>=6'} dependencies: - debug: 4.1.1 + debug: 4.3.2 istanbul-lib-coverage: 2.0.5 make-dir: 2.1.0 rimraf: 2.7.1 source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: false + + /istanbul-lib-source-maps/4.0.0: + resolution: {integrity: sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==} + engines: {node: '>=8'} + dependencies: + debug: 4.3.2 + istanbul-lib-coverage: 3.0.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + /istanbul-reports/1.5.1: + resolution: {integrity: sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==} dependencies: - handlebars: 4.5.3 + handlebars: 4.7.7 dev: false - resolution: - integrity: sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== - /istanbul-reports/2.2.6: + + /istanbul-reports/2.2.7: + resolution: {integrity: sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==} + engines: {node: '>=6'} dependencies: - handlebars: 4.5.3 + html-escaper: 2.0.2 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - /istextorbinary/1.0.2: + + /istanbul-reports/3.0.3: + resolution: {integrity: sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==} + engines: {node: '>=8'} dependencies: - binaryextensions: 1.0.1 - textextensions: 1.0.2 + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 dev: false - engines: - node: '>=0.4' - resolution: - integrity: sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8= - /js-beautify/1.10.2: + + /js-beautify/1.14.0: + resolution: {integrity: sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==} + engines: {node: '>=10'} + hasBin: true dependencies: - config-chain: 1.1.12 + config-chain: 1.1.13 editorconfig: 0.15.3 - glob: 7.1.6 - mkdirp: 0.5.1 - nopt: 4.0.1 + glob: 7.2.0 + nopt: 5.0.0 dev: false - hasBin: true - resolution: - integrity: sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== + /js-tokens/3.0.2: + resolution: {integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls=} dev: false - resolution: - integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls= + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: false - resolution: - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + /js-yaml/3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 dev: false + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - resolution: - integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - /js2xmlparser/4.0.0: dependencies: - xmlcreate: 2.0.1 + argparse: 2.0.1 + dev: false + + /js2xmlparser/4.0.1: + resolution: {integrity: sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==} + dependencies: + xmlcreate: 2.0.3 dev: false - resolution: - integrity: sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw== + /jsbn/0.1.1: + resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} dev: false - resolution: - integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - /jsdoc/3.6.3: + + /jsdoc/3.6.7: + resolution: {integrity: sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw==} + engines: {node: '>=8.15.0'} + hasBin: true dependencies: - '@babel/parser': 7.7.4 - bluebird: 3.7.1 - catharsis: 0.8.11 + '@babel/parser': 7.15.8 + bluebird: 3.7.2 + catharsis: 0.9.0 escape-string-regexp: 2.0.0 - js2xmlparser: 4.0.0 + js2xmlparser: 4.0.1 klaw: 3.0.0 - markdown-it: 8.4.2 - markdown-it-anchor: 5.2.5_markdown-it@8.4.2 - marked: 0.7.0 - mkdirp: 0.5.1 + markdown-it: 10.0.0 + markdown-it-anchor: 5.3.0_markdown-it@10.0.0 + marked: 2.1.3 + mkdirp: 1.0.4 requizzle: 0.2.3 - strip-json-comments: 3.0.1 + strip-json-comments: 3.1.1 taffydb: 2.6.2 - underscore: 1.9.1 + underscore: 1.13.1 dev: false - engines: - node: '>=8.15.0' - hasBin: true - resolution: - integrity: sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A== + /jsesc/1.3.0: - dev: false + resolution: {integrity: sha1-RsP+yMGJKxKwgz25vHYiF226s0s=} hasBin: true - resolution: - integrity: sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - /jsesc/2.5.2: dev: false - engines: - node: '>=4' + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} hasBin: true - resolution: - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + dev: false + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: false - resolution: - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + /json-schema-migrate/0.2.0: + resolution: {integrity: sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y=} dependencies: ajv: 5.5.2 dev: false - resolution: - integrity: sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y= + /json-schema-traverse/0.3.1: + resolution: {integrity: sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=} dev: false - resolution: - integrity: sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: false - resolution: - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema/0.2.3: + resolution: {integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=} dev: false - resolution: - integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} dev: false - resolution: - integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + /json-stringify-safe/5.0.1: + resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} dev: false - resolution: - integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - /jsonfile/4.0.0: + + /json5/2.2.0: + resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + minimist: 1.2.5 dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.3 - resolution: - integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + graceful-fs: 4.2.8 + dev: false + /jsprim/1.4.1: + resolution: {integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=} + engines: {'0': node >=0.6.0} dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 json-schema: 0.2.3 verror: 1.10.0 dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - /jsrsasign/8.0.12: + + /jsrsasign/10.4.1: + resolution: {integrity: sha512-g2CP2nb8xKdmfZhuHaJEz1zVYTsZc+lUjLFvgbMX35/cUALK0G15sQfCbCpDg/UivkjCNlq0lV6FxCfPhv0shw==} dev: false - resolution: - integrity: sha1-Iqu5ZW00owuVMENnIINeicLlwxY= + /jsverify/0.8.4: + resolution: {integrity: sha512-nUG73Sfi8L4eOkc7pv9sflgAm43v+z6XMuePGVdRoBUxBLJiVcMcf3Xgc4h19eHHF3JwsaagOkUu825UnPBLJw==} + engines: {node: '>= 0.8.0'} dependencies: lazy-seq: 1.0.0 rc4: 0.1.5 trampa: 1.0.1 typify-parser: 1.1.0 dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha512-nUG73Sfi8L4eOkc7pv9sflgAm43v+z6XMuePGVdRoBUxBLJiVcMcf3Xgc4h19eHHF3JwsaagOkUu825UnPBLJw== - /jszip/3.2.2: - dependencies: - lie: 3.3.0 - pako: 1.0.10 - readable-stream: 2.3.6 - set-immediate-shim: 1.0.1 - dev: false - resolution: - integrity: sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA== - /just-debounce/1.0.0: + + /just-debounce/1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} dev: false - resolution: - integrity: sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= - /just-extend/4.0.2: + + /just-extend/4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} dev: false - resolution: - integrity: sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== - /kind-of/2.0.1: - dependencies: - is-buffer: 1.1.6 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + /kind-of/3.2.2: + resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} + engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + /kind-of/4.0.0: + resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} + engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + /kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - /kind-of/6.0.2: + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + /klaw/3.0.0: + resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 dev: false - resolution: - integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - /kuler/1.0.1: - dependencies: - colornames: 1.1.1 + + /kuler/2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} dev: false - resolution: - integrity: sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== + /last-run/1.1.1: + resolution: {integrity: sha1-RblpQsF7HHnHchmCWbqUO+v4yls=} + engines: {node: '>= 0.10'} dependencies: default-resolution: 2.0.0 es6-weak-map: 2.0.3 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-RblpQsF7HHnHchmCWbqUO+v4yls= - /latest-version/3.1.0: - dependencies: - package-json: 4.0.1 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - /lazy-cache/0.2.7: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + /lazy-seq/1.0.0: + resolution: {integrity: sha1-iAy4qrJWAmOC4C9T7AiWgqdMW2o=} + engines: {node: '>= 0.10.0'} dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha1-iAy4qrJWAmOC4C9T7AiWgqdMW2o= + /lazystream/1.0.0: + resolution: {integrity: sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=} + engines: {node: '>= 0.6.3'} dependencies: - readable-stream: 2.3.6 + readable-stream: 2.3.7 dev: false - engines: - node: '>= 0.6.3' - resolution: - integrity: sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + /lcid/1.0.0: + resolution: {integrity: sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=} + engines: {node: '>=0.10.0'} dependencies: invert-kv: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + /lead/1.0.0: + resolution: {integrity: sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=} + engines: {node: '>= 0.10'} dependencies: flush-write-stream: 1.1.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + /levn/0.3.0: + resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - /lie/3.3.0: - dependencies: - immediate: 3.0.6 - dev: false - resolution: - integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + /liftoff/3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} dependencies: extend: 3.0.2 findup-sync: 3.0.0 @@ -4362,302 +4243,250 @@ packages: is-plain-object: 2.0.4 object.map: 1.0.1 rechoir: 0.6.2 - resolve: 1.13.1 + resolve: 1.20.0 dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + /linkify-it/2.2.0: + resolution: {integrity: sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==} dependencies: uc.micro: 1.0.6 dev: false - resolution: - integrity: sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + /load-json-file/1.1.0: + resolution: {integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=} + engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + /load-json-file/4.0.0: + resolution: {integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs=} + engines: {node: '>=4'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} dependencies: p-locate: 3.0.0 path-exists: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - /lodash._reinterpolate/3.0.0: + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 dev: false - resolution: - integrity: sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - /lodash.assign/4.2.0: + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 dev: false - resolution: - integrity: sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - /lodash.assignin/4.2.0: + + /lodash._reinterpolate/3.0.0: + resolution: {integrity: sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=} dev: false - resolution: - integrity: sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + /lodash.camelcase/4.3.0: + resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} dev: false - resolution: - integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - /lodash.clone/4.5.0: - dev: false - resolution: - integrity: sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= - /lodash.clonedeep/4.5.0: - dev: false - resolution: - integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - /lodash.escaperegexp/4.1.2: - dev: false - resolution: - integrity: sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - /lodash.flatten/4.4.0: - dev: false - resolution: - integrity: sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + /lodash.flattendeep/4.4.0: + resolution: {integrity: sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=} dev: false - resolution: - integrity: sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + /lodash.get/4.4.2: + resolution: {integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=} dev: false - resolution: - integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + /lodash.includes/4.3.0: + resolution: {integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=} dev: false - resolution: - integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + /lodash.isarguments/3.1.0: + resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} dev: false - resolution: - integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= - /lodash.isplainobject/4.0.6: - dev: false - resolution: - integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - /lodash.isstring/4.0.1: - dev: false - resolution: - integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - /lodash.mergewith/4.6.2: - dev: false - resolution: - integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - /lodash.set/4.3.2: - dev: false - resolution: - integrity: sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + /lodash.template/4.5.0: + resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} dependencies: lodash._reinterpolate: 3.0.0 lodash.templatesettings: 4.2.0 dev: false - resolution: - integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + /lodash.templatesettings/4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} dependencies: lodash._reinterpolate: 3.0.0 dev: false - resolution: - integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - /lodash/4.17.15: + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false - resolution: - integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + /log-symbols/2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} dependencies: chalk: 2.4.2 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - /logform/2.1.2: + + /log-symbols/4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /logform/2.3.0: + resolution: {integrity: sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==} dependencies: colors: 1.4.0 - fast-safe-stringify: 2.0.7 - fecha: 2.3.3 - ms: 2.1.2 + fecha: 4.2.1 + ms: 2.1.3 + safe-stable-stringify: 1.1.1 triple-beam: 1.3.0 dev: false - resolution: - integrity: sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== + /lolex/4.2.0: + resolution: {integrity: sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==} dev: false - resolution: - integrity: sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== - /long/3.2.0: + + /lolex/5.1.2: + resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + dependencies: + '@sinonjs/commons': 1.8.3 dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - resolution: - integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: js-tokens: 4.0.0 dev: false - hasBin: true - resolution: - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - /lowercase-keys/1.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 dev: false - resolution: - integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - /lru-cache/5.1.1: - dependencies: - yallist: 3.1.1 - dev: false - resolution: - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - /macos-release/2.3.0: - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== - /make-dir/1.3.0: - dependencies: - pify: 3.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} dependencies: pify: 4.0.1 semver: 5.7.1 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: false + /make-iterator/1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} dependencies: - kind-of: 6.0.2 + kind-of: 6.0.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + /map-cache/0.2.2: + resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - /map-stream/0.0.7: - dev: false - resolution: - integrity: sha1-ih8HiW2CsQkmvTdEokIACfiJdKg= + /map-visit/1.0.0: + resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} + engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - /markdown-it-anchor/5.2.5_markdown-it@8.4.2: - dependencies: - markdown-it: 8.4.2 - dev: false + + /markdown-it-anchor/5.3.0_markdown-it@10.0.0: + resolution: {integrity: sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==} peerDependencies: markdown-it: '*' - resolution: - integrity: sha512-xLIjLQmtym3QpoY9llBgApknl7pxAcN3WDRc2d3rwpl+/YvDZHPmKscGs+L6E05xf2KrCXPBvosWt7MZukwSpQ== - /markdown-it/8.4.2: + dependencies: + markdown-it: 10.0.0 + dev: false + + /markdown-it/10.0.0: + resolution: {integrity: sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==} + hasBin: true dependencies: argparse: 1.0.10 - entities: 1.1.2 + entities: 2.0.3 linkify-it: 2.2.0 mdurl: 1.0.1 uc.micro: 1.0.6 dev: false + + /marked/2.1.3: + resolution: {integrity: sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==} + engines: {node: '>= 10'} hasBin: true - resolution: - integrity: sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== - /marked/0.7.0: dev: false - engines: - node: '>=0.10.0' - hasBin: true - resolution: - integrity: sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== + /matchdep/2.0.0: + resolution: {integrity: sha1-xvNINKDY28OzfCfui7yyfHd1WC4=} + engines: {node: '>= 0.10.0'} dependencies: findup-sync: 2.0.0 micromatch: 3.1.10 - resolve: 1.13.1 + resolve: 1.20.0 stack-trace: 0.0.10 dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + /math-random/1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} dev: false - resolution: - integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - /md5/2.2.1: + + /md5/2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: charenc: 0.0.2 crypt: 0.0.2 is-buffer: 1.1.6 dev: false - resolution: - integrity: sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + /mdurl/1.0.1: + resolution: {integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=} dev: false - resolution: - integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + /merge-source-map/1.1.0: + resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} dependencies: source-map: 0.6.1 dev: false - resolution: - integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: false - resolution: - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + /micromatch/2.3.11: + resolution: {integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=} + engines: {node: '>=0.10.0'} dependencies: arr-diff: 2.0.0 array-unique: 0.2.1 @@ -4673,11 +4502,10 @@ packages: parse-glob: 3.0.4 regex-cache: 0.4.4 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + /micromatch/3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -4686,108 +4514,104 @@ packages: extend-shallow: 3.0.2 extglob: 2.0.4 fragment-cache: 0.2.1 - kind-of: 6.0.2 + kind-of: 6.0.3 nanomatch: 1.2.13 object.pick: 1.3.0 regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - /mime-db/1.42.0: + + /mime-db/1.50.0: + resolution: {integrity: sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==} + engines: {node: '>= 0.6'} dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== - /mime-types/2.1.25: + + /mime-types/2.1.33: + resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==} + engines: {node: '>= 0.6'} dependencies: - mime-db: 1.42.0 + mime-db: 1.50.0 dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + /mimic-fn/1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + /minimalistic-assert/1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: false - resolution: - integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + /minimalistic-crypto-utils/1.0.1: + resolution: {integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=} dev: false - resolution: - integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 dev: false - resolution: - integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - /minimist/0.0.10: - dev: false - resolution: - integrity: sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + /minimist/0.0.8: + resolution: {integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=} dev: false - resolution: - integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - /minimist/1.2.0: + + /minimist/1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} dev: false - resolution: - integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + /mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} dependencies: for-in: 1.0.2 is-extendable: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - /mixin-object/2.0.1: - dependencies: - for-in: 0.1.8 - is-extendable: 0.1.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + /mkdirp/0.5.1: + resolution: {integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=} + deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) + hasBin: true dependencies: minimist: 0.0.8 dev: false + + /mkdirp/0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} hasBin: true - resolution: - integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist: 1.2.5 + dev: false + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + /mocha-junit-reporter/1.23.1_mocha@6.2.2: + resolution: {integrity: sha512-qeDvKlZyAH2YJE1vhryvjUQ06t2hcnwwu4k5Ddwn0GQINhgEYFhlGM0DwYCVUHq5cuo32qAW6HDsTHt7zz99Ng==} + peerDependencies: + mocha: '>=2.2.5' dependencies: debug: 2.6.9 - md5: 2.2.1 - mkdirp: 0.5.1 + md5: 2.3.0 + mkdirp: 0.5.5 mocha: 6.2.2 strip-ansi: 4.0.0 xml: 1.0.1 dev: false - peerDependencies: - mocha: '>=2.2.5' - resolution: - integrity: sha512-qeDvKlZyAH2YJE1vhryvjUQ06t2hcnwwu4k5Ddwn0GQINhgEYFhlGM0DwYCVUHq5cuo32qAW6HDsTHt7zz99Ng== + /mocha/6.2.2: + resolution: {integrity: sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==} + engines: {node: '>= 6.0.0'} + hasBin: true dependencies: ansi-colors: 3.2.3 browser-stdout: 1.3.1 @@ -4813,50 +4637,90 @@ packages: yargs-parser: 13.1.1 yargs-unparser: 1.6.0 dev: false - engines: - node: '>= 6.0.0' + + /mocha/9.1.2: + resolution: {integrity: sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==} + engines: {node: '>= 12.0.0'} hasBin: true - resolution: - integrity: sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== + dependencies: + '@ungap/promise-all-settled': 1.1.2 + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.2 + debug: 4.3.2_supports-color@8.1.1 + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.1.7 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 3.0.4 + ms: 2.1.3 + nanoid: 3.1.25 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + which: 2.0.2 + workerpool: 6.1.5 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + dev: false + /mockery/2.1.0: + resolution: {integrity: sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==} dev: false - resolution: - integrity: sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA== - /moment/2.24.0: + + /moment/2.29.1: + resolution: {integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==} dev: false - resolution: - integrity: sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + /ms/2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} dev: false - resolution: - integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /ms/2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} dev: false - resolution: - integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false - resolution: - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + /mute-stdout/1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + /mute-stream/0.0.7: + resolution: {integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=} dev: false - resolution: - integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + /mute-stream/0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: false - resolution: - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - /nan/2.14.0: + + /nan/2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + requiresBuild: true dev: false - resolution: - integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + optional: true + + /nanoid/3.1.25: + resolution: {integrity: sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + /nanomatch/1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -4864,813 +4728,742 @@ packages: extend-shallow: 3.0.2 fragment-cache: 0.2.1 is-windows: 1.0.2 - kind-of: 6.0.2 + kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + /natural-compare/1.4.0: + resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} dev: false - resolution: - integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - /nconf/0.10.0: - dependencies: - async: 1.5.2 - ini: 1.3.5 - secure-keys: 1.0.0 - yargs: 3.32.0 - dev: false - engines: - node: '>= 0.4.0' - resolution: - integrity: sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q== - /needle/2.4.0: - dependencies: - debug: 3.2.6 - iconv-lite: 0.4.24 - sax: 1.2.4 + + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false - engines: - node: '>= 4.4.x' - hasBin: true - resolution: - integrity: sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - /neo-async/2.6.1: - dev: false - resolution: - integrity: sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + /nested-error-stacks/2.1.0: + resolution: {integrity: sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==} dev: false - resolution: - integrity: sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== - /netmask/1.0.6: - dev: false - engines: - node: '>= 0.4.0' - resolution: - integrity: sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= + /next-tick/1.0.0: + resolution: {integrity: sha1-yobR/ogoFpsBICCOPchCS524NCw=} dev: false - resolution: - integrity: sha1-yobR/ogoFpsBICCOPchCS524NCw= + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false - resolution: - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - /nise/1.5.2: + + /nise/1.5.3: + resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} dependencies: '@sinonjs/formatio': 3.2.2 '@sinonjs/text-encoding': 0.7.1 - just-extend: 4.0.2 - lolex: 4.2.0 + just-extend: 4.2.1 + lolex: 5.1.2 path-to-regexp: 1.8.0 dev: false - resolution: - integrity: sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== + + /nise/5.1.0: + resolution: {integrity: sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==} + dependencies: + '@sinonjs/commons': 1.8.3 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/text-encoding': 0.7.1 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: false + /node-environment-flags/1.0.5: + resolution: {integrity: sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==} dependencies: - object.getownpropertydescriptors: 2.0.3 + object.getownpropertydescriptors: 2.1.3 semver: 5.7.1 dev: false - resolution: - integrity: sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== - /nopt/4.0.1: + + /node-preload/0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} dependencies: - abbrev: 1.1.1 - osenv: 0.1.5 + process-on-spawn: 1.0.0 dev: false + + /node-releases/1.1.77: + resolution: {integrity: sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==} + dev: false + + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} hasBin: true - resolution: - integrity: sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev: 1.1.1 + dev: false + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: - hosted-git-info: 2.8.5 - resolve: 1.13.1 + hosted-git-info: 2.8.9 + resolve: 1.20.0 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: false - resolution: - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + /normalize-path/2.1.1: + resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} + engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - /normalize-url/3.3.0: - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + /now-and-later/2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} dependencies: once: 1.4.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + /npm-cli-login/0.1.1: + resolution: {integrity: sha512-IWEsRe/f6VWcKWPuQYHNEyKF5SPLjxS5Lyn2W4/Gxx4lxZLzo2HKIJgibVAH/rVN80mi7r75ahKUmSNMFDulGQ==} + hasBin: true dependencies: npm-registry-client: 8.6.0 - snyk: 1.251.2 + snyk: 1.733.0 dev: false - hasBin: true - resolution: - integrity: sha512-IWEsRe/f6VWcKWPuQYHNEyKF5SPLjxS5Lyn2W4/Gxx4lxZLzo2HKIJgibVAH/rVN80mi7r75ahKUmSNMFDulGQ== + /npm-package-arg/6.1.1: + resolution: {integrity: sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==} dependencies: - hosted-git-info: 2.8.5 + hosted-git-info: 2.8.9 osenv: 0.1.5 semver: 5.7.1 validate-npm-package-name: 3.0.0 dev: false - resolution: - integrity: sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== + /npm-registry-client/8.6.0: + resolution: {integrity: sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==} dependencies: concat-stream: 1.6.2 - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 normalize-package-data: 2.5.0 npm-package-arg: 6.1.1 once: 1.4.0 - request: 2.88.0 + request: 2.88.2 retry: 0.10.1 - safe-buffer: 5.2.0 + safe-buffer: 5.2.1 semver: 5.7.1 slide: 1.1.6 ssri: 5.3.0 - dev: false optionalDependencies: npmlog: 4.1.2 - resolution: - integrity: sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg== - /npm-run-path/2.0.2: - dependencies: - path-key: 2.0.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + /npmlog/4.1.2: + resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + requiresBuild: true dependencies: - are-we-there-yet: 1.1.5 + are-we-there-yet: 1.1.7 console-control-strings: 1.1.0 gauge: 2.7.4 set-blocking: 2.0.0 dev: false optional: true - resolution: - integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + /number-is-nan/1.0.1: + resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + /nyc/14.1.1: + resolution: {integrity: sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==} + engines: {node: '>=6'} + hasBin: true dependencies: archy: 1.0.0 caching-transform: 3.0.2 - convert-source-map: 1.7.0 + convert-source-map: 1.8.0 cp-file: 6.2.0 find-cache-dir: 2.1.0 find-up: 3.0.0 foreground-child: 1.5.6 - glob: 7.1.6 + glob: 7.2.0 istanbul-lib-coverage: 2.0.5 istanbul-lib-hook: 2.0.7 istanbul-lib-instrument: 3.3.0 istanbul-lib-report: 2.0.8 istanbul-lib-source-maps: 3.0.6 - istanbul-reports: 2.2.6 - js-yaml: 3.13.1 + istanbul-reports: 2.2.7 + js-yaml: 3.14.1 make-dir: 2.1.0 merge-source-map: 1.1.0 resolve-from: 4.0.0 rimraf: 2.7.1 - signal-exit: 3.0.2 + signal-exit: 3.0.5 spawn-wrap: 1.4.3 test-exclude: 5.2.3 - uuid: 3.3.3 - yargs: 13.3.0 - yargs-parser: 13.1.1 - dev: false - engines: - node: '>=6' + uuid: 3.4.0 + yargs: 13.3.2 + yargs-parser: 13.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /nyc/15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} hasBin: true - resolution: - integrity: sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.8.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.0 + istanbul-lib-coverage: 3.0.0 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.2 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.0 + istanbul-reports: 3.0.3 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.5 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + dev: false + /oauth-sign/0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: false - resolution: - integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /object-assign/4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /object-copy/0.1.0: + resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=} + engines: {node: '>=0.10.0'} dependencies: copy-descriptor: 0.1.1 define-property: 0.2.5 kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - /object-hash/1.3.1: - dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== - /object-inspect/1.7.0: + + /object-inspect/1.11.0: + resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} dev: false - resolution: - integrity: sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + /object-visit/1.0.1: + resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} + engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + /object.assign/4.1.0: + resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.1.3 function-bind: 1.1.1 - has-symbols: 1.0.1 + has-symbols: 1.0.2 + object-keys: 1.1.1 + dev: false + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 object-keys: 1.1.1 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + /object.defaults/1.1.0: + resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} + engines: {node: '>=0.10.0'} dependencies: array-each: 1.0.1 array-slice: 1.1.0 for-own: 1.0.0 isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= - /object.getownpropertydescriptors/2.0.3: + + /object.getownpropertydescriptors/2.1.3: + resolution: {integrity: sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==} + engines: {node: '>= 0.8'} dependencies: + call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.16.2 + es-abstract: 1.19.1 dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + /object.map/1.0.1: + resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} + engines: {node: '>=0.10.0'} dependencies: for-own: 1.0.0 make-iterator: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + /object.omit/2.0.1: + resolution: {integrity: sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=} + engines: {node: '>=0.10.0'} dependencies: for-own: 0.1.5 is-extendable: 0.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + /object.pick/1.3.0: + resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} + engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + /object.reduce/1.0.1: + resolution: {integrity: sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=} + engines: {node: '>=0.10.0'} dependencies: for-own: 1.0.0 make-iterator: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + /once/1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: wrappy: 1.0.2 dev: false - resolution: - integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - /one-time/0.0.4: + + /one-time/1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 dev: false - resolution: - integrity: sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= + /onetime/2.0.1: + resolution: {integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=} + engines: {node: '>=4'} dependencies: mimic-fn: 1.2.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - /onetime/5.1.0: + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - /opn/5.5.0: - dependencies: - is-wsl: 1.1.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - /optimist/0.6.1: - dependencies: - minimist: 0.0.10 - wordwrap: 0.0.3 - dev: false - resolution: - integrity: sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} dependencies: - deep-is: 0.1.3 + deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.3.0 prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.3 dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - /optjs/3.2.2: - dev: false - resolution: - integrity: sha1-aabOicRCpEQDFBrS+bNwvVu29O4= + /ordered-read-streams/1.0.1: + resolution: {integrity: sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=} dependencies: - readable-stream: 2.3.6 + readable-stream: 2.3.7 dev: false - resolution: - integrity: sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + /os-homedir/1.0.2: + resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + /os-locale/1.4.0: + resolution: {integrity: sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=} + engines: {node: '>=0.10.0'} dependencies: lcid: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - /os-name/3.1.0: - dependencies: - macos-release: 2.3.0 - windows-release: 3.2.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + /os-tmpdir/1.0.2: + resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + /osenv/0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} dependencies: os-homedir: 1.0.2 os-tmpdir: 1.0.2 dev: false - resolution: - integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - /p-finally/1.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - /p-limit/2.2.1: + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} dependencies: - p-limit: 2.2.1 + p-limit: 2.3.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - /p-map/1.2.0: + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== - /p-try/2.2.0: + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - /pac-proxy-agent/3.0.1: - dependencies: - agent-base: 4.3.0 - debug: 4.1.1 - get-uri: 2.0.4 - http-proxy-agent: 2.1.0 - https-proxy-agent: 3.0.1 - pac-resolver: 3.0.0 - raw-body: 2.4.1 - socks-proxy-agent: 4.0.2 - dev: false - resolution: - integrity: sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ== - /pac-resolver/3.0.0: + + /p-map/1.2.0: + resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} + engines: {node: '>=4'} + dev: false + + /p-map/3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} dependencies: - co: 4.6.0 - degenerator: 1.0.4 - ip: 1.1.5 - netmask: 1.0.6 - thunkify: 2.1.2 + aggregate-error: 3.1.0 + dev: false + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} dev: false - resolution: - integrity: sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== + /package-hash/3.0.0: + resolution: {integrity: sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==} + engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 hasha: 3.0.0 lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== - /package-json/4.0.1: + + /package-hash/4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} dependencies: - got: 6.7.1 - registry-auth-token: 3.4.0 - registry-url: 3.1.0 - semver: 5.7.1 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - /pako/1.0.10: + graceful-fs: 4.2.8 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 dev: false - resolution: - integrity: sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + /parse-filepath/1.0.2: + resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} + engines: {node: '>=0.8'} dependencies: is-absolute: 1.0.0 map-cache: 0.2.2 path-root: 0.1.1 dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + /parse-glob/3.0.4: + resolution: {integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw=} + engines: {node: '>=0.10.0'} dependencies: glob-base: 0.3.0 is-dotfile: 1.0.3 is-extglob: 1.0.0 is-glob: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + /parse-json/2.2.0: + resolution: {integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=} + engines: {node: '>=0.10.0'} dependencies: error-ex: 1.3.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + /parse-json/4.0.0: + resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} + engines: {node: '>=4'} dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + /parse-node-version/1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + /parse-passwd/1.0.0: + resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - /parse-path/4.0.1: - dependencies: - is-ssh: 1.3.1 - protocols: 1.4.7 - dev: false - resolution: - integrity: sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== - /parse-url/5.0.1: - dependencies: - is-ssh: 1.3.1 - normalize-url: 3.3.0 - parse-path: 4.0.1 - protocols: 1.4.7 + + /parse-srcset/1.0.2: + resolution: {integrity: sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=} dev: false - resolution: - integrity: sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== + /pascalcase/0.1.1: + resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + /path-dirname/1.0.2: + resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=} dev: false - resolution: - integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + /path-exists/2.1.0: + resolution: {integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=} + engines: {node: '>=0.10.0'} dependencies: pinkie-promise: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + /path-exists/3.0.0: + resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + engines: {node: '>=4'} + dev: false + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + /path-is-absolute/1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-is-inside/1.0.2: + resolution: {integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=} dev: false - resolution: - integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + /path-key/2.0.1: + resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - /path-parse/1.0.6: + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} dev: false - resolution: - integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + /path-root-regex/0.1.2: + resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + /path-root/0.1.1: + resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} + engines: {node: '>=0.10.0'} dependencies: path-root-regex: 0.1.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + /path-to-regexp/1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} dependencies: isarray: 0.0.1 dev: false - resolution: - integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + /path-type/1.1.0: + resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=} + engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 pify: 2.3.0 pinkie-promise: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} dependencies: pify: 3.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - /pathval/1.1.0: + + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: false - resolution: - integrity: sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + /performance-now/2.1.0: + resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + dev: false + + /picocolors/0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: false + + /picomatch/2.3.0: + resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} + engines: {node: '>=8.6'} dev: false - resolution: - integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /pify/2.3.0: + resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + /pify/3.0.0: + resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + /pinkie-promise/2.0.1: + resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} + engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o= + /pinkie/2.0.4: + resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + /pkg-dir/3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} dependencies: find-up: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + /plugin-error/1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} dependencies: ansi-colors: 1.1.0 arr-diff: 4.0.0 arr-union: 3.1.0 extend-shallow: 3.0.2 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + /plur/3.1.1: + resolution: {integrity: sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==} + engines: {node: '>=6'} dependencies: irregular-plurals: 2.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w== + /pluralize/7.0.0: + resolution: {integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + /posix-character-classes/0.1.1: + resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - /postcss/7.0.23: + + /postcss/7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} dependencies: - chalk: 2.4.2 + picocolors: 0.2.1 source-map: 0.6.1 - supports-color: 6.1.0 dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== + /prelude-ls/1.1.2: + resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} + engines: {node: '>= 0.8.0'} dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - /prepend-http/1.0.4: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + /preserve/0.2.0: + resolution: {integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + /pretty-hrtime/1.0.3: + resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} + engines: {node: '>= 0.8'} dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - resolution: - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - /progress/2.0.3: - dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - /promise/7.3.1: + + /process-on-spawn/1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} dependencies: - asap: 2.0.6 + fromentries: 1.3.2 dev: false - resolution: - integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - /proto-list/1.2.4: + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} dev: false - resolution: - integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - /protobufjs/5.0.3: - dependencies: - ascli: 1.0.1 - bytebuffer: 5.0.1 - glob: 7.1.6 - yargs: 3.32.0 + + /proto-list/1.2.4: + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} dev: false - engines: - node: '>=0.8' + + /protobufjs/6.11.2: + resolution: {integrity: sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==} hasBin: true - resolution: - integrity: sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA== - /protobufjs/6.8.8: + requiresBuild: true dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -5682,170 +5475,102 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/long': 4.0.0 - '@types/node': 10.17.6 + '@types/long': 4.0.1 + '@types/node': 14.17.21 long: 4.0.0 dev: false - hasBin: true - requiresBuild: true - resolution: - integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== - /protocols/1.4.7: - dev: false - resolution: - integrity: sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== - /proxy-agent/3.1.1: - dependencies: - agent-base: 4.3.0 - debug: 4.1.1 - http-proxy-agent: 2.1.0 - https-proxy-agent: 3.0.1 - lru-cache: 5.1.1 - pac-proxy-agent: 3.0.1 - proxy-from-env: 1.0.0 - socks-proxy-agent: 4.0.2 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw== - /proxy-from-env/1.0.0: - dev: false - resolution: - integrity: sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + /pseudomap/1.0.2: + resolution: {integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=} dev: false - resolution: - integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - /psl/1.4.0: + + /psl/1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} dev: false - resolution: - integrity: sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== + /pump/2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: false - resolution: - integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - /pump/3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - resolution: - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + /pumpify/1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} dependencies: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 dev: false - resolution: - integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - /punycode/1.4.1: - dev: false - resolution: - integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4= + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /qs/6.5.2: + resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} + engines: {node: '>=0.6'} dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /randomatic/3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} dependencies: is-number: 4.0.0 - kind-of: 6.0.2 + kind-of: 6.0.3 math-random: 1.0.4 dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - /raw-body/2.4.1: + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: - bytes: 3.1.0 - http-errors: 1.7.3 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + safe-buffer: 5.2.1 dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - /rc/1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.5 - minimist: 1.2.0 - strip-json-comments: 2.0.1 - dev: false - hasBin: true - resolution: - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + /rc4/0.1.5: + resolution: {integrity: sha1-CMbgSgFo9utiHCKrbLEVG9n0pk0=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-CMbgSgFo9utiHCKrbLEVG9n0pk0= + /read-pkg-up/1.0.1: + resolution: {integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=} + engines: {node: '>=0.10.0'} dependencies: find-up: 1.1.2 read-pkg: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + /read-pkg-up/4.0.0: + resolution: {integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==} + engines: {node: '>=6'} dependencies: find-up: 3.0.0 read-pkg: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + /read-pkg/1.1.0: + resolution: {integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=} + engines: {node: '>=0.10.0'} dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + /read-pkg/3.0.0: + resolution: {integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=} + engines: {node: '>=4'} dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - /readable-stream/1.1.14: - dependencies: - core-util-is: 1.0.2 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - resolution: - integrity: sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - /readable-stream/2.3.6: + + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: - core-util-is: 1.0.2 + core-util-is: 1.0.3 inherits: 2.0.4 isarray: 1.0.0 process-nextick-args: 2.0.1 @@ -5853,559 +5578,518 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 dev: false - resolution: - integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - /readable-stream/3.4.0: + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 dev: false - engines: - node: '>= 6' - resolution: - integrity: sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + /readdirp/2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 micromatch: 3.1.10 - readable-stream: 2.3.6 + readable-stream: 2.3.7 dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.0 + dev: false + /rechoir/0.6.2: + resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} + engines: {node: '>= 0.10'} dependencies: - resolve: 1.13.1 + resolve: 1.20.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + /reflect-metadata/0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - resolution: - integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + /regenerator-runtime/0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} dev: false - resolution: - integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + /regex-cache/0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} dependencies: is-equal-shallow: 0.1.3 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + /regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 safe-regex: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + /regexpp/1.1.0: + resolution: {integrity: sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==} + engines: {node: '>=4.0.0'} dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + /regexpp/2.0.1: + resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} + engines: {node: '>=6.5.0'} dev: false - engines: - node: '>=6.5.0' - resolution: - integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - /registry-auth-token/3.4.0: - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.0 - dev: false - resolution: - integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - /registry-url/3.1.0: - dependencies: - rc: 1.2.8 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PU74cPc93h138M+aOBQyRE4XSUI= + /release-zalgo/1.0.0: + resolution: {integrity: sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=} + engines: {node: '>=4'} dependencies: es6-error: 4.1.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + /remove-bom-buffer/3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 is-utf8: 0.2.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + /remove-bom-stream/1.2.0: + resolution: {integrity: sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=} + engines: {node: '>= 0.10'} dependencies: remove-bom-buffer: 3.0.0 - safe-buffer: 5.2.0 + safe-buffer: 5.2.1 through2: 2.0.5 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + /remove-trailing-separator/1.1.0: + resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} dev: false - resolution: - integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - /repeat-element/1.1.3: + + /repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + /repeat-string/1.6.1: + resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} + engines: {node: '>=0.10'} dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc= + /repeating/2.0.1: + resolution: {integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=} + engines: {node: '>=0.10.0'} dependencies: - is-finite: 1.0.2 + is-finite: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - /replace-ext/1.0.0: + + /replace-ext/1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + /replace-homedir/1.0.0: + resolution: {integrity: sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=} + engines: {node: '>= 0.10'} dependencies: homedir-polyfill: 1.0.3 is-absolute: 1.0.0 remove-trailing-separator: 1.1.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= - /replacestream/4.0.3: - dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - readable-stream: 2.3.6 - dev: false - resolution: - integrity: sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA== - /request/2.88.0: + + /request/2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 - aws4: 1.9.0 + aws4: 1.11.0 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 forever-agent: 0.6.1 form-data: 2.3.3 - har-validator: 5.1.3 + har-validator: 5.1.5 http-signature: 1.2.0 is-typedarray: 1.0.0 isstream: 0.1.2 json-stringify-safe: 5.0.1 - mime-types: 2.1.25 + mime-types: 2.1.33 oauth-sign: 0.9.0 performance-now: 2.1.0 qs: 6.5.2 - safe-buffer: 5.2.0 - tough-cookie: 2.4.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 tunnel-agent: 0.6.0 - uuid: 3.3.3 + uuid: 3.4.0 dev: false - engines: - node: '>= 4' - resolution: - integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + /require-directory/2.1.1: + resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + /require-from-string/1.2.1: + resolution: {integrity: sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= + /require-main-filename/1.0.1: + resolution: {integrity: sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=} dev: false - resolution: - integrity: sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + /require-main-filename/2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: false - resolution: - integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + /require-uncached/1.0.3: + resolution: {integrity: sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=} + engines: {node: '>=0.10.0'} dependencies: caller-path: 0.1.0 resolve-from: 1.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + /requizzle/0.2.3: + resolution: {integrity: sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==} dependencies: - lodash: 4.17.15 + lodash: 4.17.21 dev: false - resolution: - integrity: sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== + /resolve-dir/1.0.1: + resolution: {integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=} + engines: {node: '>=0.10.0'} dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + /resolve-from/1.0.1: + resolution: {integrity: sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + /resolve-options/1.1.0: + resolution: {integrity: sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=} + engines: {node: '>= 0.10'} dependencies: value-or-function: 3.0.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + /resolve-url/0.2.1: + resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} + deprecated: https://github.com/lydell/resolve-url#deprecated dev: false - resolution: - integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - /resolve/1.13.1: + + /resolve/1.20.0: + resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: - path-parse: 1.0.6 + is-core-module: 2.7.0 + path-parse: 1.0.7 dev: false - resolution: - integrity: sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== + /restore-cursor/2.0.0: + resolution: {integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368=} + engines: {node: '>=4'} dependencies: onetime: 2.0.1 - signal-exit: 3.0.2 + signal-exit: 3.0.5 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} dependencies: - onetime: 5.1.0 - signal-exit: 3.0.2 + onetime: 5.1.2 + signal-exit: 3.0.5 dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + /ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} dev: false - engines: - node: '>=0.12' - resolution: - integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + /retry/0.10.1: + resolution: {integrity: sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=} dev: false - resolution: - integrity: sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + /rewire/4.0.1: + resolution: {integrity: sha512-+7RQ/BYwTieHVXetpKhT11UbfF6v1kGhKFrtZN7UDL2PybMsSt/rpLWeEUGF5Ndsl1D5BxiCB14VDJyoX+noYw==} dependencies: eslint: 4.19.1 dev: false - resolution: - integrity: sha512-+7RQ/BYwTieHVXetpKhT11UbfF6v1kGhKFrtZN7UDL2PybMsSt/rpLWeEUGF5Ndsl1D5BxiCB14VDJyoX+noYw== - /rimraf/2.6.3: + + /rewire/5.0.0: + resolution: {integrity: sha512-1zfitNyp9RH5UDyGGLe9/1N0bMlPQ0WrX0Tmg11kMHBpqwPJI4gfPpP7YngFyLbFmhXh19SToAG0sKKEFcOIJA==} dependencies: - glob: 7.1.6 + eslint: 6.8.0 + transitivePeerDependencies: + - supports-color dev: false + + /rimraf/2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} hasBin: true - resolution: - integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - /rimraf/2.7.1: dependencies: - glob: 7.1.6 + glob: 7.2.0 dev: false + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true - resolution: - integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - /rimraf/3.0.0: dependencies: - glob: 7.1.6 + glob: 7.2.0 dev: false + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true - resolution: - integrity: sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== - /run-async/2.3.0: dependencies: - is-promise: 2.1.0 + glob: 7.2.0 dev: false - engines: - node: '>=0.12.0' - resolution: - integrity: sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + + /run-async/2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: false + /rx-lite-aggregates/4.0.8: + resolution: {integrity: sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=} dependencies: rx-lite: 4.0.8 dev: false - resolution: - integrity: sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + /rx-lite/4.0.8: + resolution: {integrity: sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=} dev: false - resolution: - integrity: sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - /rxjs/6.5.3: + + /rxjs/6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} dependencies: - tslib: 1.10.0 + tslib: 1.14.1 dev: false - engines: - npm: '>=2.0.0' - resolution: - integrity: sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false - resolution: - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - /safe-buffer/5.2.0: + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false - resolution: - integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + /safe-regex/1.1.0: + resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} dependencies: ret: 0.1.15 dev: false - resolution: - integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - /safer-buffer/2.1.2: + + /safe-stable-stringify/1.1.1: + resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} dev: false - resolution: - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - /sanitize-html/1.20.1: - dependencies: - chalk: 2.4.2 - htmlparser2: 3.10.1 - lodash.clonedeep: 4.5.0 - lodash.escaperegexp: 4.1.2 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.mergewith: 4.6.2 - postcss: 7.0.23 - srcset: 1.0.0 - xtend: 4.0.2 - dev: false - resolution: - integrity: sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA== - /sax/1.2.4: - dev: false - resolution: - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - /secure-keys/1.0.0: + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false - resolution: - integrity: sha1-8MgtmKOxOah3aogIBQuCRDEIf8o= - /semver-diff/2.1.0: + + /sanitize-html/1.27.5: + resolution: {integrity: sha512-M4M5iXDAUEcZKLXkmk90zSYWEtk5NH3JmojQxKxV371fnMh+x9t1rqdmXaGoyEHw3z/X/8vnFhKjGL5xFGOJ3A==} dependencies: - semver: 5.7.1 + htmlparser2: 4.1.0 + lodash: 4.17.21 + parse-srcset: 1.0.2 + postcss: 7.0.39 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + /semver-greatest-satisfied-range/1.1.0: + resolution: {integrity: sha1-E+jCZYq5aRywzXEJMkAoDTb3els=} + engines: {node: '>= 0.10'} dependencies: sver-compat: 1.5.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + /semver/5.7.1: - dev: false + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true - resolution: - integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - /semver/6.3.0: dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - resolution: - integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - /set-blocking/2.0.0: dev: false - resolution: - integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - /set-immediate-shim/1.0.1: + + /serialize-javascript/6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + + /set-blocking/2.0.0: + resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + dev: false + /set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} dependencies: extend-shallow: 2.0.1 is-extendable: 0.1.1 is-plain-object: 2.0.4 split-string: 3.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - /setprototypeof/1.1.1: - dev: false - resolution: - integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - /shallow-clone/0.1.2: - dependencies: - is-extendable: 0.1.1 - kind-of: 2.0.1 - lazy-cache: 0.2.7 - mixin-object: 2.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + /shebang-command/1.2.0: + resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} + engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + /shebang-regex/1.0.0: + resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + /shell-quote/1.7.2: + resolution: {integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==} dev: false - resolution: - integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + /shelljs/0.7.7: + resolution: {integrity: sha1-svXHfvlxSPS09uImguELuoZnz/E=} + engines: {node: '>=0.11.0'} + hasBin: true dependencies: - glob: 7.1.6 - interpret: 1.2.0 + glob: 7.2.0 + interpret: 1.4.0 rechoir: 0.6.2 dev: false - engines: - node: '>=0.11.0' - hasBin: true - resolution: - integrity: sha1-svXHfvlxSPS09uImguELuoZnz/E= + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.11.0 + dev: false + /sigmund/1.0.1: + resolution: {integrity: sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=} dev: false - resolution: - integrity: sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - /signal-exit/3.0.2: + + /signal-exit/3.0.5: + resolution: {integrity: sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==} dev: false - resolution: - integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + /simple-swizzle/0.2.2: + resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} dependencies: is-arrayish: 0.3.2 dev: false - resolution: - integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - /sinon-test/2.4.0_sinon@7.5.0: + + /sinon-test/2.4.3: + resolution: {integrity: sha512-si0GRSeYtEFj67t/nyR5BKTWhFTerFJ7Xw88EIhUT5G99bpJ0HOxZiHuJ1DFqS6S7i0RqU23H9GaVxAVf/hxow==} + peerDependencies: + sinon: 2.x - 9.x + dev: false + + /sinon-test/2.4.3_sinon@7.5.0: + resolution: {integrity: sha512-si0GRSeYtEFj67t/nyR5BKTWhFTerFJ7Xw88EIhUT5G99bpJ0HOxZiHuJ1DFqS6S7i0RqU23H9GaVxAVf/hxow==} + peerDependencies: + sinon: 2.x - 9.x dependencies: sinon: 7.5.0 dev: false - peerDependencies: - sinon: 2.x - 7.x - resolution: - integrity: sha512-oQnO02I7JDbtrSKN8Qs3upobCQRythJCBn3DzPmv4m/SoPvhZJDVqHDFkRZ1lZhN2GkBqOR3m7WT79190z9kEg== + + /sinon/11.1.2: + resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} + dependencies: + '@sinonjs/commons': 1.8.3 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/samsam': 6.0.2 + diff: 5.0.0 + nise: 5.1.0 + supports-color: 7.2.0 + dev: false + /sinon/7.5.0: + resolution: {integrity: sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==} dependencies: - '@sinonjs/commons': 1.6.0 + '@sinonjs/commons': 1.8.3 '@sinonjs/formatio': 3.2.2 '@sinonjs/samsam': 3.3.3 diff: 3.5.0 lolex: 4.2.0 - nise: 1.5.2 + nise: 1.5.3 supports-color: 5.5.0 dev: false - resolution: - integrity: sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== + /slice-ansi/1.0.0: + resolution: {integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==} + engines: {node: '>=4'} dependencies: is-fullwidth-code-point: 2.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + /slice-ansi/2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} dependencies: ansi-styles: 3.2.1 astral-regex: 1.0.0 is-fullwidth-code-point: 2.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + /slide/1.1.6: + resolution: {integrity: sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=} dev: false - resolution: - integrity: sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - /smart-buffer/4.1.0: - dev: false - engines: - node: '>= 6.0.0' - npm: '>= 3.0.0' - resolution: - integrity: sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + /snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} dependencies: define-property: 1.0.0 isobject: 3.0.1 snapdragon-util: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + /snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + /snapdragon/0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 debug: 2.6.9 @@ -6413,368 +6097,112 @@ packages: extend-shallow: 2.0.1 map-cache: 0.2.2 source-map: 0.5.7 - source-map-resolve: 0.5.2 + source-map-resolve: 0.5.3 use: 3.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - /snyk-config/2.2.3: - dependencies: - debug: 3.2.6 - lodash: 4.17.15 - nconf: 0.10.0 - dev: false - resolution: - integrity: sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw== - /snyk-docker-plugin/1.33.1: - dependencies: - debug: 4.1.1 - dockerfile-ast: 0.0.16 - semver: 6.3.0 - tar-stream: 2.1.0 - tslib: 1.10.0 - dev: false - resolution: - integrity: sha512-xfs3DN1tPMTh6J8x2341wGK4HRr+pI5+i/YRuRmsslnBnwk/DkKYcbt8zOIWk6kzMoW8vo+9LqqXBQO/24szKg== - /snyk-go-parser/1.3.1: - dependencies: - toml: 3.0.0 - tslib: 1.10.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-jrFRfIk6yGHFeipGD66WV9ei/A/w/lIiGqI80w1ndMbg6D6M5pVNbK7ngDTmo4GdHrZDYqx/VBGBsUm2bol3Rg== - /snyk-go-plugin/1.11.1: - dependencies: - debug: 4.1.1 - graphlib: 2.1.7 - snyk-go-parser: 1.3.1 - tmp: 0.0.33 - tslib: 1.10.0 - dev: false - resolution: - integrity: sha512-IsNi7TmpHoRHzONOWJTT8+VYozQJnaJpKgnYNQjzNm2JlV8bDGbdGQ1a8LcEoChxnJ8v8aMZy7GTiQyGGABtEQ== - /snyk-gradle-plugin/3.2.2: - dependencies: - '@snyk/cli-interface': 2.2.0 - '@types/debug': 4.1.5 - chalk: 2.4.2 - clone-deep: 0.3.0 - debug: 4.1.1 - tmp: 0.0.33 - tslib: 1.10.0 - dev: false - resolution: - integrity: sha512-ijIWsypbtpdTuRcYTFsnEWbaBnhCc7q0iIg0A4OcOW/xLyInPwyfBMnip4ubNfHAS/PrvzgfwwwJhttcQD0ZaQ== - /snyk-module/1.9.1: - dependencies: - debug: 3.2.6 - hosted-git-info: 2.8.5 - dev: false - resolution: - integrity: sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA== - /snyk-mvn-plugin/2.6.1: - dependencies: - '@snyk/cli-interface': 2.2.0 - debug: 4.1.1 - lodash: 4.17.15 - needle: 2.4.0 - tmp: 0.1.0 - tslib: 1.9.3 - dev: false - resolution: - integrity: sha512-K7nIHElhNAkXbwE+Iq/hP8fe7GCz7OojT003wUfT034HubtIzM2954+PJYjizOcBghR/pXmzwxRTehBtgvf4zQ== - /snyk-nodejs-lockfile-parser/1.16.1: - dependencies: - '@yarnpkg/lockfile': 1.1.0 - graphlib: 2.1.7 - lodash: 4.17.15 - source-map-support: 0.5.16 - tslib: 1.10.0 - uuid: 3.3.3 - dev: false - engines: - node: '>=6' - hasBin: true - resolution: - integrity: sha512-MEQImB2XU35D66wYve6g1RcDuD9vyoxGvYtM+ngSd5ItujzjIpyF26W7niqHwBRGLamqjsKF5cOlbmHs+wsx/Q== - /snyk-nuget-plugin/1.13.1: - dependencies: - debug: 3.2.6 - dotnet-deps-parser: 4.5.2 - jszip: 3.2.2 - lodash: 4.17.15 - snyk-paket-parser: 1.5.0 - tslib: 1.10.0 - xml2js: 0.4.22 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-2AQVeahBK7Rt38p0Acl1fMsFQu3dsqoRODPoRaS0IM/bOBzVdAkDF9pCb5yKMREGpMZcyRFkt8Q+hGiUk0Nlfg== - /snyk-paket-parser/1.5.0: - dependencies: - tslib: 1.10.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA== - /snyk-php-plugin/1.7.0: - dependencies: - '@snyk/cli-interface': 2.2.0 - '@snyk/composer-lockfile-parser': 1.2.0 - tslib: 1.9.3 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-mDe90xkqSEVrpx1ZC7ItqCOc6fZCySbE+pHVI+dAPUmf1C1LSWZrZVmAVeo/Dw9sJzJfzmcdAFQl+jZP8/uV0A== - /snyk-policy/1.13.5: - dependencies: - debug: 3.2.6 - email-validator: 2.0.4 - js-yaml: 3.13.1 - lodash.clonedeep: 4.5.0 - semver: 6.3.0 - snyk-module: 1.9.1 - snyk-resolve: 1.0.1 - snyk-try-require: 1.3.1 - then-fs: 2.0.0 - dev: false - resolution: - integrity: sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ== - /snyk-python-plugin/1.13.4: - dependencies: - '@snyk/cli-interface': 2.3.0 - tmp: 0.0.33 - dev: false - resolution: - integrity: sha512-XjGmvKMYENFMH94q+GSQz5JzTjgsgapdF0ZcS107c3UzMYeXa2Qd2Du9S5IB+mjvm335EJGcQJPlgFYb/qoeFw== - /snyk-resolve-deps/4.4.0: - dependencies: - '@types/node': 6.14.9 - '@types/semver': 5.5.0 - ansicolors: 0.3.2 - debug: 3.2.6 - lodash.assign: 4.2.0 - lodash.assignin: 4.2.0 - lodash.clone: 4.5.0 - lodash.flatten: 4.4.0 - lodash.get: 4.4.2 - lodash.set: 4.3.2 - lru-cache: 4.1.5 - semver: 5.7.1 - snyk-module: 1.9.1 - snyk-resolve: 1.0.1 - snyk-tree: 1.0.0 - snyk-try-require: 1.3.1 - then-fs: 2.0.0 - dev: false - resolution: - integrity: sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ== - /snyk-resolve/1.0.1: - dependencies: - debug: 3.2.6 - then-fs: 2.0.0 - dev: false - resolution: - integrity: sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw== - /snyk-sbt-plugin/2.9.0: - dependencies: - semver: 6.3.0 - tmp: 0.1.0 - tree-kill: 1.2.1 - tslib: 1.10.0 - dev: false - resolution: - integrity: sha512-R8jfRDkqlSsiSHYNAItKBUKUwb0n5z304Ko8ply/eoNAJMkXbFASDKHRto1v4F4wryJb4Rl1j/vFvIwytqZrww== - /snyk-tree/1.0.0: - dependencies: - archy: 1.0.0 - dev: false - hasBin: true - resolution: - integrity: sha1-D7cxdtvzLngvGRAClBYESPkRHMg= - /snyk-try-require/1.3.1: - dependencies: - debug: 3.2.6 - lodash.clonedeep: 4.5.0 - lru-cache: 4.1.5 - then-fs: 2.0.0 - dev: false - resolution: - integrity: sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI= - /snyk/1.251.2: - dependencies: - '@snyk/cli-interface': 2.3.0 - '@snyk/dep-graph': 1.13.1 - '@snyk/gemfile': 1.2.0 - '@snyk/snyk-cocoapods-plugin': 2.0.1 - '@types/agent-base': 4.2.0 - '@types/restify': 4.3.6 - abbrev: 1.1.1 - ansi-escapes: 3.2.0 - chalk: 2.4.2 - cli-spinner: 0.2.10 - configstore: 3.1.2 - debug: 3.2.6 - diff: 4.0.1 - git-url-parse: 11.1.2 - glob: 7.1.6 - inquirer: 6.5.2 - lodash: 4.17.15 - needle: 2.4.0 - opn: 5.5.0 - os-name: 3.1.0 - proxy-agent: 3.1.1 - proxy-from-env: 1.0.0 - semver: 6.3.0 - snyk-config: 2.2.3 - snyk-docker-plugin: 1.33.1 - snyk-go-plugin: 1.11.1 - snyk-gradle-plugin: 3.2.2 - snyk-module: 1.9.1 - snyk-mvn-plugin: 2.6.1 - snyk-nodejs-lockfile-parser: 1.16.1 - snyk-nuget-plugin: 1.13.1 - snyk-php-plugin: 1.7.0 - snyk-policy: 1.13.5 - snyk-python-plugin: 1.13.4 - snyk-resolve: 1.0.1 - snyk-resolve-deps: 4.4.0 - snyk-sbt-plugin: 2.9.0 - snyk-tree: 1.0.0 - snyk-try-require: 1.3.1 - source-map-support: 0.5.16 - strip-ansi: 5.2.0 - tempfile: 2.0.0 - then-fs: 2.0.0 - update-notifier: 2.5.0 - uuid: 3.3.3 - wrap-ansi: 5.1.0 - dev: false - engines: - node: '>=6' + + /snyk/1.733.0: + resolution: {integrity: sha512-Mi/wk9tw8ma4P2+2QwgzGDHcIG0Tfj0Wn7cliuUqd7CM8bg+Oryq3g4NcNK6mJZz0VaISF8MCIcIzbqV8v0JYg==} + engines: {node: '>=10'} hasBin: true - resolution: - integrity: sha512-YMZ7C6gUjvbMD8rbPk0OpdDQ8BB3Z/e0Gt3v1U+sZ6djGDvkP10DQBhz2WdUu4tf1TjRXzocIby9sVZWStET6g== - /socks-proxy-agent/4.0.2: - dependencies: - agent-base: 4.2.1 - socks: 2.3.3 - dev: false - engines: - node: '>= 6' - resolution: - integrity: sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - /socks/2.3.3: - dependencies: - ip: 1.1.5 - smart-buffer: 4.1.0 dev: false - engines: - node: '>= 6.0.0' - npm: '>= 3.0.0' - resolution: - integrity: sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== - /source-map-resolve/0.5.2: + + /source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} dependencies: atob: 2.1.2 decode-uri-component: 0.2.0 resolve-url: 0.2.1 - source-map-url: 0.4.0 + source-map-url: 0.4.1 urix: 0.1.0 dev: false - resolution: - integrity: sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - /source-map-support/0.5.16: - dependencies: - buffer-from: 1.1.1 - source-map: 0.6.1 - dev: false - resolution: - integrity: sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - /source-map-url/0.4.0: + + /source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} dev: false - resolution: - integrity: sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + /source-map/0.5.7: + resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /sparkles/1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + /spawn-wrap/1.4.3: + resolution: {integrity: sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==} dependencies: foreground-child: 1.5.6 - mkdirp: 0.5.1 + mkdirp: 0.5.5 os-homedir: 1.0.2 rimraf: 2.7.1 - signal-exit: 3.0.2 + signal-exit: 3.0.5 which: 1.3.1 dev: false - resolution: - integrity: sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== - /spdx-correct/3.1.0: + + /spawn-wrap/2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.5 + which: 2.0.2 + dev: false + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: - spdx-expression-parse: 3.0.0 - spdx-license-ids: 3.0.5 + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.10 dev: false - resolution: - integrity: sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - /spdx-exceptions/2.2.0: + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: false - resolution: - integrity: sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - /spdx-expression-parse/3.0.0: + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.2.0 - spdx-license-ids: 3.0.5 + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.10 dev: false - resolution: - integrity: sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - /spdx-license-ids/3.0.5: + + /spdx-license-ids/3.0.10: + resolution: {integrity: sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==} dev: false - resolution: - integrity: sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + + /spec-junit-splitter-mocha-reporter/1.0.1: + resolution: {integrity: sha512-V1FLjRTkf0DopeaLCEoK8Q3iF5F/kD9Aq3z9FOtbhC6B3hjodqUN9RW8z6Bb4bX9EDaRTwK6q6OfCWRSEwWX+Q==} + dependencies: + mocha: 6.2.2 + mocha-junit-reporter: 1.23.1_mocha@6.2.2 + dev: false + /split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + /sprintf-js/1.0.3: + resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: false - resolution: - integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - /srcset/1.0.0: - dependencies: - array-uniq: 1.0.3 - number-is-nan: 1.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-pWad4StC87HV6D7QPHEEb8SPQe8= + /sshpk/1.16.1: + resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} + engines: {node: '>=0.10.0'} + hasBin: true dependencies: asn1: 0.2.4 assert-plus: 1.0.0 @@ -6786,1036 +6214,889 @@ packages: safer-buffer: 2.1.2 tweetnacl: 0.14.5 dev: false - engines: - node: '>=0.10.0' - hasBin: true - resolution: - integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /ssri/5.3.0: + resolution: {integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==} dependencies: - safe-buffer: 5.2.0 + safe-buffer: 5.2.1 dev: false - resolution: - integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + /stack-trace/0.0.10: + resolution: {integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=} dev: false - resolution: - integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + /static-extend/0.1.2: + resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} + engines: {node: '>=0.10.0'} dependencies: define-property: 0.2.5 object-copy: 0.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - /statuses/1.5.0: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + /stream-exhaust/1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} dev: false - resolution: - integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== - /stream-shift/1.0.0: + + /stream-shift/1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: false - resolution: - integrity: sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + /string-width/1.0.2: + resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=} + engines: {node: '>=0.10.0'} dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + /string-width/2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + /string-width/3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} dependencies: emoji-regex: 7.0.3 is-fullwidth-code-point: 2.0.0 strip-ansi: 5.2.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - /string-width/4.2.0: + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - /string.prototype.trimleft/2.1.0: + + /string.prototype.trimend/1.0.4: + resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} dependencies: + call-bind: 1.0.2 define-properties: 1.1.3 - function-bind: 1.1.1 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - /string.prototype.trimright/2.1.0: + + /string.prototype.trimstart/1.0.4: + resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} dependencies: + call-bind: 1.0.2 define-properties: 1.1.3 - function-bind: 1.1.1 dev: false - engines: - node: '>= 0.4' - resolution: - integrity: sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== - /string_decoder/0.10.31: - dev: false - resolution: - integrity: sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: false - resolution: - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: - safe-buffer: 5.2.0 + safe-buffer: 5.2.1 dev: false - resolution: - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + /stringify-object/3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} dependencies: - get-own-enumerable-property-symbols: 3.0.1 + get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + /strip-ansi/3.0.1: + resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} + engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + /strip-ansi/4.0.0: + resolution: {integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=} + engines: {node: '>=4'} dependencies: ansi-regex: 3.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= + /strip-ansi/5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} dependencies: ansi-regex: 4.1.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - /strip-ansi/6.0.0: + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: - ansi-regex: 5.0.0 + ansi-regex: 5.0.1 dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + /strip-bom/2.0.0: + resolution: {integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=} + engines: {node: '>=0.10.0'} dependencies: is-utf8: 0.2.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + /strip-bom/3.0.0: + resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - /strip-eof/1.0.0: + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + /strip-json-comments/2.0.1: + resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= - /strip-json-comments/3.0.1: + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + /subarg/1.0.0: + resolution: {integrity: sha1-9izxdYHplrSPyWVpn1TAauJouNI=} dependencies: - minimist: 1.2.0 + minimist: 1.2.5 dev: false - resolution: - integrity: sha1-9izxdYHplrSPyWVpn1TAauJouNI= + /supports-color/2.0.0: + resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} + engines: {node: '>=0.8.0'} dev: false - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + /supports-color/3.2.3: + resolution: {integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=} + engines: {node: '>=0.8.0'} dependencies: has-flag: 1.0.0 dev: false - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/6.0.0: + resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} + engines: {node: '>=6'} dependencies: has-flag: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + /supports-color/6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} dependencies: has-flag: 3.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: false + /sver-compat/1.5.0: + resolution: {integrity: sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=} dependencies: es6-iterator: 2.0.3 es6-symbol: 3.1.3 dev: false - resolution: - integrity: sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + /table/4.0.2: + resolution: {integrity: sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==} dependencies: ajv: 5.5.2 ajv-keywords: 2.1.1_ajv@5.5.2 chalk: 2.4.2 - lodash: 4.17.15 + lodash: 4.17.21 slice-ansi: 1.0.0 string-width: 2.1.1 dev: false - resolution: - integrity: sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== + /table/5.4.6: + resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} + engines: {node: '>=6.0.0'} dependencies: - ajv: 6.10.2 - lodash: 4.17.15 + ajv: 6.12.6 + lodash: 4.17.21 slice-ansi: 2.1.0 string-width: 3.1.0 dev: false - engines: - node: '>=6.0.0' - resolution: - integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + /taffydb/2.6.2: + resolution: {integrity: sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=} dev: false - resolution: - integrity: sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= - /tar-stream/2.1.0: - dependencies: - bl: 3.0.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.4.0 - dev: false - resolution: - integrity: sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== - /temp-dir/1.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - /tempfile/2.0.0: - dependencies: - temp-dir: 1.0.0 - uuid: 3.3.3 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-awRGhWqbERTRhW/8vlCczLCXcmU= - /term-size/1.2.0: - dependencies: - execa: 0.7.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + /test-exclude/5.2.3: + resolution: {integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==} + engines: {node: '>=6'} dependencies: - glob: 7.1.6 + glob: 7.2.0 minimatch: 3.0.4 read-pkg-up: 4.0.0 require-main-filename: 2.0.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.0 + minimatch: 3.0.4 + dev: false + /text-hex/1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false - resolution: - integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + /text-table/0.2.0: + resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: false - resolution: - integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - /textextensions/1.0.2: - dev: false - resolution: - integrity: sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI= - /then-fs/2.0.0: - dependencies: - promise: 7.3.1 - dev: false - resolution: - integrity: sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI= + /through/2.3.8: + resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} dev: false - resolution: - integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + /through2-filter/3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} dependencies: through2: 2.0.5 xtend: 4.0.2 dev: false - resolution: - integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.6 + readable-stream: 2.3.7 xtend: 4.0.2 dev: false - resolution: - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - /through2/3.0.1: + + /through2/3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} dependencies: - readable-stream: 3.4.0 - dev: false - resolution: - integrity: sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== - /thunkify/2.1.2: + inherits: 2.0.4 + readable-stream: 3.6.0 dev: false - resolution: - integrity: sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= + /tildify/1.2.0: + resolution: {integrity: sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=} + engines: {node: '>=0.10.0'} dependencies: os-homedir: 1.0.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= + /time-stamp/1.1.0: + resolution: {integrity: sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - /timed-out/4.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + /tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 dev: false - engines: - node: '>=0.6.0' - resolution: - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - /tmp/0.1.0: - dependencies: - rimraf: 2.7.1 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + /to-absolute-glob/2.0.2: + resolution: {integrity: sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=} + engines: {node: '>=0.10.0'} dependencies: is-absolute: 1.0.0 is-negated-glob: 1.0.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + /to-fast-properties/1.0.3: + resolution: {integrity: sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + /to-fast-properties/2.0.0: + resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + /to-object-path/0.3.0: + resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + /to-regex-range/2.1.1: + resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} + engines: {node: '>=0.10.0'} dependencies: is-number: 3.0.0 repeat-string: 1.6.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + /to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} dependencies: define-property: 2.0.2 extend-shallow: 3.0.2 regex-not: 1.0.2 safe-regex: 1.1.0 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + /to-through/2.0.0: + resolution: {integrity: sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=} + engines: {node: '>= 0.10'} dependencies: through2: 2.0.5 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= - /toidentifier/1.0.0: - dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - /toml/3.0.0: - dev: false - resolution: - integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - /tough-cookie/2.4.3: - dependencies: - psl: 1.4.0 - punycode: 1.4.1 - dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - /trampa/1.0.1: + + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 dev: false - resolution: - integrity: sha512-93WeyHNuRggPEsfCe+yHxCgM2s6H3Q8Wmlt6b6ObJL8qc7eZlRaFjQxwTrB+zbvGtlDRnAkMoYYo3+2uH/fEwA== - /tree-kill/1.2.1: + + /trampa/1.0.1: + resolution: {integrity: sha512-93WeyHNuRggPEsfCe+yHxCgM2s6H3Q8Wmlt6b6ObJL8qc7eZlRaFjQxwTrB+zbvGtlDRnAkMoYYo3+2uH/fEwA==} dev: false - hasBin: true - resolution: - integrity: sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== + /trim-right/1.0.1: + resolution: {integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + /triple-beam/1.3.0: + resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} dev: false - resolution: - integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - /tslib/1.10.0: - dev: false - resolution: - integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - /tslib/1.9.3: + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: false - resolution: - integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + /tunnel-agent/0.6.0: + resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} dependencies: - safe-buffer: 5.2.0 + safe-buffer: 5.2.1 dev: false - resolution: - integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} dev: false - resolution: - integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - /tweetnacl/1.0.1: + + /tweetnacl/1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: false - resolution: - integrity: sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A== + /type-check/0.3.2: + resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} dev: false - engines: - node: '>=8' - resolution: - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + /type/1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type/2.5.0: + resolution: {integrity: sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==} dev: false - resolution: - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - /type/2.0.0: + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 dev: false - resolution: - integrity: sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + /typedarray/0.0.6: + resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: false - resolution: - integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + /typescript/3.0.1: - dev: false - engines: - node: '>=4.2.0' + resolution: {integrity: sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==} + engines: {node: '>=4.2.0'} hasBin: true - resolution: - integrity: sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg== + dev: false + /typify-parser/1.1.0: + resolution: {integrity: sha1-rHO/pfJTQ0aOLQ8zRsYRe8A9PJk=} + engines: {node: '>= 0.10.0'} dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha1-rHO/pfJTQ0aOLQ8zRsYRe8A9PJk= + /uc.micro/1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: false - resolution: - integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - /uglify-js/3.7.0: - dependencies: - commander: 2.20.3 - source-map: 0.6.1 - dev: false - engines: - node: '>=0.8.0' + + /uglify-js/3.14.2: + resolution: {integrity: sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==} + engines: {node: '>=0.8.0'} hasBin: true + requiresBuild: true + dev: false optional: true - resolution: - integrity: sha512-PC/ee458NEMITe1OufAjal65i6lB58R1HWMRcxwvdz1UopW0DYqlRL3xdu3IcTvTXsB02CRHykidkTRL+A3hQA== + + /unbox-primitive/1.0.1: + resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: false + /unc-path-regex/0.1.2: + resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo= - /underscore/1.9.1: + + /underscore/1.13.1: + resolution: {integrity: sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==} dev: false - resolution: - integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + /undertaker-registry/1.0.1: + resolution: {integrity: sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= - /undertaker/1.2.1: + + /undertaker/1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} dependencies: arr-flatten: 1.1.0 arr-map: 2.0.2 bach: 1.2.0 collection-map: 1.0.0 es6-weak-map: 2.0.3 + fast-levenshtein: 1.1.4 last-run: 1.1.1 object.defaults: 1.1.0 object.reduce: 1.0.1 undertaker-registry: 1.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== + /union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} dependencies: arr-union: 3.1.0 get-value: 2.0.6 is-extendable: 0.1.1 set-value: 2.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + /unique-stream/2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 dev: false - resolution: - integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== - /unique-string/1.0.0: - dependencies: - crypto-random-string: 1.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - /universalify/0.1.2: - dev: false - engines: - node: '>= 4.0.0' - resolution: - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - /unpipe/1.0.0: + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + /unset-value/1.0.0: + resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} + engines: {node: '>=0.10.0'} dependencies: has-value: 0.3.1 isobject: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - /unzip-response/2.0.1: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - /update-notifier/2.5.0: - dependencies: - boxen: 1.3.0 - chalk: 2.4.2 - configstore: 3.1.2 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - /uri-js/4.2.2: + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: false - resolution: - integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + /urix/0.1.0: + resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} + deprecated: Please see https://github.com/lydell/urix#deprecated dev: false - resolution: - integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - /url-parse-lax/1.0.0: - dependencies: - prepend-http: 1.0.4 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + /use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + /util-deprecate/1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} dev: false - resolution: - integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - /util.promisify/1.0.0: - dependencies: - define-properties: 1.1.3 - object.getownpropertydescriptors: 2.0.3 - dev: false - resolution: - integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - /uuid/3.3.3: - dev: false + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true - resolution: - integrity: sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== - /v8-compile-cache/2.1.0: dev: false - resolution: - integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== - /v8flags/3.1.3: + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: false + + /v8flags/3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} dependencies: homedir-polyfill: 1.0.3 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: - spdx-correct: 3.1.0 - spdx-expression-parse: 3.0.0 + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 dev: false - resolution: - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + /validate-npm-package-name/3.0.0: + resolution: {integrity: sha1-X6kS2B630MdK/BQN5zF/DKffQ34=} dependencies: builtins: 1.0.3 dev: false - resolution: - integrity: sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + /value-or-function/3.0.0: + resolution: {integrity: sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=} + engines: {node: '>= 0.10'} dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + /verror/1.10.0: + resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} + engines: {'0': node >=0.6.0} dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /vinyl-fs/3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} dependencies: fs-mkdirp-stream: 1.0.0 glob-stream: 6.1.0 - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 is-valid-glob: 1.0.0 lazystream: 1.0.0 lead: 1.0.0 - object.assign: 4.1.0 + object.assign: 4.1.2 pumpify: 1.5.1 - readable-stream: 2.3.6 + readable-stream: 2.3.7 remove-bom-buffer: 3.0.0 remove-bom-stream: 1.2.0 resolve-options: 1.1.0 through2: 2.0.5 to-through: 2.0.0 value-or-function: 3.0.0 - vinyl: 2.2.0 + vinyl: 2.2.1 vinyl-sourcemap: 1.1.0 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + /vinyl-sourcemap/1.1.0: + resolution: {integrity: sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=} + engines: {node: '>= 0.10'} dependencies: append-buffer: 1.0.2 - convert-source-map: 1.7.0 - graceful-fs: 4.2.3 + convert-source-map: 1.8.0 + graceful-fs: 4.2.8 normalize-path: 2.1.1 now-and-later: 2.0.1 remove-bom-buffer: 3.0.0 - vinyl: 2.2.0 + vinyl: 2.2.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= - /vinyl/2.2.0: + + /vinyl/2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} dependencies: clone: 2.1.2 clone-buffer: 1.0.0 clone-stats: 1.0.0 cloneable-readable: 1.1.3 remove-trailing-separator: 1.1.0 - replace-ext: 1.0.0 + replace-ext: 1.0.1 dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - /vscode-languageserver-types/3.14.0: + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.6 + is-string: 1.0.7 + is-symbol: 1.0.4 dev: false - resolution: - integrity: sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== + /which-module/1.0.0: + resolution: {integrity: sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=} dev: false - resolution: - integrity: sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + /which-module/2.0.0: + resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} dev: false - resolution: - integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true dependencies: isexe: 2.0.0 dev: false + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true - resolution: - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - /wide-align/1.1.3: dependencies: - string-width: 2.1.1 + isexe: 2.0.0 dev: false - resolution: - integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - /widest-line/2.0.1: + + /wide-align/1.1.3: + resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} dependencies: string-width: 2.1.1 dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - /window-size/0.1.4: - dev: false - engines: - node: '>= 0.10.0' - hasBin: true - resolution: - integrity: sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - /windows-release/3.2.0: - dependencies: - execa: 1.0.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== - /winston-transport/4.3.0: + + /winston-transport/4.4.0: + resolution: {integrity: sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==} + engines: {node: '>= 6.4.0'} dependencies: - readable-stream: 2.3.6 + readable-stream: 2.3.7 triple-beam: 1.3.0 dev: false - engines: - node: '>= 6.4.0' - resolution: - integrity: sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== - /winston/3.2.1: - dependencies: - async: 2.6.3 - diagnostics: 1.1.1 - is-stream: 1.1.0 - logform: 2.1.2 - one-time: 0.0.4 - readable-stream: 3.4.0 + + /winston/3.3.3: + resolution: {integrity: sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==} + engines: {node: '>= 6.4.0'} + dependencies: + '@dabh/diagnostics': 2.0.2 + async: 3.2.1 + is-stream: 2.0.1 + logform: 2.3.0 + one-time: 1.0.0 + readable-stream: 3.6.0 stack-trace: 0.0.10 triple-beam: 1.3.0 - winston-transport: 4.3.0 + winston-transport: 4.4.0 dev: false - engines: - node: '>= 6.4.0' - resolution: - integrity: sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - /wordwrap/0.0.3: + + /wordwrap/1.0.0: + resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + + /workerpool/6.1.5: + resolution: {integrity: sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==} + dev: false + /wrap-ansi/2.1.0: + resolution: {integrity: sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=} + engines: {node: '>=0.10.0'} dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + /wrap-ansi/5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} dependencies: ansi-styles: 3.2.1 string-width: 3.1.0 strip-ansi: 5.2.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + + /wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + /wrappy/1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} dev: false - resolution: - integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + /write-file-atomic/2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} dependencies: - graceful-fs: 4.2.3 + graceful-fs: 4.2.8 imurmurhash: 0.1.4 - signal-exit: 3.0.2 + signal-exit: 3.0.5 dev: false - resolution: - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.5 + typedarray-to-buffer: 3.1.5 + dev: false + /write/0.2.1: + resolution: {integrity: sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=} + engines: {node: '>=0.10.0'} dependencies: - mkdirp: 0.5.1 + mkdirp: 0.5.5 dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + /write/1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} dependencies: - mkdirp: 0.5.1 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - /xdg-basedir/3.0.0: + mkdirp: 0.5.5 dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + /xml/1.0.1: + resolution: {integrity: sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=} + dev: false + + /xmlcreate/2.0.3: + resolution: {integrity: sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==} dev: false - resolution: - integrity: sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= - /xml2js/0.4.19: - dependencies: - sax: 1.2.4 - xmlbuilder: 9.0.7 - dev: false - resolution: - integrity: sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== - /xml2js/0.4.22: - dependencies: - sax: 1.2.4 - util.promisify: 1.0.0 - xmlbuilder: 11.0.1 - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== - /xmlbuilder/11.0.1: - dev: false - engines: - node: '>=4.0' - resolution: - integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - /xmlbuilder/9.0.7: - dev: false - engines: - node: '>=4.0' - resolution: - integrity: sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - /xmlcreate/2.0.1: - dev: false - resolution: - integrity: sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA== - /xregexp/2.0.0: - dev: false - resolution: - integrity: sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} dev: false - engines: - node: '>=0.4' - resolution: - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - /y18n/3.2.1: + + /y18n/3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} dev: false - resolution: - integrity: sha1-bRX7qITAhnnA136I53WegR4H+kE= - /y18n/4.0.0: + + /y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: false - resolution: - integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - /yallist/2.1.2: + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} dev: false - resolution: - integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - /yallist/3.1.1: + + /yallist/2.1.2: + resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=} dev: false - resolution: - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + /yargs-parser/13.1.1: + resolution: {integrity: sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser/13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser/18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: false - resolution: - integrity: sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - /yargs-parser/5.0.0: + + /yargs-parser/20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser/5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} dependencies: camelcase: 3.0.0 + object.assign: 4.1.2 dev: false - resolution: - integrity: sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + /yargs-unparser/1.6.0: + resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} + engines: {node: '>=6'} dependencies: - flat: 4.1.0 - lodash: 4.17.15 - yargs: 13.3.0 + flat: 4.1.1 + lodash: 4.17.21 + yargs: 13.3.2 + dev: false + + /yargs-unparser/2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.2.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + /yargs/13.3.0: + resolution: {integrity: sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==} dependencies: cliui: 5.0.0 find-up: 3.0.0 @@ -7825,24 +7106,57 @@ packages: set-blocking: 2.0.0 string-width: 3.1.0 which-module: 2.0.0 - y18n: 4.0.0 - yargs-parser: 13.1.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 dev: false - resolution: - integrity: sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - /yargs/3.32.0: + + /yargs/13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: - camelcase: 2.1.1 - cliui: 3.2.0 + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 13.1.2 + dev: false + + /yargs/15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 decamelize: 1.2.0 - os-locale: 1.4.0 - string-width: 1.0.2 - window-size: 0.1.4 - y18n: 3.2.1 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 dev: false - resolution: - integrity: sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - /yargs/7.1.0: + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + dev: false + + /yargs/7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} dependencies: camelcase: 3.0.0 cliui: 3.2.0 @@ -7855,152 +7169,152 @@ packages: set-blocking: 2.0.0 string-width: 1.0.2 which-module: 1.0.0 - y18n: 3.2.1 - yargs-parser: 5.0.0 + y18n: 3.2.2 + yargs-parser: 5.0.1 dev: false - resolution: - integrity: sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= - 'file:projects/apidocs.tgz': - dependencies: - fs-extra: 8.1.0 - gulp: 4.0.2 - gulp-jsdoc3: 2.0.0 - gulp-replace: 0.6.1 + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} dev: false - name: '@rush-temp/apidocs' - resolution: - integrity: sha512-D5aW1g+rYrMfnuKHMReuQTx9BhubNmyip9AaZu3YdosQCZxdz/QE7bSmsUYY/SA25PTGbbU4OXBm0lBR/8JYdQ== - tarball: 'file:projects/apidocs.tgz' - version: 0.0.0 - 'file:projects/azure-mocha-reporter.tgz': - dependencies: - mocha: 6.2.2 - mocha-junit-reporter: 1.23.1_mocha@6.2.2 - dev: false - name: '@rush-temp/azure-mocha-reporter' - resolution: - integrity: sha512-LDDLntbmaSbnh0QeY2Ex0QPj4Miem376A2TvtYXloZRmulozTLh9/YLGEXAbpGEEJgHe/KENpgN/hcMfcT4Mqg== - tarball: 'file:projects/azure-mocha-reporter.tgz' + + file:projects/fabric-contract-api.tgz: + resolution: {integrity: sha512-1Y6Y6IZb0ety+LoF6KO0Q7jQwLEN0yaVnWm/lVNNDXNiHEhuwdfYUn+DycIJDXCGCMAT9v3mv/xbY8bGhDc1Tw==, tarball: file:projects/fabric-contract-api.tgz} + name: '@rush-temp/fabric-contract-api' version: 0.0.0 - 'file:projects/fabric-contract-api.tgz': dependencies: - ajv: 6.10.2 - ajv-cli: 3.0.0 - chai: 4.2.0 - chai-as-promised: 7.1.1_chai@4.2.0 + ajv: 6.12.6 + ajv-cli: 3.3.0 + chai: 4.3.4 + chai-as-promised: 7.1.1_chai@4.3.4 chai-things: 0.2.0 - class-transformer: 0.2.3 + class-transformer: 0.3.1 eslint: 6.6.0 - fast-safe-stringify: 2.0.7 + fast-safe-stringify: 2.1.1 get-params: 0.1.2 gulp: 4.0.2 gulp-debug: 4.0.0_gulp@4.0.2 gulp-eslint: 6.0.0 - mocha: 6.2.2 - nyc: 14.1.1 + mocha: 9.1.2 + nyc: 15.1.0 reflect-metadata: 0.1.13 - rewire: 4.0.1 + rewire: 5.0.0 sinon: 7.5.0 typescript: 3.0.1 - winston: 3.2.1 + winston: 3.3.3 + transitivePeerDependencies: + - supports-color dev: false - name: '@rush-temp/fabric-contract-api' - resolution: - integrity: sha512-FCenAjJ1ndcmA1tQKykvsjy+VGdzDX03LgZveh9YKZpFM5TEbkk2iMTxtokltV4Bu0B7C/39OUS2GG2B8+O1+A== - tarball: 'file:projects/fabric-contract-api.tgz' + + file:projects/fabric-e2e-tests.tgz: + resolution: {integrity: sha512-MztWZKBJryzlc5s3lH902fDPM2q/R17WiHUHaIdb5FRZp3Fi4aBEK0csjRWnHtu2Y+xBa38dku/OsWAYUwVU4Q==, tarball: file:projects/fabric-e2e-tests.tgz} + name: '@rush-temp/fabric-e2e-tests' version: 0.0.0 - 'file:projects/fabric-e2e-tests.tgz': dependencies: - ajv: 6.10.2 - ajv-cli: 3.0.0 + ajv: 6.12.6 + ajv-cli: 3.3.0 delay: 4.3.0 - fs-extra: 8.1.0 + fs-extra: 9.1.0 git-rev-sync: 1.12.0 gulp: 4.0.2 ip: 1.1.5 + spec-junit-splitter-mocha-reporter: 1.0.1 dev: false - name: '@rush-temp/fabric-e2e-tests' - resolution: - integrity: sha512-C+g3vw7CQWkiWjn1LK4ZI4FtR+rkT63vXoN7n0vT7Ix7CcGv+whEjqdjtxiGVDfjNj03GI42KcU14ZbhWxSnYg== - tarball: 'file:projects/fabric-e2e-tests.tgz' + + file:projects/fabric-nodeenv.tgz: + resolution: {integrity: sha512-W6+8KwlqUyP5/D/YFLdbJODDvPaWP97H62UlV2VbQda3GZn8N3/EbPZTUmCwaQMQzRaWMrWSs1H6rygNJOkcdg==, tarball: file:projects/fabric-nodeenv.tgz} + name: '@rush-temp/fabric-nodeenv' version: 0.0.0 - 'file:projects/fabric-nodeenv.tgz': dependencies: git-rev-sync: 1.12.0 gulp: 4.0.2 dev: false - name: '@rush-temp/fabric-nodeenv' - resolution: - integrity: sha512-cdrQxjnzmb/lcevZl+QClSDH1kqzBXMTJd43oWU4v5ggKUBX1uKPRwfUu8K6bk5XXGIb59GnWf7X5q1itoNrKg== - tarball: 'file:projects/fabric-nodeenv.tgz' + + file:projects/fabric-shim-api.tgz: + resolution: {integrity: sha512-XTqk3nknIzx9XDjIwPAqxlcbyVyZuoETwf8eWxffKlp5MOfZWy+IknQAHB23AdOuUtpAg94QVefEIkO1B2NREg==, tarball: file:projects/fabric-shim-api.tgz} + name: '@rush-temp/fabric-shim-api' version: 0.0.0 - 'file:projects/fabric-shim-api.tgz': + dependencies: + '@types/long': 4.0.1 dev: false - name: '@rush-temp/fabric-shim-api' - resolution: - integrity: sha512-tuMYxDHafc1oNnYYdNm6YnHxCpLk5q6WJ+eQwAUK4ZhrXA1hwo8VHJA+agiUZM41e0lNz71/NoY5PaSDNqxI9Q== - tarball: 'file:projects/fabric-shim-api.tgz' + + file:projects/fabric-shim-crypto.tgz: + resolution: {integrity: sha512-tFFyLjdh0daZRzjNqExn/LY/eWTTtCHgoHZG7GikX/1uQ+T1zQOHxdVLRYmXesxkVYJQmMarTHuecJwj6A9okA==, tarball: file:projects/fabric-shim-crypto.tgz} + name: '@rush-temp/fabric-shim-crypto' version: 0.0.0 - 'file:projects/fabric-shim-crypto.tgz': dependencies: - chai: 4.2.0 - chai-as-promised: 7.1.1_chai@4.2.0 + chai: 4.3.4 + chai-as-promised: 7.1.1_chai@4.3.4 chai-things: 0.2.0 - elliptic: 6.5.2 + elliptic: 6.5.4 eslint: 6.6.0 - jsrsasign: 8.0.12 + jsrsasign: 10.4.1 mocha: 6.2.2 nyc: 14.1.1 rewire: 4.0.1 sinon: 7.5.0 + spec-junit-splitter-mocha-reporter: 1.0.1 typescript: 3.0.1 + transitivePeerDependencies: + - supports-color dev: false - name: '@rush-temp/fabric-shim-crypto' - resolution: - integrity: sha512-sLOonAmt/PdNTAumpLbCl9LbsNJwYdEbk44MGdbH/1VJAuhpyW/9wgyyJINoMLx1/G1cwrDmaIH1+FYz2ZnrEA== - tarball: 'file:projects/fabric-shim-crypto.tgz' + + file:projects/fabric-shim-docs.tgz: + resolution: {integrity: sha512-WnGbGQKWGXIG1Mfr0VR1Sxj1ColMNfOB2hDOJRY3yTpSUkg5lHaAA5UThKL4orrqQ4Oeq0LVy7gIRNylibcaYA==, tarball: file:projects/fabric-shim-docs.tgz} + name: '@rush-temp/fabric-shim-docs' + version: 0.0.0 + dependencies: + ink-docstrap: 1.3.2 + jsdoc: 3.6.7 + rimraf: 3.0.2 + dev: false + + file:projects/fabric-shim.tgz: + resolution: {integrity: sha512-909eEGiDG9xjSy2Ldnd1n5LwfHp++vNmS6fRa/wTeh8RYrsdmjh28dIJAnGO0ZEOTYOzRXW1/+k466MzbZiBBA==, tarball: file:projects/fabric-shim.tgz} + name: '@rush-temp/fabric-shim' version: 0.0.0 - 'file:projects/fabric-shim.tgz': dependencies: '@fidm/x509': 1.2.1 - '@grpc/proto-loader': 0.5.3 - '@types/node': 8.10.59 - ajv: 6.10.2 - chai: 4.2.0 - chai-as-promised: 7.1.1_chai@4.2.0 + '@grpc/grpc-js': 1.3.7 + '@grpc/proto-loader': 0.5.6 + '@types/node': 14.17.21 + ajv: 6.12.6 + chai: 4.3.4 + chai-as-promised: 7.1.1_chai@4.3.4 chai-things: 0.2.0 cpx: 1.5.0 eslint: 6.6.0 - fs-extra: 8.1.0 - grpc: 1.24.2 - mocha: 6.2.2 + fs-extra: 9.1.0 + mocha: 9.1.2 mockery: 2.1.0 - nyc: 14.1.1 + nyc: 15.1.0 reflect-metadata: 0.1.13 - rewire: 4.0.1 - rimraf: 3.0.0 - sinon: 7.5.0 - winston: 3.2.1 - yargs: 13.3.0 - yargs-parser: 13.1.1 - dev: false - name: '@rush-temp/fabric-shim' - resolution: - integrity: sha512-5Y9fZsd3jGr7fXMJWnJMHXdsOUPo8Q/L4hYdkcH1dyoTFAsuU+3GW4RfMbAhQvGqUrCST5JSEovw1HXZqp7MUA== - tarball: 'file:projects/fabric-shim.tgz' + rewire: 5.0.0 + rimraf: 3.0.2 + sinon: 11.1.2 + spec-junit-splitter-mocha-reporter: 1.0.1 + winston: 3.3.3 + yargs: 15.4.1 + yargs-parser: 18.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + file:projects/fvtests.tgz: + resolution: {integrity: sha512-SBlYPyJh2xZhLplHI1l2/VHcFuphZkTty6tDu4jv4h4KE/OJsUDYEjkR3/h+MgpHAWk+JbhJOPBVUrxY3PznqA==, tarball: file:projects/fvtests.tgz} + name: '@rush-temp/fvtests' version: 0.0.0 - 'file:projects/fvtests.tgz': dependencies: '@sinonjs/referee-sinon': 5.0.0 - ajv: 6.10.2 - ajv-cli: 3.0.0 - chai: 4.2.0 - chai-as-promised: 7.1.1_chai@4.2.0 + ajv: 6.12.6 + ajv-cli: 3.3.0 + chai: 4.3.4 + chai-as-promised: 7.1.1_chai@4.3.4 chai-things: 0.2.0 del: 3.0.0 delay: 4.3.0 eslint: 6.6.0 - fs-extra: 8.1.0 + fs-extra: 9.1.0 git-rev-sync: 1.12.0 gulp: 4.0.2 ip: 1.1.5 @@ -8010,85 +7324,29 @@ packages: mockery: 2.1.0 rewire: 4.0.1 sinon: 7.5.0 - sinon-test: 2.4.0_sinon@7.5.0 - dev: false - name: '@rush-temp/fvtests' - resolution: - integrity: sha512-6wFwShlomgPXiX+3LSGeD85qNKyok8W1/w10ur0J/laY3asQfgzS4wvZoZ+7Ek3NWyp9wzzyDoEAg6vJpEl3yA== - tarball: 'file:projects/fvtests.tgz' + sinon-test: 2.4.3_sinon@7.5.0 + spec-junit-splitter-mocha-reporter: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + file:projects/toolchain.tgz: + resolution: {integrity: sha512-yeHnBMx7NRFPWmeftcA+QT5Xbm8NN1fegLZoG67UBkEMAQPZbUPtMo0KXMm1BHd3+RoME6nINJ5pMKmBIcVjrQ==, tarball: file:projects/toolchain.tgz} + name: '@rush-temp/toolchain' version: 0.0.0 - 'file:projects/toolchain.tgz': dependencies: delay: 4.3.0 - fs-extra: 8.1.0 + fs-extra: 9.1.0 git-rev-sync: 1.12.0 gulp: 4.0.2 + gulp-cli: 2.3.0 gulp-debug: 4.0.0_gulp@4.0.2 gulp-eslint: 6.0.0 gulp-rename: 1.4.0 gulp-shell: 0.7.1 + ip: 1.1.5 merge-stream: 2.0.0 npm-cli-login: 0.1.1 + transitivePeerDependencies: + - supports-color dev: false - name: '@rush-temp/toolchain' - resolution: - integrity: sha512-S+MAW70dj3GyxKUNkBi/QFCEhKYV91OCee2TOP/dexYZ1vDKR94uS5yW+niF0w8wv2SnT5DedB8mK4lls3KL2A== - tarball: 'file:projects/toolchain.tgz' - version: 0.0.0 -specifiers: - '@fidm/x509': ^1.2.1 - '@grpc/proto-loader': ^0.5.1 - '@rush-temp/apidocs': 'file:./projects/apidocs.tgz' - '@rush-temp/azure-mocha-reporter': 'file:./projects/azure-mocha-reporter.tgz' - '@rush-temp/fabric-contract-api': 'file:./projects/fabric-contract-api.tgz' - '@rush-temp/fabric-e2e-tests': 'file:./projects/fabric-e2e-tests.tgz' - '@rush-temp/fabric-nodeenv': 'file:./projects/fabric-nodeenv.tgz' - '@rush-temp/fabric-shim': 'file:./projects/fabric-shim.tgz' - '@rush-temp/fabric-shim-api': 'file:./projects/fabric-shim-api.tgz' - '@rush-temp/fabric-shim-crypto': 'file:./projects/fabric-shim-crypto.tgz' - '@rush-temp/fvtests': 'file:./projects/fvtests.tgz' - '@rush-temp/toolchain': 'file:./projects/toolchain.tgz' - '@sinonjs/referee-sinon': ~5.0.0 - '@types/node': ^8.9.4 - ajv: ^6.5.5 - ajv-cli: ^3.0.0 - chai: ^4.1.1 - chai-as-promised: ^7.1.1 - chai-things: ^0.2.0 - class-transformer: ^0.2.2 - cpx: ^1.5.0 - del: ^3.0.0 - delay: 4.3.0 - elliptic: ^6.4.0 - eslint: 6.6.0 - fast-safe-stringify: ~2.0.7 - fs-extra: 8.1.0 - get-params: ^0.1.2 - git-rev-sync: 1.12.0 - grpc: ^1.23.3 - gulp: ^4.0.0 - gulp-debug: ~4.0.0 - gulp-eslint: ~6.0.0 - gulp-jsdoc3: ^2.0.0 - gulp-rename: ~1.4.0 - gulp-replace: ^0.6.1 - gulp-shell: ~0.7.1 - ip: ^1.1.5 - istanbul-api: ^1.1.13 - jsrsasign: ^8.0.4 - jsverify: ~0.8.4 - merge-stream: ~2.0.0 - mocha: 6.2.2 - mocha-junit-reporter: 1.23.1 - mockery: ^2.1.0 - npm-cli-login: ~0.1.1 - nyc: 14.1.1 - reflect-metadata: ^0.1.12 - rewire: 4.0.1 - rimraf: ^3.0.0 - sinon: 7.5.0 - sinon-test: ^2.2.0 - typescript: 3.0.1 - winston: ^3.2.1 - yargs: '^13.3.0 ' - yargs-parser: ^13.1.1 diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js index ed21abf8..5afdb9ad 100644 --- a/common/scripts/install-run-rush.js +++ b/common/scripts/install-run-rush.js @@ -1,67 +1,86 @@ -"use strict"; -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -Object.defineProperty(exports, "__esModule", { value: true }); -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run-rush.js install -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ -const path = require("path"); -const fs = require("fs"); -const install_run_1 = require("./install-run"); -const PACKAGE_NAME = '@microsoft/rush'; -const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; -function _getRushVersion() { - const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; - if (rushPreviewVersion !== undefined) { - console.log(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); - return rushPreviewVersion; - } - const rushJsonFolder = install_run_1.findRushJsonFolder(); - const rushJsonPath = path.join(rushJsonFolder, install_run_1.RUSH_JSON_FILENAME); - try { - const rushJsonContents = fs.readFileSync(rushJsonPath, 'utf-8'); - // Use a regular expression to parse out the rushVersion value because rush.json supports comments, - // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. - const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); - return rushJsonMatches[1]; - } - catch (e) { - throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + - 'The \'rushVersion\' field is either not assigned in rush.json or was specified ' + - 'using an unexpected syntax.'); - } -} -function _run() { - const [nodePath, /* Ex: /bin/node */ scriptPath, /* /repo/common/scripts/install-run-rush.js */ ...packageBinArgs /* [build, --to, myproject] */] = process.argv; - // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the - // appropriate binary inside the rush package to run - const scriptName = path.basename(scriptPath); - const bin = scriptName.toLowerCase() === 'install-run-rushx.js' ? 'rushx' : 'rush'; - if (!nodePath || !scriptPath) { - throw new Error('Unexpected exception: could not detect node path or script path'); - } - if (process.argv.length < 3) { - console.log(`Usage: ${scriptName} [args...]`); - if (scriptName === 'install-run-rush.js') { - console.log(`Example: ${scriptName} build --to myproject`); - } - else { - console.log(`Example: ${scriptName} custom-command`); - } - process.exit(1); - } - install_run_1.runWithErrorAndStatusCode(() => { - const version = _getRushVersion(); - console.log(`The rush.json configuration requests Rush version ${version}`); - return install_run_1.installAndRun(PACKAGE_NAME, version, bin, packageBinArgs); - }); -} -_run(); +"use strict"; +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for license information. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run-rush.js install +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ +const path = __importStar(require("path")); +const fs = __importStar(require("fs")); +const install_run_1 = require("./install-run"); +const PACKAGE_NAME = '@microsoft/rush'; +const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; +function _getRushVersion() { + const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; + if (rushPreviewVersion !== undefined) { + console.log(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); + return rushPreviewVersion; + } + const rushJsonFolder = (0, install_run_1.findRushJsonFolder)(); + const rushJsonPath = path.join(rushJsonFolder, install_run_1.RUSH_JSON_FILENAME); + try { + const rushJsonContents = fs.readFileSync(rushJsonPath, 'utf-8'); + // Use a regular expression to parse out the rushVersion value because rush.json supports comments, + // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. + const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); + return rushJsonMatches[1]; + } + catch (e) { + throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + + "The 'rushVersion' field is either not assigned in rush.json or was specified " + + 'using an unexpected syntax.'); + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; + // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the + // appropriate binary inside the rush package to run + const scriptName = path.basename(scriptPath); + const bin = scriptName.toLowerCase() === 'install-run-rushx.js' ? 'rushx' : 'rush'; + if (!nodePath || !scriptPath) { + throw new Error('Unexpected exception: could not detect node path or script path'); + } + if (process.argv.length < 3) { + console.log(`Usage: ${scriptName} [args...]`); + if (scriptName === 'install-run-rush.js') { + console.log(`Example: ${scriptName} build --to myproject`); + } + else { + console.log(`Example: ${scriptName} custom-command`); + } + process.exit(1); + } + (0, install_run_1.runWithErrorAndStatusCode)(() => { + const version = _getRushVersion(); + console.log(`The rush.json configuration requests Rush version ${version}`); + return (0, install_run_1.installAndRun)(PACKAGE_NAME, version, bin, packageBinArgs); + }); +} +_run(); //# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js index d810f7cc..fa5522e8 100644 --- a/common/scripts/install-run.js +++ b/common/scripts/install-run.js @@ -1,418 +1,478 @@ -"use strict"; -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -Object.defineProperty(exports, "__esModule", { value: true }); -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where a Node tool may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the specified -// version of the specified tool (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ -const childProcess = require("child_process"); -const fs = require("fs"); -const os = require("os"); -const path = require("path"); -exports.RUSH_JSON_FILENAME = 'rush.json'; -const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; -const INSTALLED_FLAG_FILENAME = 'installed.flag'; -const NODE_MODULES_FOLDER_NAME = 'node_modules'; -const PACKAGE_JSON_FILENAME = 'package.json'; -/** - * Parse a package specifier (in the form of name\@version) into name and version parts. - */ -function _parsePackageSpecifier(rawPackageSpecifier) { - rawPackageSpecifier = (rawPackageSpecifier || '').trim(); - const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); - let name; - let version = undefined; - if (separatorIndex === 0) { - // The specifier starts with a scope and doesn't have a version specified - name = rawPackageSpecifier; - } - else if (separatorIndex === -1) { - // The specifier doesn't have a version - name = rawPackageSpecifier; - } - else { - name = rawPackageSpecifier.substring(0, separatorIndex); - version = rawPackageSpecifier.substring(separatorIndex + 1); - } - if (!name) { - throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); - } - return { name, version }; -} -/** - * Resolve a package specifier to a static version - */ -function _resolvePackageVersion(rushCommonFolder, { name, version }) { - if (!version) { - version = '*'; // If no version is specified, use the latest version - } - if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { - // If the version contains only characters that we recognize to be used in static version specifiers, - // pass the version through - return version; - } - else { - // version resolves to - try { - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); - _syncNpmrc(sourceNpmrcFolder, rushTempFolder); - const npmPath = getNpmPath(); - // This returns something that looks like: - // @microsoft/rush@3.0.0 '3.0.0' - // @microsoft/rush@3.0.1 '3.0.1' - // ... - // @microsoft/rush@3.0.20 '3.0.20' - // - const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], { - cwd: rushTempFolder, - stdio: [] - }); - if (npmVersionSpawnResult.status !== 0) { - throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); - } - const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); - const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line); - const latestVersion = versionLines[versionLines.length - 1]; - if (!latestVersion) { - throw new Error('No versions found for the specified version range.'); - } - const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/); - if (!versionMatches) { - throw new Error(`Invalid npm output ${latestVersion}`); - } - return versionMatches[1]; - } - catch (e) { - throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); - } - } -} -let _npmPath = undefined; -/** - * Get the absolute path to the npm executable - */ -function getNpmPath() { - if (!_npmPath) { - try { - if (os.platform() === 'win32') { - // We're on Windows - const whereOutput = childProcess.execSync('where npm', { stdio: [] }).toString(); - const lines = whereOutput.split(os.EOL).filter((line) => !!line); - // take the last result, we are looking for a .cmd command - // see https://github.com/microsoft/rushstack/issues/759 - _npmPath = lines[lines.length - 1]; - } - else { - // We aren't on Windows - assume we're on *NIX or Darwin - _npmPath = childProcess.execSync('which npm', { stdio: [] }).toString(); - } - } - catch (e) { - throw new Error(`Unable to determine the path to the NPM tool: ${e}`); - } - _npmPath = _npmPath.trim(); - if (!fs.existsSync(_npmPath)) { - throw new Error('The NPM executable does not exist'); - } - } - return _npmPath; -} -exports.getNpmPath = getNpmPath; -let _rushJsonFolder; -/** - * Find the absolute path to the folder containing rush.json - */ -function findRushJsonFolder() { - if (!_rushJsonFolder) { - let basePath = __dirname; - let tempPath = __dirname; - do { - const testRushJsonPath = path.join(basePath, exports.RUSH_JSON_FILENAME); - if (fs.existsSync(testRushJsonPath)) { - _rushJsonFolder = basePath; - break; - } - else { - basePath = tempPath; - } - } while (basePath !== (tempPath = path.dirname(basePath))); // Exit the loop when we hit the disk root - if (!_rushJsonFolder) { - throw new Error('Unable to find rush.json.'); - } - } - return _rushJsonFolder; -} -exports.findRushJsonFolder = findRushJsonFolder; -/** - * Create missing directories under the specified base directory, and return the resolved directory. - * - * Does not support "." or ".." path segments. - * Assumes the baseFolder exists. - */ -function _ensureAndJoinPath(baseFolder, ...pathSegments) { - let joinedPath = baseFolder; - try { - for (let pathSegment of pathSegments) { - pathSegment = pathSegment.replace(/[\\\/]/g, '+'); - joinedPath = path.join(joinedPath, pathSegment); - if (!fs.existsSync(joinedPath)) { - fs.mkdirSync(joinedPath); - } - } - } - catch (e) { - throw new Error(`Error building local installation folder (${path.join(baseFolder, ...pathSegments)}): ${e}`); - } - return joinedPath; -} -/** - * As a workaround, _syncNpmrc() copies the .npmrc file to the target folder, and also trims - * unusable lines from the .npmrc file. If the source .npmrc file not exist, then _syncNpmrc() - * will delete an .npmrc that is found in the target folder. - * - * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in - * the .npmrc file to provide different authentication tokens for different registry. - * However, if the environment variable is undefined, it expands to an empty string, which - * produces a valid-looking mapping with an invalid URL that causes an error. Instead, - * we'd prefer to skip that line and continue looking in other places such as the user's - * home directory. - * - * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() - */ -function _syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder) { - const sourceNpmrcPath = path.join(sourceNpmrcFolder, '.npmrc'); - const targetNpmrcPath = path.join(targetNpmrcFolder, '.npmrc'); - try { - if (fs.existsSync(sourceNpmrcPath)) { - let npmrcFileLines = fs.readFileSync(sourceNpmrcPath).toString().split('\n'); - npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); - const resultLines = []; - // Trim out lines that reference environment variables that aren't defined - for (const line of npmrcFileLines) { - // This finds environment variable tokens that look like "${VAR_NAME}" - const regex = /\$\{([^\}]+)\}/g; - const environmentVariables = line.match(regex); - let lineShouldBeTrimmed = false; - if (environmentVariables) { - for (const token of environmentVariables) { - // Remove the leading "${" and the trailing "}" from the token - const environmentVariableName = token.substring(2, token.length - 1); - if (!process.env[environmentVariableName]) { - lineShouldBeTrimmed = true; - break; - } - } - } - if (lineShouldBeTrimmed) { - // Example output: - // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" - resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); - } - else { - resultLines.push(line); - } - } - fs.writeFileSync(targetNpmrcPath, resultLines.join(os.EOL)); - } - else if (fs.existsSync(targetNpmrcPath)) { - // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target - fs.unlinkSync(targetNpmrcPath); - } - } - catch (e) { - throw new Error(`Error syncing .npmrc file: ${e}`); - } -} -/** - * Detects if the package in the specified directory is installed - */ -function _isPackageAlreadyInstalled(packageInstallFolder) { - try { - const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (!fs.existsSync(flagFilePath)) { - return false; - } - const fileContents = fs.readFileSync(flagFilePath).toString(); - return fileContents.trim() === process.version; - } - catch (e) { - return false; - } -} -/** - * Removes the following files and directories under the specified folder path: - * - installed.flag - * - - * - node_modules - */ -function _cleanInstallFolder(rushTempFolder, packageInstallFolder) { - try { - const flagFile = path.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (fs.existsSync(flagFile)) { - fs.unlinkSync(flagFile); - } - const packageLockFile = path.resolve(packageInstallFolder, 'package-lock.json'); - if (fs.existsSync(packageLockFile)) { - fs.unlinkSync(packageLockFile); - } - const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); - if (fs.existsSync(nodeModulesFolder)) { - const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler', `install-run-${Date.now().toString()}`); - fs.renameSync(nodeModulesFolder, rushRecyclerFolder); - } - } - catch (e) { - throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); - } -} -function _createPackageJson(packageInstallFolder, name, version) { - try { - const packageJsonContents = { - 'name': 'ci-rush', - 'version': '0.0.0', - 'dependencies': { - [name]: version - }, - 'description': 'DON\'T WARN', - 'repository': 'DON\'T WARN', - 'license': 'MIT' - }; - const packageJsonPath = path.join(packageInstallFolder, PACKAGE_JSON_FILENAME); - fs.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); - } - catch (e) { - throw new Error(`Unable to create package.json: ${e}`); - } -} -/** - * Run "npm install" in the package install folder. - */ -function _installPackage(packageInstallFolder, name, version) { - try { - console.log(`Installing ${name}...`); - const npmPath = getNpmPath(); - const result = childProcess.spawnSync(npmPath, ['install'], { - stdio: 'inherit', - cwd: packageInstallFolder, - env: process.env - }); - if (result.status !== 0) { - throw new Error('"npm install" encountered an error'); - } - console.log(`Successfully installed ${name}@${version}`); - } - catch (e) { - throw new Error(`Unable to install package: ${e}`); - } -} -/** - * Get the ".bin" path for the package. - */ -function _getBinPath(packageInstallFolder, binName) { - const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - const resolvedBinName = (os.platform() === 'win32') ? `${binName}.cmd` : binName; - return path.resolve(binFolderPath, resolvedBinName); -} -/** - * Write a flag file to the package's install directory, signifying that the install was successful. - */ -function _writeFlagFile(packageInstallFolder) { - try { - const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - fs.writeFileSync(flagFilePath, process.version); - } - catch (e) { - throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); - } -} -function _getRushTempFolder(rushCommonFolder) { - const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; - if (rushTempFolder !== undefined) { - _ensureFolder(rushTempFolder); - return rushTempFolder; - } - else { - return _ensureAndJoinPath(rushCommonFolder, 'temp'); - } -} -function _ensureFolder(folderPath) { - if (!fs.existsSync(folderPath)) { - const parentDir = path.dirname(folderPath); - _ensureFolder(parentDir); - fs.mkdirSync(folderPath); - } -} -function installAndRun(packageName, packageVersion, packageBinName, packageBinArgs) { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = path.join(rushJsonFolder, 'common'); - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); - if (!_isPackageAlreadyInstalled(packageInstallFolder)) { - // The package isn't already installed - _cleanInstallFolder(rushTempFolder, packageInstallFolder); - const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); - _syncNpmrc(sourceNpmrcFolder, packageInstallFolder); - _createPackageJson(packageInstallFolder, packageName, packageVersion); - _installPackage(packageInstallFolder, packageName, packageVersion); - _writeFlagFile(packageInstallFolder); - } - const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; - const statusMessageLine = new Array(statusMessage.length + 1).join('-'); - console.log(os.EOL + statusMessage + os.EOL + statusMessageLine + os.EOL); - const binPath = _getBinPath(packageInstallFolder, packageBinName); - const result = childProcess.spawnSync(binPath, packageBinArgs, { - stdio: 'inherit', - cwd: process.cwd(), - env: process.env - }); - return result.status; -} -exports.installAndRun = installAndRun; -function runWithErrorAndStatusCode(fn) { - process.exitCode = 1; - try { - const exitCode = fn(); - process.exitCode = exitCode; - } - catch (e) { - console.error(os.EOL + os.EOL + e.toString() + os.EOL + os.EOL); - } -} -exports.runWithErrorAndStatusCode = runWithErrorAndStatusCode; -function _run() { - const [nodePath, /* Ex: /bin/node */ scriptPath, /* /repo/common/scripts/install-run-rush.js */ rawPackageSpecifier, /* qrcode@^1.2.0 */ packageBinName, /* qrcode */ ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; - if (!nodePath) { - throw new Error('Unexpected exception: could not detect node path'); - } - if (path.basename(scriptPath).toLowerCase() !== 'install-run.js') { - // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control - // to the script that (presumably) imported this file - return; - } - if (process.argv.length < 4) { - console.log('Usage: install-run.js @ [args...]'); - console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); - process.exit(1); - } - runWithErrorAndStatusCode(() => { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); - const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); - const name = packageSpecifier.name; - const version = _resolvePackageVersion(rushCommonFolder, packageSpecifier); - if (packageSpecifier.version !== version) { - console.log(`Resolved to ${name}@${version}`); - } - return installAndRun(name, version, packageBinName, packageBinArgs); - }); -} -_run(); +"use strict"; +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for license information. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runWithErrorAndStatusCode = exports.installAndRun = exports.findRushJsonFolder = exports.getNpmPath = exports.RUSH_JSON_FILENAME = void 0; +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where a Node tool may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the specified +// version of the specified tool (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ +const childProcess = __importStar(require("child_process")); +const fs = __importStar(require("fs")); +const os = __importStar(require("os")); +const path = __importStar(require("path")); +exports.RUSH_JSON_FILENAME = 'rush.json'; +const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; +const INSTALLED_FLAG_FILENAME = 'installed.flag'; +const NODE_MODULES_FOLDER_NAME = 'node_modules'; +const PACKAGE_JSON_FILENAME = 'package.json'; +/** + * Parse a package specifier (in the form of name\@version) into name and version parts. + */ +function _parsePackageSpecifier(rawPackageSpecifier) { + rawPackageSpecifier = (rawPackageSpecifier || '').trim(); + const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); + let name; + let version = undefined; + if (separatorIndex === 0) { + // The specifier starts with a scope and doesn't have a version specified + name = rawPackageSpecifier; + } + else if (separatorIndex === -1) { + // The specifier doesn't have a version + name = rawPackageSpecifier; + } + else { + name = rawPackageSpecifier.substring(0, separatorIndex); + version = rawPackageSpecifier.substring(separatorIndex + 1); + } + if (!name) { + throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); + } + return { name, version }; +} +/** + * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims + * unusable lines from the .npmrc file. + * + * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in + * the .npmrc file to provide different authentication tokens for different registry. + * However, if the environment variable is undefined, it expands to an empty string, which + * produces a valid-looking mapping with an invalid URL that causes an error. Instead, + * we'd prefer to skip that line and continue looking in other places such as the user's + * home directory. + * + * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities.copyAndTrimNpmrcFile() + */ +function _copyAndTrimNpmrcFile(sourceNpmrcPath, targetNpmrcPath) { + console.log(`Transforming ${sourceNpmrcPath}`); // Verbose + console.log(` --> "${targetNpmrcPath}"`); + let npmrcFileLines = fs.readFileSync(sourceNpmrcPath).toString().split('\n'); + npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); + const resultLines = []; + // This finds environment variable tokens that look like "${VAR_NAME}" + const expansionRegExp = /\$\{([^\}]+)\}/g; + // Comment lines start with "#" or ";" + const commentRegExp = /^\s*[#;]/; + // Trim out lines that reference environment variables that aren't defined + for (const line of npmrcFileLines) { + let lineShouldBeTrimmed = false; + // Ignore comment lines + if (!commentRegExp.test(line)) { + const environmentVariables = line.match(expansionRegExp); + if (environmentVariables) { + for (const token of environmentVariables) { + // Remove the leading "${" and the trailing "}" from the token + const environmentVariableName = token.substring(2, token.length - 1); + // Is the environment variable defined? + if (!process.env[environmentVariableName]) { + // No, so trim this line + lineShouldBeTrimmed = true; + break; + } + } + } + } + if (lineShouldBeTrimmed) { + // Example output: + // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" + resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); + } + else { + resultLines.push(line); + } + } + fs.writeFileSync(targetNpmrcPath, resultLines.join(os.EOL)); +} +/** + * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file. + * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder. + * + * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() + */ +function _syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish) { + const sourceNpmrcPath = path.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); + const targetNpmrcPath = path.join(targetNpmrcFolder, '.npmrc'); + try { + if (fs.existsSync(sourceNpmrcPath)) { + _copyAndTrimNpmrcFile(sourceNpmrcPath, targetNpmrcPath); + } + else if (fs.existsSync(targetNpmrcPath)) { + // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target + console.log(`Deleting ${targetNpmrcPath}`); // Verbose + fs.unlinkSync(targetNpmrcPath); + } + } + catch (e) { + throw new Error(`Error syncing .npmrc file: ${e}`); + } +} +let _npmPath = undefined; +/** + * Get the absolute path to the npm executable + */ +function getNpmPath() { + if (!_npmPath) { + try { + if (os.platform() === 'win32') { + // We're on Windows + const whereOutput = childProcess.execSync('where npm', { stdio: [] }).toString(); + const lines = whereOutput.split(os.EOL).filter((line) => !!line); + // take the last result, we are looking for a .cmd command + // see https://github.com/microsoft/rushstack/issues/759 + _npmPath = lines[lines.length - 1]; + } + else { + // We aren't on Windows - assume we're on *NIX or Darwin + _npmPath = childProcess.execSync('command -v npm', { stdio: [] }).toString(); + } + } + catch (e) { + throw new Error(`Unable to determine the path to the NPM tool: ${e}`); + } + _npmPath = _npmPath.trim(); + if (!fs.existsSync(_npmPath)) { + throw new Error('The NPM executable does not exist'); + } + } + return _npmPath; +} +exports.getNpmPath = getNpmPath; +function _ensureFolder(folderPath) { + if (!fs.existsSync(folderPath)) { + const parentDir = path.dirname(folderPath); + _ensureFolder(parentDir); + fs.mkdirSync(folderPath); + } +} +/** + * Create missing directories under the specified base directory, and return the resolved directory. + * + * Does not support "." or ".." path segments. + * Assumes the baseFolder exists. + */ +function _ensureAndJoinPath(baseFolder, ...pathSegments) { + let joinedPath = baseFolder; + try { + for (let pathSegment of pathSegments) { + pathSegment = pathSegment.replace(/[\\\/]/g, '+'); + joinedPath = path.join(joinedPath, pathSegment); + if (!fs.existsSync(joinedPath)) { + fs.mkdirSync(joinedPath); + } + } + } + catch (e) { + throw new Error(`Error building local installation folder (${path.join(baseFolder, ...pathSegments)}): ${e}`); + } + return joinedPath; +} +function _getRushTempFolder(rushCommonFolder) { + const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; + if (rushTempFolder !== undefined) { + _ensureFolder(rushTempFolder); + return rushTempFolder; + } + else { + return _ensureAndJoinPath(rushCommonFolder, 'temp'); + } +} +/** + * Resolve a package specifier to a static version + */ +function _resolvePackageVersion(rushCommonFolder, { name, version }) { + if (!version) { + version = '*'; // If no version is specified, use the latest version + } + if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { + // If the version contains only characters that we recognize to be used in static version specifiers, + // pass the version through + return version; + } + else { + // version resolves to + try { + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); + _syncNpmrc(sourceNpmrcFolder, rushTempFolder); + const npmPath = getNpmPath(); + // This returns something that looks like: + // @microsoft/rush@3.0.0 '3.0.0' + // @microsoft/rush@3.0.1 '3.0.1' + // ... + // @microsoft/rush@3.0.20 '3.0.20' + // + const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], { + cwd: rushTempFolder, + stdio: [] + }); + if (npmVersionSpawnResult.status !== 0) { + throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); + } + const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); + const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line); + const latestVersion = versionLines[versionLines.length - 1]; + if (!latestVersion) { + throw new Error('No versions found for the specified version range.'); + } + const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/); + if (!versionMatches) { + throw new Error(`Invalid npm output ${latestVersion}`); + } + return versionMatches[1]; + } + catch (e) { + throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); + } + } +} +let _rushJsonFolder; +/** + * Find the absolute path to the folder containing rush.json + */ +function findRushJsonFolder() { + if (!_rushJsonFolder) { + let basePath = __dirname; + let tempPath = __dirname; + do { + const testRushJsonPath = path.join(basePath, exports.RUSH_JSON_FILENAME); + if (fs.existsSync(testRushJsonPath)) { + _rushJsonFolder = basePath; + break; + } + else { + basePath = tempPath; + } + } while (basePath !== (tempPath = path.dirname(basePath))); // Exit the loop when we hit the disk root + if (!_rushJsonFolder) { + throw new Error('Unable to find rush.json.'); + } + } + return _rushJsonFolder; +} +exports.findRushJsonFolder = findRushJsonFolder; +/** + * Detects if the package in the specified directory is installed + */ +function _isPackageAlreadyInstalled(packageInstallFolder) { + try { + const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + if (!fs.existsSync(flagFilePath)) { + return false; + } + const fileContents = fs.readFileSync(flagFilePath).toString(); + return fileContents.trim() === process.version; + } + catch (e) { + return false; + } +} +/** + * Removes the following files and directories under the specified folder path: + * - installed.flag + * - + * - node_modules + */ +function _cleanInstallFolder(rushTempFolder, packageInstallFolder) { + try { + const flagFile = path.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); + if (fs.existsSync(flagFile)) { + fs.unlinkSync(flagFile); + } + const packageLockFile = path.resolve(packageInstallFolder, 'package-lock.json'); + if (fs.existsSync(packageLockFile)) { + fs.unlinkSync(packageLockFile); + } + const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); + if (fs.existsSync(nodeModulesFolder)) { + const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); + fs.renameSync(nodeModulesFolder, path.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); + } + } + catch (e) { + throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); + } +} +function _createPackageJson(packageInstallFolder, name, version) { + try { + const packageJsonContents = { + name: 'ci-rush', + version: '0.0.0', + dependencies: { + [name]: version + }, + description: "DON'T WARN", + repository: "DON'T WARN", + license: 'MIT' + }; + const packageJsonPath = path.join(packageInstallFolder, PACKAGE_JSON_FILENAME); + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); + } + catch (e) { + throw new Error(`Unable to create package.json: ${e}`); + } +} +/** + * Run "npm install" in the package install folder. + */ +function _installPackage(packageInstallFolder, name, version) { + try { + console.log(`Installing ${name}...`); + const npmPath = getNpmPath(); + const result = childProcess.spawnSync(npmPath, ['install'], { + stdio: 'inherit', + cwd: packageInstallFolder, + env: process.env + }); + if (result.status !== 0) { + throw new Error('"npm install" encountered an error'); + } + console.log(`Successfully installed ${name}@${version}`); + } + catch (e) { + throw new Error(`Unable to install package: ${e}`); + } +} +/** + * Get the ".bin" path for the package. + */ +function _getBinPath(packageInstallFolder, binName) { + const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + const resolvedBinName = os.platform() === 'win32' ? `${binName}.cmd` : binName; + return path.resolve(binFolderPath, resolvedBinName); +} +/** + * Write a flag file to the package's install directory, signifying that the install was successful. + */ +function _writeFlagFile(packageInstallFolder) { + try { + const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + fs.writeFileSync(flagFilePath, process.version); + } + catch (e) { + throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); + } +} +function installAndRun(packageName, packageVersion, packageBinName, packageBinArgs) { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = path.join(rushJsonFolder, 'common'); + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); + if (!_isPackageAlreadyInstalled(packageInstallFolder)) { + // The package isn't already installed + _cleanInstallFolder(rushTempFolder, packageInstallFolder); + const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); + _syncNpmrc(sourceNpmrcFolder, packageInstallFolder); + _createPackageJson(packageInstallFolder, packageName, packageVersion); + _installPackage(packageInstallFolder, packageName, packageVersion); + _writeFlagFile(packageInstallFolder); + } + const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; + const statusMessageLine = new Array(statusMessage.length + 1).join('-'); + console.log(os.EOL + statusMessage + os.EOL + statusMessageLine + os.EOL); + const binPath = _getBinPath(packageInstallFolder, packageBinName); + const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to + // assign via the process.env proxy to ensure that we append to the right PATH key. + const originalEnvPath = process.env.PATH || ''; + let result; + try { + // Node.js on Windows can not spawn a file when the path has a space on it + // unless the path gets wrapped in a cmd friendly way and shell mode is used + const shouldUseShell = binPath.includes(' ') && os.platform() === 'win32'; + const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath; + process.env.PATH = [binFolderPath, originalEnvPath].join(path.delimiter); + result = childProcess.spawnSync(platformBinPath, packageBinArgs, { + stdio: 'inherit', + windowsVerbatimArguments: false, + shell: shouldUseShell, + cwd: process.cwd(), + env: process.env + }); + } + finally { + process.env.PATH = originalEnvPath; + } + if (result.status !== null) { + return result.status; + } + else { + throw result.error || new Error('An unknown error occurred.'); + } +} +exports.installAndRun = installAndRun; +function runWithErrorAndStatusCode(fn) { + process.exitCode = 1; + try { + const exitCode = fn(); + process.exitCode = exitCode; + } + catch (e) { + console.error(os.EOL + os.EOL + e.toString() + os.EOL + os.EOL); + } +} +exports.runWithErrorAndStatusCode = runWithErrorAndStatusCode; +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; + if (!nodePath) { + throw new Error('Unexpected exception: could not detect node path'); + } + if (path.basename(scriptPath).toLowerCase() !== 'install-run.js') { + // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control + // to the script that (presumably) imported this file + return; + } + if (process.argv.length < 4) { + console.log('Usage: install-run.js @ [args...]'); + console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); + process.exit(1); + } + runWithErrorAndStatusCode(() => { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); + const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); + const name = packageSpecifier.name; + const version = _resolvePackageVersion(rushCommonFolder, packageSpecifier); + if (packageSpecifier.version !== version) { + console.log(`Resolved to ${name}@${version}`); + } + return installAndRun(name, version, packageBinName, packageBinArgs); + }); +} +_run(); //# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/docker/fabric-nodeenv/Dockerfile b/docker/fabric-nodeenv/Dockerfile index 252632c9..c94090e4 100644 --- a/docker/fabric-nodeenv/Dockerfile +++ b/docker/fabric-nodeenv/Dockerfile @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 # -ARG NODE_VER=12.13.0 +ARG NODE_VER=12.22.6 FROM node:${NODE_VER}-alpine RUN apk add --no-cache \ make \ diff --git a/docker/fabric-nodeenv/docker.js b/docker/fabric-nodeenv/docker.js index 7c56d7aa..2523fa44 100644 --- a/docker/fabric-nodeenv/docker.js +++ b/docker/fabric-nodeenv/docker.js @@ -15,8 +15,8 @@ const util = require('util'); const { shell: runcmds } = require('toolchain'); -const version = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'))).version; -const node_version = process.env.NODE_VERSION || '12.9.1'; +const version = JSON.parse(fs.readFileSync(path.join(__dirname,'package.json'))).version; +const node_version = process.env.NODE_VERSION || '12.16.1'; const build_dir = path.join(__dirname); const tag = version + '-' + git.short(); @@ -41,4 +41,4 @@ const imageClean = async () => { ]); }; -exports.default = series(imageClean, imageBuild); \ No newline at end of file +exports.default = series(imageClean, imageBuild); diff --git a/docker/fabric-nodeenv/package.json b/docker/fabric-nodeenv/package.json index 2ec6f23e..e250088d 100644 --- a/docker/fabric-nodeenv/package.json +++ b/docker/fabric-nodeenv/package.json @@ -1,6 +1,6 @@ { "name": "fabric-nodeenv", - "version": "1.0.0", + "version": "2.2.4-unstable", "description": "", "main": "docker.js", "scripts": { diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000..abf59032 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,10 @@ +--- +title: "404 - Page Not Found" +permalink: /404.html +--- + +## The page you wanted does not exist + +If you were looking for JSDoc, try one of the releases below: + +{% include apidocs.html %} diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..3a804c13 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +[You probably want to look here](https://hyperledger.github.io/fabric-chaincode-node/) diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..2a6864a2 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,6 @@ +theme: minima +title: "fabric-chaincode-node" +releases: + - master + - release-1.4 + - release-2.2 diff --git a/docs/_includes/apidocs.html b/docs/_includes/apidocs.html new file mode 100644 index 00000000..e1251697 --- /dev/null +++ b/docs/_includes/apidocs.html @@ -0,0 +1,5 @@ + diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html new file mode 100644 index 00000000..e69de29b diff --git a/docs/_includes/header.html b/docs/_includes/header.html new file mode 100644 index 00000000..07dbfcff --- /dev/null +++ b/docs/_includes/header.html @@ -0,0 +1,27 @@ + + \ No newline at end of file diff --git a/docs/_jsdoc.json b/docs/_jsdoc.json new file mode 100644 index 00000000..bb27e143 --- /dev/null +++ b/docs/_jsdoc.json @@ -0,0 +1,29 @@ +{ + "source": { + "include": [ + "./_jsdoc/index.md", + "../libraries/fabric-shim/lib/chaincode.js", + "../libraries/fabric-shim/lib/stub.js", + "../libraries/fabric-shim/lib/iterators.js", + "../apis/fabric-contract-api/lib" + ] + }, + "sourceType": "module", + "opts": { + "destination": "./gen", + "recurse": true, + "template": "./node_modules/ink-docstrap/template", + "tutorials": "./_jsdoc/tutorials" + }, + "templates": { + "systemName": "Hyperledger Fabric SDK for node.js", + "theme": "cosmo", + "default": { + "staticFiles": { + "include": [ + "./_jsdoc/static" + ] + } + } + } +} diff --git a/docs/apidocs/README.md b/docs/_jsdoc/index.md similarity index 65% rename from docs/apidocs/README.md rename to docs/_jsdoc/index.md index 1383897c..7de2eec8 100644 --- a/docs/apidocs/README.md +++ b/docs/_jsdoc/index.md @@ -1,25 +1,19 @@ -[![NPM](https://nodei.co/npm/fabric-contract-api.svg?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/fabric-contract-api/) -[![Version](https://badge.fury.io/js/fabric-contract-api.svg)](http://badge.fury.io/js/fabric-contract-api) +[![Build Status](https://dev.azure.com/Hyperledger/Fabric-Chaincode-Node/_apis/build/status/Fabric-Chaincode-Node?branchName=master)](https://dev.azure.com/Hyperledger/Fabric-Chaincode-Node/_build/latest?definitionId=33&branchName=master) +[![fabric-contract-api npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-contract-api)](https://www.npmjs.com/package/fabric-contract-api) +[![fabric-shim npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-shim)](https://www.npmjs.com/package/fabric-shim) +[![fabric-shim-api npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-shim-api)](https://www.npmjs.com/package/fabric-shim-api) +[![fabric-shim-crypto npm module](https://img.shields.io/npm/v/fabric-shim?label=fabric-shim-crypto)](https://www.npmjs.com/package/fabric-shim-crypto) +[![Rocket.Chat](https://chat.hyperledger.org/images/join-chat.svg)](https://chat.hyperledger.org/channel/fabric-chaincode-dev) +## Overview - -[![NPM](https://nodei.co/npm/fabric-shim.svg?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/fabric-shim/) -[![Version](https://badge.fury.io/js/fabric-shim.svg)](http://badge.fury.io/js/fabric-shim) - -## Introduction - -The `fabric-contract-api` provides the *contract interface*. a high level API for application developers to implement [Smart Contracts](https://hyperledger-fabric.readthedocs.io/en/latest/glossary.html#smart-contract). Within Hyperledger Fabric, Smart Contracts are also known as [Chaincode](https://hyperledger-fabric.readthedocs.io/en/latest/glossary.html#chaincode). Working with this API provides a high level entry point to writing business logic. +The `fabric-contract-api` provides the *contract interface*. a high level API for application developers to implement [Smart Contracts](https://hyperledger-fabric.readthedocs.io/en/release-2.1/glossary.html#smart-contract). Within Hyperledger Fabric, Smart Contracts are also known as [Chaincode](https://hyperledger-fabric.readthedocs.io/en/release-2.1/glossary.html#chaincode). Working with this API provides a high level entry point to writing business logic. The `fabric-shim` provides the *chaincode interface*, a lower level API for implementing "Smart Contracts". It also provides the implementation to support communication with Hyperledger Fabric peers for Smart Contracts written using the `fabric-contract-api` together with the `fabric-chaincode-node` cli to launch Chaincode or Smart Contracts. To confirm that the `fabric-shim` maintains API and functional compatibility with previous versions of Hyperledger Fabric. -Detailed explanation on the concept and programming model can be found here: [http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html](http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html). - - -## API documentation versions - -[Release 1.3](../release-1.3) | [Release 1.2](../release-1.2) | [Release 1.1](../release-1.1) | [Master branch](../master) +A more detailed explanation on the concept and programming model can be found in the [smart contract processing topic](https://hyperledger-fabric.readthedocs.io/en/release-2.1/developapps/smartcontract.html). ## Contract Interface @@ -31,7 +25,7 @@ npm install --save fabric-contract-api ### Usage -Implement a class that ends the `contract` class, a constructor is needed. +Implement a class that ends the `contract` class, a constructor is needed. The other functions will be invokable functions of your Smart Contract ```javascript @@ -91,12 +85,13 @@ module.exports.contracts = ['UpdateValues']; ## Chaincode Interface ### Installation + ```sh npm install --save fabric-shim ``` ### Usage -The [chaincode interface](https://fabric-shim.github.io/ChaincodeInterface.html) contains two methods to be implemented: +The [chaincode interface](https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/fabric-shim.ChaincodeInterface.html) contains two methods to be implemented: ```javascript const shim = require('fabric-shim'); @@ -130,14 +125,6 @@ Start the chaincode process and listen for incoming endorsement requests: shim.start(new Chaincode()); ``` -### API Reference -Visit [fabric-shim.github.io](https://fabric-shim.github.io/) and click on "Classes" link in the navigation bar on the top to view the list of class APIs. - - - -## Support -Tested with node.js 8.9.0 (LTS). - ## License This package is distributed under the diff --git a/docs/apidocs/bootstrap/contract-schema.json b/docs/_jsdoc/static/contract-schema.json similarity index 100% rename from docs/apidocs/bootstrap/contract-schema.json rename to docs/_jsdoc/static/contract-schema.json diff --git a/docs/tutorials/annotated-contract-metadata.md b/docs/_jsdoc/tutorials/annotated-contract-metadata.md similarity index 71% rename from docs/tutorials/annotated-contract-metadata.md rename to docs/_jsdoc/tutorials/annotated-contract-metadata.md index b4240e3b..0fffaeb9 100644 --- a/docs/tutorials/annotated-contract-metadata.md +++ b/docs/_jsdoc/tutorials/annotated-contract-metadata.md @@ -5,10 +5,10 @@ The Contract Metadata can be supplied either by the Contract developer or it can ## Metadata Schema -The metadata itself is in JSON, and there is a JSON-Schema definition that defines the contents; this schema is available online at http://fabric-shim.github.io/contract-schema.json +The metadata itself is in JSON, and there is a JSON-Schema definition that defines the contents; this schema is available online at https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json -This is the latest ga copy of the schema. Specific version can be obtained using urls http://fabric-shim.github.io/{release}/contract-schema.json where releases matches the release name, for example -`master` `release-1.4`. Note that metadata was first introduced at v1.4. +This is the latest ga copy of the schema. Specific version can be obtained using urls https://hyperledger.github.io/fabric-chaincode-node/{release}/api/contract-schema.json where releases matches the release name, for example +`master` `release-1.4` `release-2.1`. Note that metadata was first introduced at v1.4. A lot of the elements of this metadata are heavily inspired from the [OpenAPI v3.0 specification](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md) and [JSON Schema](http://json-schema.org/) @@ -16,7 +16,7 @@ Adding a reference at the top of the metadata file to this schema, permits edito ```json { - "$schema": "http://fabric-shim.github.io/contract-schema.json", + "$schema": "https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json", } ``` @@ -28,9 +28,11 @@ If within the contract metadata is supplied, then this will be validated against If you wish to supply your own metadata, the following rules apply - it must be in a file called `metadata.json` -- this must be in a directory called `contract-metadata` +- this must be in a directory called `META-INF` (alternatively, it can be in the `contract-metadata` directory as well) - this directory must be a peer of the package.json file of your contract +`metadata.json` primarily should be supplied in `META-INF` directory, but if it's not found in `META-INF`, it will be checked for in the `contract-metadata` directory. + Depending on the language and implementation, you may only need to augment the metadata. For example, with Typescript the types of arguments can be derived. Typically a full 'info' section may be the only thing that needs augmenting. Therefore it is not required to specific all elements of the metadata The metadata consists of three top level objects, 'info' 'contracts' and 'components'; you can supply all or none of these elements. (Supplying none is not considered an error, but has no practical effect) @@ -136,7 +138,7 @@ A starting example is a very simple transaction function. { "name": "setGreetingText", "tag": [ - "submitTx" + "SUBMIT", "submitTx" ], "parameters": [ { @@ -159,7 +161,7 @@ A starting example is a very simple transaction function. ``` - the name of the function is 'setGreetingText' -- it has a tag of 'submitTx' that means that this transaction is intended to be submitted with the 'submitTransaction' sdk function. The implication is that this is then submitted to the orderder. If this is not present, then the function will be 'evaluated', not submitted to the order so in effect a query-style operation. +- it has tags of 'SUBMIT' and 'submitTx' that means that this transaction is intended to be submitted with the 'submitTransaction' sdk function. The implication is that this is then submitted to the orderder. If this is not present, then the function will be 'evaluated', not submitted to the order so in effect a query-style operation. - the parameters of the function are defined in 'parameters' as an array of parameter definitions. (each of which follows the [parameterObject](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#parameterObject) of OpenAPI) - typically a parameter will contain a 'name', optional 'description' and critically the 'schema' - again 'schema' comes from OpenAPI [schemaObject](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#schemaObject) @@ -255,4 +257,66 @@ This example is defining the concept of a person; who has a name, address and an } } } -``` \ No newline at end of file +``` +## String and Number validation + +Strict semantic checking can be performed on strings and numbers. As an example consider this extract of metadata describing the parameters of a function +``` + "parameters": [ + { + "name": "pupilName", + "description": "", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "formId", + "description": "", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-zA-Z0-9]+$" + } + }, + { + "name": "description", + "description": "", + "required": true, + "schema": { + "type": "string", + "maxLength": 100 + } + }, + { + "name": "lifetime", + "description": "days this is valid for (30 if not given)", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 30 + } + }, + { + "name": "startDate", + "description": "Start date yyyy-mm-dd, today if not specified", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + } + ] +``` + +**Note: The `required` tag at present is not enforced by the node chaincode.** + +- __Pupilname__ this is a string, but has no restrictions placed up on it. +- __formId__ a string, but has to matched the regular expression. In this case it has to be exactly composed of lower or upcase letters and numbers +- __description__ a string, with the restriction that it can't be more than 100 characters in length +- __lifetime__ an integer with minimum value of 1 and maxiomum of 30 +- __startDate__ an string but has to contain a date (As defined by full-date - [RFC3339](http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14)). + +The alternative to `format:date` is `format:dateTime` ... the string here has to confirmed to date-time defined in [RFC3339](http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14) \ No newline at end of file diff --git a/docs/tutorials/data-types-and-contracts.md b/docs/_jsdoc/tutorials/data-types-and-contracts.md similarity index 100% rename from docs/tutorials/data-types-and-contracts.md rename to docs/_jsdoc/tutorials/data-types-and-contracts.md diff --git a/docs/tutorials/deep-dive-contract-interface.md b/docs/_jsdoc/tutorials/deep-dive-contract-interface.md similarity index 97% rename from docs/tutorials/deep-dive-contract-interface.md rename to docs/_jsdoc/tutorials/deep-dive-contract-interface.md index 9769e9ec..e1d12af2 100644 --- a/docs/tutorials/deep-dive-contract-interface.md +++ b/docs/_jsdoc/tutorials/deep-dive-contract-interface.md @@ -35,7 +35,7 @@ export { GreetingContract } from './greetingcontract'; export const contracts: any[] = [ GreetingContract ]; ``` -- contract-metadata/metadata.json +- META-INF/metadata.json (alternatively contract-metadata/metadata.json) This file describes the *external* api that is exposed from these Smart Contracts; these are the functions that can be invoked by client applications. It describes all details about what is callable, and the datatypes of parameter and return values. It can also include information about documentation and licensing. @@ -117,7 +117,7 @@ A correctly specified metadata file, at the top level has this structure ```json { - "$schema" : "https://fabric-shim.github.io/master/contract-schema.json", + "$schema" : "https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json", "info" : { }, diff --git a/docs/apidocs/tutorials/tutorials.json b/docs/_jsdoc/tutorials/tutorials.json similarity index 71% rename from docs/apidocs/tutorials/tutorials.json rename to docs/_jsdoc/tutorials/tutorials.json index 4093e480..a4e43c6f 100644 --- a/docs/apidocs/tutorials/tutorials.json +++ b/docs/_jsdoc/tutorials/tutorials.json @@ -5,9 +5,6 @@ "using-contractinterface":{ "title":"Using the Contract Interface" }, - "using-iterators":{ - "title":"Working with apis that return iterators" - }, "annotated-contract-metadata":{ "title":"Walkthrough of annotated metadata.json" }, @@ -16,6 +13,12 @@ }, "using-typescript-decorators":{ "title":"Using TypeScript Decorators" - } + }, + "data-types-and-contracts":{ + "title":"Details of type handling" + }, + "using-iterators": { + "title":"Working with apis that return iterators" + } -} +} \ No newline at end of file diff --git a/docs/apidocs/tutorials/using-chaincodeinterface.md b/docs/_jsdoc/tutorials/using-chaincodeinterface.md similarity index 97% rename from docs/apidocs/tutorials/using-chaincodeinterface.md rename to docs/_jsdoc/tutorials/using-chaincodeinterface.md index 2c049958..4df5f9c9 100644 --- a/docs/apidocs/tutorials/using-chaincodeinterface.md +++ b/docs/_jsdoc/tutorials/using-chaincodeinterface.md @@ -8,7 +8,7 @@ cd mycc // create a new node project npm init // install fabric-shim at master branch -npm install 2.0.0-beta.1 +npm install fabric-shim@2.2.4-unstable // or using the released version npm install fabric-shim touch mychaincode.js @@ -60,15 +60,15 @@ Finally, update the "start" script in package.json to "node mychaincode.js": "version": "1.0.0", "description": "My first exciting chaincode implemented in node.js", "engines": { - "node": ">=8.4.0", - "npm": ">=5.3.0" + "node": "^12.16.1", + "npm": "^6.4.1" }, "scripts": { "start" : "node mychaincode.js" }, "engine-strict": true, "engineStrict": true, "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable" } } ``` diff --git a/docs/apidocs/tutorials/using-contractinterface.md b/docs/_jsdoc/tutorials/using-contractinterface.md similarity index 94% rename from docs/apidocs/tutorials/using-contractinterface.md rename to docs/_jsdoc/tutorials/using-contractinterface.md index b63bc196..ab1c9b57 100644 --- a/docs/apidocs/tutorials/using-contractinterface.md +++ b/docs/_jsdoc/tutorials/using-contractinterface.md @@ -1,6 +1,6 @@ -This outlines the theory of the how the new node module works; with the fabric samples project you will find scenario-based approaches. +This outlines the theory of the how the new node module works; with the fabric samples project you will find scenario-based approaches. ## Writing the chaincode @@ -8,15 +8,15 @@ This outlines the theory of the how the new node module works; with the fabric s An initial `package.json` is as follows; -The dependencies of `fabric-chaincode-api` and `fabric-shim` will be required. +The dependencies of `fabric-contract-api` and `fabric-shim` will be required. ``` { "name": "chaincode", "description": "My first exciting chaincode implemented in node.js", "engines": { - "node": ">=8.4.0", - "npm": ">=5.3.0" + "node": "^12.16.1", + "npm": "^6.4.1" }, "scripts": { "test":"mocha..... @@ -28,13 +28,13 @@ The dependencies of `fabric-chaincode-api` and `fabric-shim` will be required. "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-chaincode-api": "^1.4.0", - "fabric-shim": "^1.4.0" + "fabric-contract-api": "^2.2.4-unstable", + "fabric-shim": "^2.2.4-unstable" } } ``` -Remember to add in any additional business logic, and testing libraries needed +Remember to add in any additional business logic, and testing libraries needed Adding `fabric-shim` as a dependency, gives a command `fabric-chaincode-node` that is the script to run for `npm start`. @@ -65,7 +65,7 @@ Within the class you can defined as many or functions as you wish. These transac Node states that module exports are defined in `index.js` -In this example we have a single value that can be queried and updated. This has been split into to parts for demonstration purposes. +In this example we have a single value that can be queried and updated. This has been split into to parts for demonstration purposes. ``` // index.js @@ -77,7 +77,7 @@ const RemoveValues = require('./removevalues') module.exports.contracts = [UpdateValues,RemoveValues]; ``` -This exports two classes that together form the Contract. There can be other code that within the model that is used in a support role. +This exports two classes that together form the Contract. There can be other code that within the model that is used in a support role. *Note that the 'contracts' word is mandatory.* ### 4: What do these classes need to contain? @@ -124,7 +124,7 @@ Note that ALL the functions defined in these modules will be called by the clien - There are 3 functions `setup` `setNewAssetValue` and `doubleAssetValue` that can be called by issuing the appropriate invoke client side - The `ctx` in the function is a transaction context; each time a invoke is called this will be a new instance that can be used by the function implementation to access apis such as the world state of information on invoking identity. -- The arguments are split out from the array passed on the invoke. +- The arguments are split out from the array passed on the invoke. - The constructor contains a 'name' to help identify the sets of functions ## Running chaincode in development mode @@ -158,21 +158,21 @@ Will get things working... Then you can invoke the chaincode via this command. ``` -$ peer chaincode invoke --orderer localhost:7050 --channelID mychannel -c '{"Args":["UpdateValuesContract:getAssetValue"]}' -n mycontract4 +$ peer chaincode invoke --orderer localhost:7050 --channelID mychannel -c '{"Args":["UpdateValuesContract:getAssetValue"]}' -n mycontract4 ``` ## Additional support provided by the SmartContract class -In the case where you ask for a function to be executed, it could be the case that this doesn't exist. -You can provide you own function to be executed in this case, the default is to throw and error but you're able to customise this if you wish. +In the case where you ask for a function to be executed, it could be the case that this doesn't exist. +You can provide you own function to be executed in this case, the default is to throw and error but you're able to customise this if you wish. For example ``` - /** - * Sets a name so that the functions in this particular class can + /** + * Sets a name so that the functions in this particular class can * be separated from others. */ constructor() { @@ -180,7 +180,7 @@ For example } /** The function to invoke if something unkown comes in. - * + * */ async unknownTransaction(ctx){ throw new Error('a custom error message') @@ -199,15 +199,15 @@ For example ### Structure of the Transaction Context -In Fabric, there is a *stub* api that provides chaincode with functionality. +In Fabric, there is a *stub* api that provides chaincode with functionality. No functionality has been removed, but a new approach to providing abstractions on this to facilitate programming. *user additions*: additional properties can be added to the object to support for example common handling of the data serialization. -The context object contains +The context object contains - `ctx.stub` the same stub instance as in earlier versions for compatibility -- `ctx.identity` and instance of the Client Identity object +- `ctx.identity` and instance of the Client Identity object You are at liberty to create a subclass of the Context to provide additional functions, or per-transaction context storage. For example @@ -220,7 +220,7 @@ You are at liberty to create a subclass of the Context to provide additional fun } ``` -and the Context class itself is +and the Context class itself is ``` const { Context } = require('fabric-contract-api'); @@ -255,7 +255,7 @@ Definitions as per https://www.ietf.org/rfc/rfc2119.txt - as per node.js language standard - Duplicate function names in a single class is an error - Any function that is dynamically added will not be registered as an invokable function -- There are no specific function that is invoked per Fabric's *init* chaincode spi. The instantiate flow can pass function name and parameters; therefore consider +- There are no specific function that is invoked per Fabric's *init* chaincode spi. The instantiate flow can pass function name and parameters; therefore consider a dedicated function that will be called for new chaincode deployments, and for upgrade deployments. ## Restrictions on programming in side a Contract function @@ -263,9 +263,9 @@ a dedicated function that will be called for new chaincode deployments, and for Hyperledger Fabric's consensus algorithm permits the ability to use general purpose languages; rather than a more restrictive language. But the following restrictions apply - Functions should not create random variables, or use any function whose return values are functions of the current time or location of execution - - i.e. the function will be executed in another context (i.e. peer process). This could potentially be in a different time zone in a different locale. + - i.e. the function will be executed in another context (i.e. peer process). This could potentially be in a different time zone in a different locale. - Functions should be away that they may read state, and write state. But they are producing a set of changes that will be applied to the state. The implication is that updates to the state -may not be read back. +may not be read back. ``` let v1 = getState("key") @@ -276,9 +276,9 @@ let v2 = getState("key") v2=="world" // is false, v2 is "hello" ``` -In any subsequent invocation, the value would be seen to be updated. +In any subsequent invocation, the value would be seen to be updated. -Note that if you have use any Flux architecture implications such as Redux, the above restrictions will be familiar. +Note that if you have use any Flux architecture implications such as Redux, the above restrictions will be familiar. diff --git a/docs/apidocs/tutorials/using-iterators.md b/docs/_jsdoc/tutorials/using-iterators.md similarity index 85% rename from docs/apidocs/tutorials/using-iterators.md rename to docs/_jsdoc/tutorials/using-iterators.md index c50e05fe..2f276bde 100644 --- a/docs/apidocs/tutorials/using-iterators.md +++ b/docs/_jsdoc/tutorials/using-iterators.md @@ -18,19 +18,19 @@ An example of these apis (but may not be a complete list) is given here - getStateByRange - getStateByRangeWithPagination -These api's are a request to return a set of data for which you need to iterate over using the provided iterator. Some of these apis will return the iterator directly and others return an iterator as part of an object property. In previous versions of the fabric-shim api you would need to know which ones did that and handle it appropriately and you need to check the documentation, but the rules are +These apis are a request to return a set of data for which you need to iterate over using the provided iterator. Some of these apis will return the iterator directly and others return an iterator as part of an object property. In previous versions of the fabric-shim api you would need to know which ones did that and handle it appropriately and you need to check the documentation, but the rules are - all private data range queries return an object with just an iterator property containing the iterator - all Pagination queries return an object with an iterator property and metadata property - all other rich/range/history queries return just the iterator itself. These iterators were essentially asynchronous iterators (the next and close methods returned promises) but you couldn't use standard iterator capabilities such as for/of constructs in node because node could not work with the concept of asynchronous iterators. -From fabric v2.0 onwards, node chaincode will be using node 10 as the node version and this has added support for asynchronous iterators. Also in fabric v2.0 onwards fabric-shim has added support to enable it's asynchronous iterators so that `for/of` can now be used, but note that they don't have full support so should not be used in generator functions. +From fabric v2.x onwards, node chaincode will be using node 12 and this has added support for asynchronous iterators. Also in fabric v2.x onwards, fabric-shim has added support to enable it's asynchronous iterators so that `for/of` can now be used, but note that they don't have full support, so should not be used in generator functions. -As a comparison lets present first how you would use iterators in previous releases and then show the new way. +As a comparison, let's present first how you would use iterators in previous releases and then show the new way. ## How to use, the old way -In the past, you might have coded something like this to process an iterator +In the past, you might have coded something like this to process an iterator: ```javascript async function getAllResults(iterator) { @@ -39,7 +39,7 @@ async function getAllResults(iterator) { const res = await iterator.next(); if (res.value) { // if not a getHistoryForKey iterator then key is contained in res.value.key - allResults.push(res.value.value.toString('utf8');); + allResults.push(res.value.value.toString('utf8')); } // check to see if we have reached then end @@ -68,10 +68,10 @@ interface KV { } interface KeyModification { - is_delete: boolean; + isDelete: boolean; value: ProtobufBytes; timestamp: Timestamp; - tx_id: string; + txId: string; getIsDelete(): boolean; getValue(): ProtobufBytes; getTimestamp(): Timestamp; @@ -84,7 +84,7 @@ and you would obtain an iterator as follows (depending on the api you are callin ```javascript // use await to get the iterator and pass it to getAllResults const iterator = await ctx.stub.getStateByRange(startKey, endKey); -let results await getAllResults(iterator); +let results = await getAllResults(iterator); // use await to get the object containing the iterator and metadata and // pass it to getAllResults. All Pagination type queries return an object @@ -152,9 +152,9 @@ const results = []; for await (const keyMod of promiseOfIterator) { const resp = { timestamp: keyMod.timestamp, - txid: keyMod.tx_id + txid: keyMod.txId } - if (keyMod.is_delete) { + if (keyMod.isDelete) { resp.data = 'KEY DELETED'; } else { resp.data = keyMod.value.toString('utf8'); diff --git a/docs/tutorials/using-typescript-decorators.md b/docs/_jsdoc/tutorials/using-typescript-decorators.md similarity index 95% rename from docs/tutorials/using-typescript-decorators.md rename to docs/_jsdoc/tutorials/using-typescript-decorators.md index e891151f..dab8a69f 100644 --- a/docs/tutorials/using-typescript-decorators.md +++ b/docs/_jsdoc/tutorials/using-typescript-decorators.md @@ -21,3 +21,4 @@ When using Typescript to code the Contract implementations, Typescript Decorator - @Param - Permits additional information such as a type and description to provided for parameters. (Note type is only useful in weakly typed languages) +**Note that emitDecoratorMetadata property in *tsconfig.json* file is mandatory.** diff --git a/docs/apidocs/Publish_API_Docs.sh b/docs/apidocs/Publish_API_Docs.sh deleted file mode 100755 index cd92202c..00000000 --- a/docs/apidocs/Publish_API_Docs.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -e -# -# Copyright IBM Corp All Rights Reserved -# -# SPDX-License-Identifier: Apache-2.0 -# - -cd ${WORKSPACE}/gopath/src/github.com/hyperledger/fabric-chaincode-node/docs/apidocs -# Generate chaincode-node API docs - -CHAINCODE_NODE_COMMIT=$(git rev-parse --short HEAD) -echo "---------> CHAINCODE_NODE_COMMIT:" $CHAINCODE_NODE_COMMIT -TARGET_REPO=$CHAINCODE_NODE_USERNAME.github.io.git -git config --global user.email "fabric.shim@gmail.com" -git config --global user.name "fabric-shim" -git clone https://github.com/$CHAINCODE_NODE_USERNAME/$TARGET_REPO - -# build docs -DOCS_ROOT=$CHAINCODE_NODE_USERNAME.github.io gulp -f docs.js docs - -cd $CHAINCODE_NODE_USERNAME.github.io -git add . -git commit -m "CHAINCODE_NODE commit - $CHAINCODE_NODE_COMMIT" -git config remote.gh-pages.url https://$CHAINCODE_NODE_USERNAME:$CHAINCODE_NODE_PASSWORD@github.com/$CHAINCODE_NODE_USERNAME/$TARGET_REPO - -# Push API docs to Target repository -git push gh-pages master diff --git a/docs/apidocs/docs.js b/docs/apidocs/docs.js deleted file mode 100644 index 4d0c8457..00000000 --- a/docs/apidocs/docs.js +++ /dev/null @@ -1,61 +0,0 @@ -/* -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -*/ -/* eslint-disable no-console */ -const gulp = require('gulp'); -const jsdoc = require('gulp-jsdoc3'); -const fs = require('fs-extra'); -const path = require('path'); -const replace = require('gulp-replace'); -let currentBranch = process.env.SYSTEM_PULLREQUEST_TARGETBRANCH; - -if (!currentBranch) { - currentBranch = 'master'; -} - -let docsRoot; -if (process.env.DOCS_ROOT) { - docsRoot = process.env.DOCS_ROOT; -} else { - docsRoot = './_out'; -} - -const clean = () => { - return fs.remove(path.join(docsRoot, currentBranch)); -}; - -const docSrc = [ - './README.md', - '../../libraries/fabric-shim/lib/chaincode.js', - '../../libraries/fabric-shim/lib/stub.js', - '../../libraries/fabric-shim/lib/iterators.js', - '../../apis/fabric-contract-api/lib/**/*.js' -]; - -const jsdocs = () => { - return gulp.src(docSrc, { read: false }).pipe(jsdoc({ - opts: { - tutorials: './tutorials', - destination: path.join(docsRoot, currentBranch) - }, - templates: { - systemName: 'Hyperledger Fabric Node.js Contract and Shim', - theme: 'cosmo' - }, - }) - ); -} - -const schemaDocs = () => { - return gulp.src('fabric-contract-api/schema/contract-schema.json') - .pipe(gulp.dest(path.join(docsRoot, currentBranch))); -}; - -// for the rare occurance where something needs to be bootsrap in the docs ahead of a release -gulp.task('bootstrap', function () { - gulp.src('./docs/bootstrap/**/*').pipe(gulp.dest(docsRoot)); -}); - -exports.docs = gulp.series(clean, jsdocs); \ No newline at end of file diff --git a/docs/apidocs/package.json b/docs/apidocs/package.json deleted file mode 100644 index e06adc44..00000000 --- a/docs/apidocs/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "apidocs", - "version": "1.0.0", - "description": "", - "main": "docs.js", - "scripts": { - "build": "gulp -f docs.js docs", - "publish": "./Publish_API_Docs.sh" - }, - "dependencies": { - "gulp": "^4.0.0", - "gulp-jsdoc3": "^2.0.0", - "gulp-replace": "^0.6.1", - "fs-extra": "8.1.0" - }, - "keywords": [], - "author": "", - "license": "Apache-2.0" -} diff --git a/docs/apidocs/redirectTemplates/404.html b/docs/apidocs/redirectTemplates/404.html deleted file mode 100644 index 718940b1..00000000 --- a/docs/apidocs/redirectTemplates/404.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - Single Page Apps for GitHub Pages - - - -

Sorry, a suitable documentation page can not be found

-

Please consult the main Hyperledger Fabric documentation

- - diff --git a/docs/apidocs/redirectTemplates/index.html b/docs/apidocs/redirectTemplates/index.html deleted file mode 100644 index 8d3c9681..00000000 --- a/docs/apidocs/redirectTemplates/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..4f85deb1 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,32 @@ +--- +layout: home +--- + +Hyperledger Fabric offers a number of SDKs to support developing smart contracts (chaincode) +in various programming languages. There are two other smart contract SDKs available for Java, and Go, in addition to this Node.js SDK: + + * [Java SDK documentation](https://hyperledger.github.io/fabric-chaincode-java/) + * [Go SDK documentation](https://godoc.org/github.com/hyperledger/fabric-chaincode-go) + +## Documentation + +Detailed explanation on the concepts and programming model for smart contracts can be found in the [Smart Contracts and Chaincode section in the Hyperledger Fabric documentation](https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html). + +API documentation is available for each release: + +{% include apidocs.html %} + +## Download + +The following packages are available from the npm Registry: + +- [fabric-contract-api](https://www.npmjs.com/package/fabric-contract-api) +- [fabric-shim](https://www.npmjs.com/package/fabric-shim) +- [fabric-shim-api](https://www.npmjs.com/package/fabric-shim-api) +- [fabric-shim-crypto](https://www.npmjs.com/package/fabric-shim-crypto) + +Check the [release notes](https://github.com/hyperledger/fabric-chaincode-node/releases) for the changes in each version. + +## Samples + +Node.js chaincode samples for commercial paper and fabcar can be found in the [fabric-samples repository](https://github.com/hyperledger/fabric-samples) diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..2947650d --- /dev/null +++ b/docs/package.json @@ -0,0 +1,18 @@ +{ + "name": "fabric-shim-docs", + "version": "1.0.0", + "description": "", + "private": true, + "scripts": { + "build": "npm run docs", + "docs": "rimraf ./gen && jsdoc -c ./_jsdoc.json" + }, + "devDependencies": { + "ink-docstrap": "^1.3.2", + "jsdoc": "^3.6.3", + "rimraf": "^3.0.0" + }, + "keywords": [], + "author": "", + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/fabric-ledger/package.json b/libraries/fabric-ledger/package.json new file mode 100644 index 00000000..85a1ff6c --- /dev/null +++ b/libraries/fabric-ledger/package.json @@ -0,0 +1,75 @@ +{ + "name": "fabric-ledger", + "version": "2.2.4-unstable", + "tag": "unstable", + "description": "A node.js implementation of Hyperledger Fabric ledger api, to allow access to ledger data from smart contracts", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "scripts": { + "build": "npm run test", + "compile": "tsc", + "precompile": "npm run eslint", + "pretest": "npm run compile", + "test": "nyc mocha --require ts-node/register --recursive 'test/unit/**/*.spec.ts' --reporter ./node_modules/spec-junit-splitter-mocha-reporter", + "eslint": "eslint src --ext .ts" + }, + "repository": { + "type": "git", + "url": "https://github.com/hyperledger/fabric-chaincode-node" + }, + "keywords": [ + "fabric-ledger", + "Hyperledger Fabric", + "Fabric Ledger" + ], + "engines": { + "node": "^12.16.1", + "npm": "^6.4.1" + }, + "license": "Apache-2.0", + "nyc": { + "exclude": [ + "coverage/**", + "test/**", + ".eslintrc.js" + ], + "extension": [ + ".ts" + ], + "reporter": [ + "text-summary", + "cobertura", + "html" + ], + "all": true, + "check-coverage": true, + "statements": 100, + "branches": 100, + "functions": 100, + "lines": 100 + }, + "dependencies": { + "fabric-contract-api": "2.2.4-unstable", + "winston": "^3.3.2" + }, + "devDependencies": { + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.2", + "@types/mocha": "^5.2.7", + "@rushstack/eslint-config": "^0.5.1", + "chai": "^4.1.2", + "chai-as-promised": "^7.1.1", + "cpx": "^1.5.0", + "eslint": "^6.6.0", + "mocha": "6.2.2", + "mockery": "^2.1.0", + "nyc": "14.1.1", + "rewire": "4.0.1", + "rimraf": "^3.0.0", + "sinon": "7.5.0", + "ts-node": "^8.3.0", + "ts-mockito": "^2.5.0", + "typescript": "3.4.5", + "spec-junit-splitter-mocha-reporter": "1.0.1" + } +} diff --git a/libraries/fabric-shim-crypto/README.md b/libraries/fabric-shim-crypto/README.md index f1121ac3..ad2e8b51 100644 --- a/libraries/fabric-shim-crypto/README.md +++ b/libraries/fabric-shim-crypto/README.md @@ -5,7 +5,7 @@ This `fabric-shim-crypto` library provides supporting encryption and decryption functions that might be useful for developers. -Detailed explanation on the concepts and programming model can be found here: [http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html](http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html). +Detailed explanation on the concepts and programming model can be found here: [https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html](https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html). ## License diff --git a/libraries/fabric-shim-crypto/package.json b/libraries/fabric-shim-crypto/package.json index 6f932ac5..64a6cdb8 100644 --- a/libraries/fabric-shim-crypto/package.json +++ b/libraries/fabric-shim-crypto/package.json @@ -1,7 +1,7 @@ { "name": "fabric-shim-crypto", - "version": "2.0.0-beta.1", - "tag": "beta", + "version": "2.2.4-unstable", + "tag": "unstable", "description": "A node.js implementation of encryption library for Hyperledger Fabric chaincode shim", "main": "index.js", "repository": { @@ -9,7 +9,7 @@ "url": "https://github.com/hyperledger/fabric-chaincode-node" }, "scripts": { - "test": "nyc mocha --recursive 'test/**/*.js' --reporter azure-mocha-reporter", + "test": "nyc mocha --recursive 'test/**/*.js' --reporter spec-junit-splitter-mocha-reporter 2>&1", "lint":"eslint ./lib/", "build": "npm run lint && npm test" }, @@ -20,13 +20,13 @@ "Fabric Shim" ], "engines": { - "node": "10.15.2", + "node": "^12.16.1", "npm": "^6.4.1" }, "license": "Apache-2.0", "dependencies": { - "elliptic": "^6.4.0", - "jsrsasign": "^8.0.4" + "elliptic": "^6.5.3", + "jsrsasign": "^10.2" }, "devDependencies": { "mocha": "6.2.2", @@ -38,7 +38,7 @@ "rewire": "4.0.1", "sinon": "7.5.0", "chai-things": "^0.2.0", - "azure-mocha-reporter": "1.0.0" + "spec-junit-splitter-mocha-reporter": "1.0.1" }, "nyc": { "exclude": [ diff --git a/libraries/fabric-shim-crypto/test/shim-crypto.js b/libraries/fabric-shim-crypto/test/shim-crypto.js index fa91ad31..76535d29 100644 --- a/libraries/fabric-shim-crypto/test/shim-crypto.js +++ b/libraries/fabric-shim-crypto/test/shim-crypto.js @@ -71,9 +71,9 @@ describe('enc-sign', () => { expect(sc.signKey).to.be.undefined; expect(sc._ecdsa).to.be.undefined; - expect(mockCreateCipher.calledOnce).to.be.ok; + expect(mockCreateCipher.calledOnce).to.be.true; expect(mockCreateCipher.firstCall.args).to.deep.equal([ALGORITHM, mapItems.encryptKey.value, mapItems.iv.value]); - expect(mockCreateDecipher.calledOnce).to.be.ok; + expect(mockCreateDecipher.calledOnce).to.be.true; expect(mockCreateDecipher.firstCall.args).to.deep.equal([ALGORITHM, mapItems.encryptKey.value, mapItems.iv.value]); }); @@ -90,11 +90,11 @@ describe('enc-sign', () => { expect(sc.signKey).to.be.undefined; expect(sc._ecdsa).to.be.undefined; - expect(mockRandomBytes.calledOnce).to.be.ok; + expect(mockRandomBytes.calledOnce).to.be.true; expect(mockRandomBytes.firstCall.args).to.deep.equal([16]); - expect(mockCreateCipher.calledOnce).to.be.ok; + expect(mockCreateCipher.calledOnce).to.be.true; expect(mockCreateCipher.firstCall.args).to.deep.equal([ALGORITHM, mapItems.encryptKey.value, 'some random bytes']); - expect(mockCreateDecipher.calledOnce).to.be.ok; + expect(mockCreateDecipher.calledOnce).to.be.true; expect(mockCreateDecipher.firstCall.args).to.deep.equal([ALGORITHM, mapItems.encryptKey.value, 'some random bytes']); }); @@ -108,9 +108,9 @@ describe('enc-sign', () => { expect(sc.signKey).to.deep.equal('some imported signKey'); expect(sc._ecdsa).to.deep.equal(ecStubInstance); - expect(mockImportKey.calledOnce).to.be.ok; + expect(mockImportKey.calledOnce).to.be.true; expect(mockImportKey.firstCall.args).to.deep.equal([mapItems.signKey.value]); - expect(mockEC.calledOnce).to.be.ok; + expect(mockEC.calledOnce).to.be.true; expect(mockEC.firstCall.args).to.deep.equal([elliptic.curves.p256]); clearSignKeyMocks(); @@ -136,9 +136,9 @@ describe('enc-sign', () => { const sc = newShimCrypto(['encryptKey']); expect(sc.encrypt('some message').toString('hex')).to.deep.equal('00000000001111111111'); - expect(updateStub.calledOnce).to.be.ok; + expect(updateStub.calledOnce).to.be.true; expect(updateStub.firstCall.args).to.deep.equal(['some message', null, 'hex']); - expect(finalStub.calledOnce).to.be.ok; + expect(finalStub.calledOnce).to.be.true; expect(finalStub.firstCall.args).to.deep.equal(['hex']); }); }); @@ -164,9 +164,9 @@ describe('enc-sign', () => { const sc = newShimCrypto(['encryptKey']); expect(sc.decrypt('00000000001111111111').toString('utf8')).to.deep.equal('some message'); - expect(updateStub.calledOnce).to.be.ok; + expect(updateStub.calledOnce).to.be.true; expect(updateStub.firstCall.args).to.deep.equal(['00000000001111111111', null, 'utf8']); - expect(finalStub.calledOnce).to.be.ok; + expect(finalStub.calledOnce).to.be.true; expect(finalStub.firstCall.args).to.deep.equal(['utf8']); }); @@ -242,13 +242,13 @@ describe('enc-sign', () => { const sc = newShimCrypto(['signKey']); expect(sc.sign('some message')).to.deep.equal('some DER'); - expect(ecStubInstance.keyFromPrivate.calledOnce).to.be.ok; + expect(ecStubInstance.keyFromPrivate.calledOnce).to.be.true; expect(ecStubInstance.keyFromPrivate.firstCall.args).to.deep.equal(['some prvKeyHex', 'hex']); - expect(hashStub.calledOnce).to.be.ok; + expect(hashStub.calledOnce).to.be.true; expect(hashStub.firstCall.args).to.deep.equal(['some message']); - expect(ecStubInstance.sign.calledOnce).to.be.ok; + expect(ecStubInstance.sign.calledOnce).to.be.true; expect(ecStubInstance.sign.firstCall.args).to.deep.equal(['some hash', 'some key from private']); - expect(_preventMalleabilityStub.calledOnce).to.be.ok; + expect(_preventMalleabilityStub.calledOnce).to.be.true; expect(_preventMalleabilityStub.firstCall.args).to.deep.equal(['some signed message', 'some params']); ShimCrypto.__set__('_preventMalleability', savePreventMalleability); @@ -340,9 +340,9 @@ describe('enc-sign', () => { const result = sc.verify('some sig', 'some message'); expect(result.ok).to.deep.equal(false); - expect(result.error instanceof Error).to.be.ok; + expect(result.error instanceof Error).to.be.true; expect(result.error.message).to.deep.equal('Invalid S value in signature. Must be smaller than half of the order.'); - expect(_checkMalleabilityStub.calledOnce).to.be.ok; + expect(_checkMalleabilityStub.calledOnce).to.be.true; expect(_checkMalleabilityStub.firstCall.args).to.deep.equal(['some sig', 'some params']); ShimCrypto.__set__('_checkMalleability', saveCheckMalleability); @@ -366,11 +366,11 @@ describe('enc-sign', () => { expect(result.ok).to.deep.equal(true); expect(result.error).to.deep.equal(null); - expect(_checkMalleabilityStub.calledOnce).to.be.ok; + expect(_checkMalleabilityStub.calledOnce).to.be.true; expect(_checkMalleabilityStub.firstCall.args).to.deep.equal(['some sig', 'some params']); - expect(ecStubInstance.keyFromPublic.calledOnce).to.be.ok; + expect(ecStubInstance.keyFromPublic.calledOnce).to.be.true; expect(ecStubInstance.keyFromPublic.firstCall.args).to.deep.equal(['some pubKeyHex', 'hex']); - expect(mockVerifyStub.calledOnce).to.be.ok; + expect(mockVerifyStub.calledOnce).to.be.true; expect(mockVerifyStub.firstCall.args).to.deep.equal(['some hash', 'some sig']); ShimCrypto.__set__('_checkMalleability', saveCheckMalleability); @@ -403,13 +403,13 @@ describe('enc-sign', () => { const result = sc.verify('some sig', 'some message'); expect(result.ok).to.deep.equal(false); - expect(result.error instanceof Error).to.be.ok; + expect(result.error instanceof Error).to.be.true; expect(result.error.message).to.deep.equal('Signature failed to verify'); - expect(_checkMalleabilityStub.calledOnce).to.be.ok; + expect(_checkMalleabilityStub.calledOnce).to.be.true; expect(_checkMalleabilityStub.firstCall.args).to.deep.equal(['some sig', 'some params']); - expect(ecStubInstance.keyFromPublic.calledOnce).to.be.ok; + expect(ecStubInstance.keyFromPublic.calledOnce).to.be.true; expect(ecStubInstance.keyFromPublic.firstCall.args).to.deep.equal(['some pubKeyHex', 'hex']); - expect(mockVerifyStub.calledOnce).to.be.ok; + expect(mockVerifyStub.calledOnce).to.be.true; expect(mockVerifyStub.firstCall.args).to.deep.equal(['some hash', 'some sig']); ShimCrypto.__set__('_checkMalleability', saveCheckMalleability); @@ -431,11 +431,11 @@ describe('enc-sign', () => { const result = ShimCrypto.__get__('hash')('some message'); expect(result).to.deep.equal('some digest'); - expect(createHashStub.calledOnce).to.be.ok; + expect(createHashStub.calledOnce).to.be.true; expect(createHashStub.firstCall.args).to.deep.equal(['sha256']); - expect(updateStub.calledOnce).to.be.ok; + expect(updateStub.calledOnce).to.be.true; expect(updateStub.firstCall.args).to.deep.equal(['some message']); - expect(digestStub.calledOnce).to.be.ok; + expect(digestStub.calledOnce).to.be.true; expect(digestStub.firstCall.args).to.deep.equal(['hex']); createHashStub.restore(); @@ -503,8 +503,8 @@ describe('enc-sign', () => { sinon.stub(KEYUTIL, 'getKey').returns(mockKey); - expect(importKey('some raw content') instanceof ECDSAKey).to.be.ok; - expect(mockECDSAKey.calledWithNew).to.be.ok; + expect(importKey('some raw content') instanceof ECDSAKey).to.be.true; + expect(mockECDSAKey.calledWithNew()).to.be.false; expect(mockECDSAKey.firstCall.args).to.deep.equal([mockKey]); ShimCrypto.__set__('ECDSAKey', ECDSAKey); @@ -580,7 +580,7 @@ i6dOfok= }); expect(result).to.deep.equal(sig); - expect(sig.s.cmp.calledOnce).to.be.ok; + expect(sig.s.cmp.calledOnce).to.be.true; expect(sig.s.cmp.firstCall.args).to.deep.equal([halfOrdersForCurve.secp256r1]); }); @@ -612,9 +612,9 @@ i6dOfok= const result = _preventMalleability(sig, curveParams); expect(result.s).to.deep.equal('some sub'); - expect(mockBN.calledWithNew).to.be.ok; + expect(mockBN.calledWithNew()).to.be.false; expect(mockBN.firstCall.args).to.deep.equal(['some string', 16]); - expect(curveParams.n.toString.calledOnce).to.be.ok; + expect(curveParams.n.toString.calledOnce).to.be.true; expect(curveParams.n.toString.firstCall.args).to.deep.equal([16]); ShimCrypto.__set__('BN', saveBN); @@ -690,7 +690,7 @@ i6dOfok= expect(_checkMalleability('some sig', { name: 'secp256r1' })).to.deep.equal(false); - expect(cmpStub.calledOnce).to.be.ok; + expect(cmpStub.calledOnce).to.be.true; expect(cmpStub.firstCall.args).to.deep.equal([halfOrdersForCurve.secp256r1]); ShimCrypto.__set__('Signature', saveSig); @@ -716,7 +716,7 @@ i6dOfok= expect(_checkMalleability('some sig', { name: 'secp256r1' })).to.deep.equal(true); - expect(cmpStub.calledOnce).to.be.ok; + expect(cmpStub.calledOnce).to.be.true; expect(cmpStub.firstCall.args).to.deep.equal([halfOrdersForCurve.secp256r1]); ShimCrypto.__set__('Signature', saveSig); diff --git a/libraries/fabric-shim/README.md b/libraries/fabric-shim/README.md index 15a690e7..df3e61c1 100644 --- a/libraries/fabric-shim/README.md +++ b/libraries/fabric-shim/README.md @@ -7,7 +7,7 @@ The `fabric-shim` provides the *chaincode interface*, a lower level API for implementing "Smart Contracts". To confirm that this is the same as the `fabric-shim` in previous versions of Hyperledger Fabric. -Detailed explanation on the concept and programming model can be found here: [http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html](http://hyperledger-fabric.readthedocs.io/en/latest/chaincode.html). +Detailed explanation on the concept and programming model can be found here: [https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html](https://hyperledger-fabric.readthedocs.io/en/release-2.1/smartcontract/smartcontract.html). ## Chaincode Interface @@ -18,7 +18,7 @@ npm install --save fabric-shim ``` ### Usage -The [chaincode interface](https://fabric-shim.github.io/ChaincodeInterface.html) contains two methods to be implemented: +The [chaincode interface](https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/fabric-shim.ChaincodeInterface.html) contains two methods to be implemented: ```javascript const shim = require('fabric-shim'); @@ -53,7 +53,7 @@ shim.start(new Chaincode()); ``` ### API Reference -Visit [fabric-shim.github.io](https://fabric-shim.github.io/) and click on "Classes" link in the navigation bar on the top to view the list of class APIs. +Visit [API Reference](https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/) and click on "Classes" link in the navigation bar on the top to view the list of class APIs. ## Support Tested with node.js 8.9.0 (LTS). diff --git a/libraries/fabric-shim/cli.js b/libraries/fabric-shim/cli.js index 235f5676..20a392be 100755 --- a/libraries/fabric-shim/cli.js +++ b/libraries/fabric-shim/cli.js @@ -5,6 +5,7 @@ const Logger = require('./lib/logger'); const logger = Logger.getLogger('fabric-shim/cli'); const results = require('yargs') + .parserConfiguration({'dot-notation':false}) .commandDir('./lib/cmds') .demandCommand() .help() @@ -17,7 +18,6 @@ const results = require('yargs') if (typeof(results.thePromise) !== 'undefined') { results.thePromise.then(() => { - logger.info('\nCommand succeeded\n'); }).catch((error) => { logger.info(error + '\nCommand failed\n'); process.exit(1); diff --git a/libraries/fabric-shim/lib/chaincode.js b/libraries/fabric-shim/lib/chaincode.js index 1fb726e5..2ae51b67 100644 --- a/libraries/fabric-shim/lib/chaincode.js +++ b/libraries/fabric-shim/lib/chaincode.js @@ -14,7 +14,8 @@ const Logger = require('./logger'); const utils = require('./utils/utils'); const logger = Logger.getLogger('lib/chaincode.js'); -const Handler = require('./handler'); +const {ChaincodeSupportClient} = require('./handler'); +const ChaincodeServer = require('./server'); const Iterators = require('./iterators'); const ChaincodeStub = require('./stub'); const KeyEndorsementPolicy = require('./utils/statebased'); @@ -122,7 +123,7 @@ class Shim { } const chaincodeName = opts['chaincode-id-name']; - const client = new Handler(chaincode, url, optsCpy); + const client = new ChaincodeSupportClient(chaincode, url, optsCpy); const chaincodeID = { name: chaincodeName }; @@ -194,6 +195,28 @@ class Shim { return Logger.getLogger(name); } + + /** + * @interface ChaincodeServerTLSProperties + * @property {Buffer} key Private key for TLS + * @property {Buffer} cert Certificate for TLS + * @property {Buffer} [clientCACerts] CA certificate for client certificates if mutual TLS is used. + */ + /** + * @interface ChaincodeServerOpts + * @property {string} ccid Chaincode ID + * @property {string} address Listen address for the server + * @property {ChaincodeServerTLSProperties} [tlsProps] TLS properties if TLS is required. + */ + /** + * Returns a new Chaincode server. Should be called when the chaincode is launched in a server mode. + * @static + * @param {ChaincodeInterface} chaincode User-provided object that must implement ChaincodeInterface + * @param {ChaincodeServerOpts} serverOpts Chaincode server options + */ + static server(chaincode, serverOpts) { + return new ChaincodeServer(chaincode, serverOpts); + } } // special OID used by Fabric to save attributes in X.509 certificates diff --git a/libraries/fabric-shim/lib/cmds/metadata/lib/generate.js b/libraries/fabric-shim/lib/cmds/metadata/lib/generate.js index f6fe975e..d1a7b134 100644 --- a/libraries/fabric-shim/lib/cmds/metadata/lib/generate.js +++ b/libraries/fabric-shim/lib/cmds/metadata/lib/generate.js @@ -32,7 +32,7 @@ class Generate { await fs.writeFile(filePath, JSON.stringify(chaincode.metadata, null, 4)); logger.info(`File containing metadata has been saved to ${filePath}`); } else { - logger.info('Metadata is : \n', JSON.stringify(chaincode.metadata, null, 4)); + logger.info(JSON.stringify(chaincode.metadata, null, 4)); } } } diff --git a/libraries/fabric-shim/lib/cmds/serverCommand.js b/libraries/fabric-shim/lib/cmds/serverCommand.js new file mode 100644 index 00000000..d23b72db --- /dev/null +++ b/libraries/fabric-shim/lib/cmds/serverCommand.js @@ -0,0 +1,106 @@ +/* +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ + +'use strict'; + +const fs = require('fs'); + +exports.command = 'server [options]'; +exports.desc = 'Start the chaincode as a server'; + +const validOptions = { + 'chaincode-address': {type: 'string', required: true}, + 'grpc.max_send_message_length': {type: 'number', default: -1}, + 'grpc.max_receive_message_length': {type: 'number', default: -1}, + 'grpc.keepalive_time_ms': {type: 'number', default: 110000}, + 'grpc.http2.min_time_between_pings_ms': {type: 'number', default: 110000}, + 'grpc.keepalive_timeout_ms': {type: 'number', default: 20000}, + 'grpc.http2.max_pings_without_data': {type: 'number', default: 0}, + 'grpc.keepalive_permit_without_calls': {type: 'number', default: 1}, + 'chaincode-id': {type: 'string', required: true}, + 'chaincode-tls-cert-file': {type: 'string', conflicts: 'chaincode-tls-cert-path'}, + 'chaincode-tls-cert-path': {type: 'string', conflicts: 'chaincode-tls-cert-file'}, + 'chaincode-tls-key-file': {type: 'string', conflicts: 'chaincode-tls-key-path'}, + 'chaincode-tls-key-path': {type: 'string', conflicts: 'chaincode-tls-key-file'}, + 'chaincode-tls-client-cacert-file': {type: 'string', conflicts: 'chaincode-tls-client-cacert-path'}, + 'chaincode-tls-client-cacert-path': {type: 'string', conflicts: 'chaincode-tls-client-cacert-file'}, + 'module-path': {type: 'string', default: process.cwd()} +}; + +exports.validOptions = validOptions; + +exports.builder = function (yargs) { + yargs.options(validOptions); + + yargs.usage('fabric-chaincode-node server --chaincode-address 0.0.0.0:9999 --chaincode-id mycc_v0:abcdef12345678...'); + + yargs.check((argv) => { + if (argv['chaincode-tls-key-file'] || argv['chaincode-tls-key-path'] || + argv['chaincode-tls-cert-file'] || argv['chaincode-tls-cert-path']) { + // TLS should be enabled + if (!argv['chaincode-tls-key-file'] && !argv['chaincode-tls-key-path']) { + throw new Error('A TLS option is set but no key is specified'); + } + if (!argv['chaincode-tls-cert-file'] && !argv['chaincode-tls-cert-path']) { + throw new Error('A TLS option is set but no cert is specified'); + } + } + return true; + }); + + return yargs; +}; + +exports.handler = function (argv) { + const Bootstrap = require('../contract-spi/bootstrap'); + + return argv.thePromise = Bootstrap.bootstrap(true); +}; + +exports.getArgs = function (yargs) { + const argv = {}; + + for (const name in validOptions) { + argv[name] = yargs.argv[name]; + } + + // Load the cryptographic files if TLS is enabled + if (argv['chaincode-tls-key-file'] || argv['chaincode-tls-key-path'] || + argv['chaincode-tls-cert-file'] || argv['chaincode-tls-cert-path']) { + + const tlsProps = {}; + + if (argv['chaincode-tls-key-file']) { + tlsProps.key = fs.readFileSync(argv['chaincode-tls-key-file']); + } else { + tlsProps.key = Buffer.from(fs.readFileSync(argv['chaincode-tls-key-path']).toString(), 'base64'); + } + + if (argv['chaincode-tls-cert-file']) { + tlsProps.cert = fs.readFileSync(argv['chaincode-tls-cert-file']); + } else { + tlsProps.cert = Buffer.from(fs.readFileSync(argv['chaincode-tls-cert-path']).toString(), 'base64'); + } + + // If cacert option is specified, enable client certificate validation + if (argv['chaincode-tls-client-cacert-file']) { + tlsProps.clientCACerts = fs.readFileSync(argv['chaincode-tls-client-cacert-file']); + } else if (argv['chaincode-tls-client-cacert-path']) { + tlsProps.clientCACerts = Buffer.from(fs.readFileSync(argv['chaincode-tls-client-cacert-path']).toString(), 'base64'); + } + + argv.tlsProps = tlsProps; + } + + // Translate the options to server options + argv.ccid = argv['chaincode-id']; + argv.address = argv['chaincode-address']; + + delete argv['chaincode-id']; + delete argv['chaincode-address']; + + return argv; +}; diff --git a/libraries/fabric-shim/lib/cmds/startCommand.js b/libraries/fabric-shim/lib/cmds/startCommand.js index ddb445b6..b168a953 100644 --- a/libraries/fabric-shim/lib/cmds/startCommand.js +++ b/libraries/fabric-shim/lib/cmds/startCommand.js @@ -76,8 +76,13 @@ exports.getArgs = function (yargs) { argv['chaincode-id-name'] = argv.chaincodeIdName; argv['module-path'] = argv.modulePath; + // eslint-disable-next-line eqeqeq + if (argv.CORE_PEER_ADDRESS != null) { + argv['peer.address'] = argv.CORE_PEER_ADDRESS; + } + required.forEach((argName) => { - if (!argv.hasOwnProperty(argName)) { // eslint-disable-line no-prototype-builtins + if (!argv.hasOwnProperty(argName) || typeof(argv[argName]) === 'undefined') { // eslint-disable-line no-prototype-builtins throw new Error('Missing required argument ' + argName); } }); diff --git a/libraries/fabric-shim/lib/contract-spi/bootstrap.js b/libraries/fabric-shim/lib/contract-spi/bootstrap.js index f682018e..99beb6ad 100644 --- a/libraries/fabric-shim/lib/contract-spi/bootstrap.js +++ b/libraries/fabric-shim/lib/contract-spi/bootstrap.js @@ -14,6 +14,7 @@ const shim = require('../chaincode'); const ChaincodeFromContract = require('./chaincodefromcontract'); const Logger = require('../logger'); const StartCommand = require('../cmds/startCommand.js'); +const ServerCommand = require('../cmds/serverCommand.js'); const logger = Logger.getLogger('contracts-spi/bootstrap.js'); @@ -28,25 +29,31 @@ class Bootstrap { * @ignore * @param {Contract} contracts contract to register to use */ - static register(contracts, serializers, fileMetadata, title, version) { + static register(contracts, serializers, fileMetadata, title, version, opts, serverMode = false) { // load up the meta data that the user may have specified // this will need to passed in and rationalized with the // code as implemented const chaincode = new ChaincodeFromContract(contracts, serializers, fileMetadata, title, version); - // say hello to the peer - shim.start(chaincode); + if (serverMode) { + const server = shim.server(chaincode, opts); + server.start(); + } else { + // say hello to the peer + shim.start(chaincode); + } } /** * * @ignore + * @param {boolean} serverMode set true if the chaincode should be started as a server */ - static async bootstrap() { - const opts = StartCommand.getArgs(yargs); + static async bootstrap(serverMode = false) { + const opts = serverMode ? ServerCommand.getArgs(yargs) : StartCommand.getArgs(yargs); const {contracts, serializers, title, version} = this.getInfoFromContract(opts['module-path']); const fileMetadata = await Bootstrap.getMetadata(opts['module-path']); - Bootstrap.register(contracts, serializers, fileMetadata, title, version); + Bootstrap.register(contracts, serializers, fileMetadata, title, version, opts, serverMode); } static getInfoFromContract(modulePath) { @@ -101,12 +108,16 @@ class Bootstrap { static async getMetadata(modulePath) { let metadata = {}; const modPath = path.resolve(process.cwd(), modulePath); - const metadataPath = path.resolve(modPath, 'contract-metadata', 'metadata.json'); - const pathCheck = await fs.pathExists(metadataPath); + let metadataPath = path.resolve(modPath, 'META-INF', 'metadata.json'); + let pathCheck = await fs.pathExists(metadataPath); + + if (!pathCheck) { + metadataPath = path.resolve(modPath, 'contract-metadata', 'metadata.json'); + pathCheck = await fs.pathExists(metadataPath); + } if (pathCheck) { metadata = Bootstrap.loadAndValidateMetadata(metadataPath); - logger.info('Metadata file has been located'); logger.debug('Loaded metadata', metadata); } else { logger.info('No metadata file supplied in contract, introspection will generate all the data'); @@ -114,6 +125,7 @@ class Bootstrap { return metadata; } + static noop() {} static loadAndValidateMetadata(metadataPath) { const rootPath = path.dirname(__dirname); @@ -122,13 +134,12 @@ class Bootstrap { const metadata = JSON.parse(metadataString); - const ajv = new Ajv({schemaId: 'id'}); + const onlyErrors = {log: Bootstrap.noop, warn: Bootstrap.noop, error: console.error}; // eslint-disable-line no-console + const ajv = new Ajv({schemaId: 'id', logger: onlyErrors}); ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')); const valid = ajv.validate(JSON.parse(schemaString), metadata); if (!valid) { throw new Error('Contract metadata does not match the schema: ' + JSON.stringify(ajv.errors)); - } else { - logger.info('Metadata validated against schema correctly'); } return metadata; } diff --git a/libraries/fabric-shim/lib/contract-spi/chaincodefromcontract.js b/libraries/fabric-shim/lib/contract-spi/chaincodefromcontract.js index 788b669f..04c09121 100644 --- a/libraries/fabric-shim/lib/contract-spi/chaincodefromcontract.js +++ b/libraries/fabric-shim/lib/contract-spi/chaincodefromcontract.js @@ -13,6 +13,7 @@ const logger = Logger.getLogger('contracts-spi/chaincodefromcontract.js'); const DataMarshall = require('./datamarshall.js'); const ClientIdentity = require('../chaincode').ClientIdentity; const Ajv = require('ajv'); +const Contract = require('fabric-contract-api').Contract; require('reflect-metadata'); @@ -153,7 +154,6 @@ class ChaincodeFromContract { logger.debug('Supplied contract classes', contractClasses); this.defaultContractName = Reflect.getMetadata('fabric:default', global); - const Contract = require('fabric-contract-api').Contract; const implementations = {}; @@ -183,13 +183,12 @@ class ChaincodeFromContract { _augmentMetadataFromCode(metadata) { if (!metadata.$schema) { - metadata.$schema = 'https://fabric-shim.github.io/master/contract-schema.json'; + metadata.$schema = 'https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json'; } if (!metadata.contracts || Object.keys(metadata.contracts).length === 0) { logger.debug('_augmentMetadataFromCode - Contracts not supplied. Generating default'); - const Contract = require('fabric-contract-api').Contract; const skipNames = Object.getOwnPropertyNames(Contract.prototype); metadata.contracts = JSON.parse(JSON.stringify(this.contractImplementations)); @@ -253,7 +252,7 @@ class ChaincodeFromContract { }; if (contract.getName() !== 'org.hyperledger.fabric') { - transaction.tags = ['submitTx']; + transaction.tags = ['SUBMIT', 'submitTx']; } // add 'argN' parameters, skipping the first (stub) parameter diff --git a/libraries/fabric-shim/lib/handler.js b/libraries/fabric-shim/lib/handler.js index 98ed6733..f61be718 100644 --- a/libraries/fabric-shim/lib/handler.js +++ b/libraries/fabric-shim/lib/handler.js @@ -9,7 +9,7 @@ process.env.GRPC_SSL_CIPHER_SUITES = 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384'; const protoLoader = require('@grpc/proto-loader'); -const grpc = require('grpc'); +const grpc = require('@grpc/grpc-js'); const fabprotos = require('../bundle'); const path = require('path'); const {URL} = require('url'); @@ -205,7 +205,7 @@ class MsgQueueHandler { /* - * The ChaincodeSupportClient class represents a the base class for all remote nodes, Peer, Orderer , and MemberServicespeer. + * The ChaincodeSupportClient class represents a chaincode gRPC client to the peer. */ class ChaincodeSupportClient { @@ -269,11 +269,37 @@ class ChaincodeSupportClient { this._stream.end(); } + chat(convStarterMsg) { + this._stream = this._client.register(); + + this._handler = new ChaincodeMessageHandler(this._stream, this.chaincode); + this._handler.chat(convStarterMsg); + } + + /* + return a printable representation of this object + */ + toString() { + return 'ChaincodeSupportClient : {' + + 'url:' + + this._url + + '}'; + } +} + +/** + * The ChaincodeMessageHandler class handles messages between peer and chaincode both in the chaincode server and client model. + */ +class ChaincodeMessageHandler { + constructor (stream, chaincode) { + this._stream = stream; + this.chaincode = chaincode; + } + // this is a long-running method that does not return until // the conversation b/w the chaincode program and the target // peer has been completed chat(convStarterMsg) { - this._stream = this._client.register(); this.msgQueueHandler = new MsgQueueHandler(this); const stream = this._stream; @@ -284,7 +310,7 @@ class ChaincodeSupportClient { let state = 'created'; stream.on('data', function (msg) { - logger.debug('Received chat message from peer: %j, state: %s', msg, state); + logger.debug('Received chat message from peer: %s, state: %s', msg.txid, state); if (state === STATES.Ready) { const type = msg.type; @@ -528,15 +554,11 @@ class ChaincodeSupportClient { }); } - /* - * return a printable representation of this object - */ + return a printable representation of this object + */ toString() { - return 'ChaincodeSupportClient : {' + - 'url:' + - this._url + - '}'; + return 'ChaincodeMessageHandler : {}'; } } @@ -723,7 +745,10 @@ function parseResponse(handler, res, method) { } } -module.exports = ChaincodeSupportClient; +module.exports = { + ChaincodeSupportClient, + ChaincodeMessageHandler +}; // // The Endpoint class represents a remote grpc or grpcs target diff --git a/libraries/fabric-shim/lib/iterators.js b/libraries/fabric-shim/lib/iterators.js index 6e67c613..64ca53cc 100644 --- a/libraries/fabric-shim/lib/iterators.js +++ b/libraries/fabric-shim/lib/iterators.js @@ -20,6 +20,10 @@ class CommonIterator { /** * constructor + * + * Note that the decoded payload will be a protobuf of type + * fabprotos.protos.QueryResponse + * * @param {ChaincodeSupportClient} handler client handler * @param {string} channel_id channel id * @param {string} txID transaction id @@ -66,9 +70,8 @@ class CommonIterator { const queryResult = {}; queryResult.value = this._getResultFromBytes(this.response.results[this.currentLoc]); this.currentLoc++; - // TODO: potential breaking change if it's assumed that if done == true then it has a valid value + queryResult.done = false; - // queryResult.done = !(this.currentLoc < this.response.results.length || this.response.has_more); return queryResult; } @@ -85,7 +88,7 @@ class CommonIterator { return this._createAndEmitResult(); } else { // check to see if there is more and go fetch it - if (this.response.has_more) { + if (this.response.hasMore) { try { const response = await this.handler.handleQueryStateNext(this.response.id, this.channel_id, this.txID); this.currentLoc = 0; diff --git a/libraries/fabric-shim/lib/server.js b/libraries/fabric-shim/lib/server.js new file mode 100644 index 00000000..40c9dda0 --- /dev/null +++ b/libraries/fabric-shim/lib/server.js @@ -0,0 +1,128 @@ +/* +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ + +'use strict'; + +const protoLoader = require('@grpc/proto-loader'); +const grpc = require('@grpc/grpc-js'); +const path = require('path'); + +const fabprotos = require('../bundle'); +const {ChaincodeMessageHandler} = require('./handler'); +const logger = require('./logger').getLogger('lib/server.js'); + +const PROTO_PATH = path.resolve(__dirname, '..', 'protos', 'peer', 'chaincode_shim.proto'); +const packageDefinition = protoLoader.loadSync( + PROTO_PATH, + { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, + includeDirs: [ + path.resolve(__dirname, '..', 'google-protos'), + path.resolve(__dirname, '..', 'protos') + ] + } +); +const protoDescriptor = grpc.loadPackageDefinition(packageDefinition); + +/** + * The ChaincodeServer class represents a chaincode gRPC server, which waits for connections from peers. + */ +class ChaincodeServer { + constructor(chaincode, serverOpts) { + // Validate arguments + if (typeof chaincode !== 'object' || chaincode === null) { + throw new Error('Missing required argument: chaincode'); + } + if (typeof serverOpts !== 'object' || serverOpts === null) { + throw new Error('Missing required argument: serverOpts'); + } + if (typeof chaincode.Init !== 'function' || typeof chaincode.Invoke !== 'function') { + throw new Error('The "chaincode" argument must implement Init() and Invoke() methods'); + } + if (typeof serverOpts.ccid !== 'string') { + throw new Error('Missing required property in serverOpts: ccid'); + } + if (typeof serverOpts.address !== 'string') { + throw new Error('Missing required property in serverOpts: address'); + } + if (typeof serverOpts.tlsProps === 'object' && serverOpts.tlsProps !== null) { + if (typeof serverOpts.tlsProps.key !== 'object' || serverOpts.tlsProps.key === null) { + throw new Error('Missing required property in serverOpts.tlsProps: key'); + } + if (typeof serverOpts.tlsProps.cert !== 'object' || serverOpts.tlsProps.cert === null) { + throw new Error('Missing required property in serverOpts.tlsProps: cert'); + } + + let clientCACerts; + if (typeof serverOpts.tlsProps.clientCACerts === 'object' && serverOpts.tlsProps.clientCACerts !== null) { + clientCACerts = serverOpts.tlsProps.clientCACerts; + } else { + clientCACerts = null; + } + + this._credentials = grpc.ServerCredentials.createSsl(clientCACerts, [ + { + private_key: serverOpts.tlsProps.key, + cert_chain: serverOpts.tlsProps.cert + } + ], clientCACerts === null ? false : true); + } else { + this._credentials = grpc.ServerCredentials.createInsecure(); + } + + // Create GRPC Server and register RPC handler + this._server = new grpc.Server(); + this._server.addService(protoDescriptor.protos.Chaincode.service, this); + + this._serverOpts = serverOpts; + this._chaincode = chaincode; + } + + start() { + return new Promise((resolve, reject) => { + logger.debug('ChaincodeServer trying to bind to ' + this._serverOpts.address); + + this._server.bindAsync(this._serverOpts.address, this._credentials, (error, port) => { + if (!error) { + logger.debug('ChaincodeServer successfully bound to ' + port); + + this._server.start(); + logger.debug('ChaincodeServer started.'); + + resolve(); + } else { + logger.error('ChaincodeServer failed to bind to ' + this._serverOpts.address); + reject(error); + } + }); + }); + } + + connect(stream) { + logger.debug('ChaincodeServer.connect called.'); + + try { + const client = new ChaincodeMessageHandler(stream, this._chaincode); + const chaincodeID = { + name: this._serverOpts.ccid + }; + + logger.debug('Start chatting with a peer through a new stream. Chaincode ID = ' + this._serverOpts.ccid); + client.chat({ + type: fabprotos.protos.ChaincodeMessage.Type.REGISTER, + payload: fabprotos.protos.ChaincodeID.encode(chaincodeID).finish() + }); + } catch (e) { + logger.warn('connection from peer failed: ' + e); + } + } +} + +module.exports = ChaincodeServer; diff --git a/libraries/fabric-shim/lib/stub.js b/libraries/fabric-shim/lib/stub.js index 3d673eba..38e509a7 100644 --- a/libraries/fabric-shim/lib/stub.js +++ b/libraries/fabric-shim/lib/stub.js @@ -296,6 +296,18 @@ class ChaincodeStub { return this.creator; } + /** + * Returns the MSPID of the peer that started this chaincode + * @returns {string} MSPID + */ + getMspID() { + if ('CORE_PEER_LOCALMSPID' in process.env) { + return process.env.CORE_PEER_LOCALMSPID; + } else { + throw new Error('CORE_PEER_LOCALMSPID is unset in chaincode process'); + } + } + /** * Returns the transient map that can be used by the chaincode but not * saved in the ledger, such as cryptographic information for encryption and decryption @@ -391,11 +403,22 @@ class ChaincodeStub { * Returns the timestamp when the transaction was created. This * is taken from the transaction {@link ChannelHeader}, therefore it will indicate the * client's timestamp, and will have the same value across all endorsers. + * Object returned: { seconds: [Long] { low: [int32], high: [int32], unsigned: [bool] }, nanos: [int32] } */ getTxTimestamp() { return this.txTimestamp; } + /** + * Returns the Date object of when the transaction was created. This + * is taken from the transaction {@link ChannelHeader}, therefore it will indicate the + * client's date, and will have the same value across all endorsers. + */ + getDateTimestamp() { + const date = new Date(this.txTimestamp.seconds * 1e3 + this.txTimestamp.nanos / 1e6); + return date; + } + /** * Returns a HEX-encoded string of SHA256 hash of the transaction's nonce, creator and epoch concatenated, as a * unique representation of the specific transaction. This value can be used to prevent replay attacks in chaincodes diff --git a/libraries/fabric-shim/lib/utils/statebased.js b/libraries/fabric-shim/lib/utils/statebased.js index 0c0a96d1..adfd5ee1 100644 --- a/libraries/fabric-shim/lib/utils/statebased.js +++ b/libraries/fabric-shim/lib/utils/statebased.js @@ -15,7 +15,7 @@ const ROLE_TYPE_PEER = 'PEER'; * into validation parameter byte arrays, the shim provides convenience functions * that allow the chaincode developer to deal with endorsement policies in terms * of the MSP identifiers of organizations. - * For more informations, please read the [documents]{@link https://hyperledger-fabric.readthedocs.io/en/latest/endorsement-policies.html#setting-key-level-endorsement-policies} + * For more informations, please read the [documents]{@link https://hyperledger-fabric.readthedocs.io/en/release-2.1/endorsement-policies.html#setting-key-level-endorsement-policies} * * @class */ diff --git a/libraries/fabric-shim/package.json b/libraries/fabric-shim/package.json index 4ff6cc4f..c69b52c0 100644 --- a/libraries/fabric-shim/package.json +++ b/libraries/fabric-shim/package.json @@ -1,7 +1,7 @@ { "name": "fabric-shim", - "version": "2.0.0-beta.1", - "tag": "beta", + "version": "2.2.4-unstable", + "tag": "unstable", "description": "A node.js implementation of Hyperledger Fabric chaincode shim, to allow endorsing peers and user-provided chaincodes to communicate with each other", "main": "index.js", "bin": { @@ -10,7 +10,7 @@ "scripts": { "start": "./startup.sh", "compile": "tsc --project test/typescript", - "test": "nyc mocha --recursive 'test/unit/**/*.js' --reporter azure-mocha-reporter", + "test": "nyc mocha --recursive 'test/unit/**/*.js' --reporter spec-junit-splitter-mocha-reporter", "update:clean": "rimraf bundle.js bundle.d.ts protos && mkdirp protos", "update:copy": "cpx \"${GOPATH}/src/github.com/hyperledger/fabric-protos/**/*.proto\" protos --verbose", "update:pbjs": "pbjs -t static-module -p google-protos -p protos $(find google-protos protos -name \"*.proto\" -type f) -o bundle.js", @@ -29,12 +29,9 @@ "Fabric Shim" ], "engines": { - "node": "10.15.2", + "node": "^12.16.1", "npm": "^6.4.1" }, - "yargs": { - "dot-notation": false - }, "types": "./types/index.d.ts", "license": "Apache-2.0", "nyc": { @@ -58,17 +55,17 @@ }, "dependencies": { "@fidm/x509": "^1.2.1", - "@grpc/proto-loader": "^0.5.1", - "@types/node": "^8.9.4", - "ajv": "^6.5.5", - "fabric-contract-api": "2.0.0-beta.1", - "fabric-shim-api": "2.0.0-beta.1", - "fs-extra": "8.1.0", - "grpc": "^1.23.3", - "reflect-metadata": "^0.1.12", - "winston": "^3.2.1", - "yargs": "^13.3.0 ", - "yargs-parser": "^13.1.1" + "@grpc/grpc-js": "^1.1.1", + "@grpc/proto-loader": "^0.5.4", + "@types/node": "^14.0.13", + "ajv": "^6.12.2", + "fabric-contract-api": "2.2.4-unstable", + "fabric-shim-api": "2.2.4-unstable", + "fs-extra": "^9.0.1", + "reflect-metadata": "^0.1.13", + "winston": "^3.3.2", + "yargs": "^15.3.1", + "yargs-parser": "^18.1.3" }, "devDependencies": { "chai": "^4.1.1", @@ -76,12 +73,12 @@ "chai-things": "^0.2.0", "cpx": "^1.5.0", "eslint": "6.6.0", - "mocha": "6.2.2", + "mocha": "9.1.2", "mockery": "^2.1.0", - "nyc": "14.1.1", - "rewire": "4.0.1", + "nyc": "15.1.0", + "rewire": "5.0.0", "rimraf": "^3.0.0", - "sinon": "7.5.0", - "azure-mocha-reporter": "1.0.0" + "sinon": "11.1.2", + "spec-junit-splitter-mocha-reporter": "1.0.1" } } diff --git a/libraries/fabric-shim/protos/common/collection.proto b/libraries/fabric-shim/protos/common/collection.proto index 77283d56..a09e815f 100644 --- a/libraries/fabric-shim/protos/common/collection.proto +++ b/libraries/fabric-shim/protos/common/collection.proto @@ -15,6 +15,7 @@ import "common/policies.proto"; // messages; the extra struct is required because repeated oneof is // forbidden by the protobuf syntax message CollectionConfigPackage { + option deprecated = true; repeated CollectionConfig config = 1; } @@ -22,6 +23,7 @@ message CollectionConfigPackage { // it currently contains a single, static type. // Dynamic collections are deferred. message CollectionConfig { + option deprecated = true; oneof payload { StaticCollectionConfig static_collection_config = 1; } @@ -33,6 +35,7 @@ message CollectionConfig { // known at chaincode instantiation time, and that cannot be changed. // Dynamic collections are deferred. message StaticCollectionConfig { + option deprecated = true; // the name of the collection inside the denoted chaincode string name = 1; // a reference to a policy residing / managed in the config block @@ -59,6 +62,9 @@ message StaticCollectionConfig { // write the data (if set to false, for example if you want to implement more granular // access logic in the chaincode) bool member_only_write = 7; + // a reference to a policy residing / managed in the config block + // to define the endorsement policy for this collection + ApplicationPolicy endorsement_policy= 8; } @@ -67,6 +73,7 @@ message StaticCollectionConfig { // more general Policy. Instead of containing the actual policy, the // configuration may in the future contain a string reference to a policy. message CollectionPolicyConfig { + option deprecated = true; oneof payload { // Initially, only a signature policy is supported. SignaturePolicyEnvelope signature_policy = 1; @@ -76,13 +83,3 @@ message CollectionPolicyConfig { // string reference = 2; } } - - -// CollectionCriteria defines an element of a private data that corresponds -// to a certain transaction and collection -message CollectionCriteria { - string channel = 1; - string tx_id = 2; - string collection = 3; - string namespace = 4; -} diff --git a/libraries/fabric-shim/protos/common/common.proto b/libraries/fabric-shim/protos/common/common.proto index ca18f4a6..24cbe1a3 100644 --- a/libraries/fabric-shim/protos/common/common.proto +++ b/libraries/fabric-shim/protos/common/common.proto @@ -40,13 +40,13 @@ enum HeaderType { // This enum enlists indexes of the block metadata array enum BlockMetadataIndex { - SIGNATURES = 0; // Block metadata array position for block signatures - LAST_CONFIG = 1; // Block metadata array position to store last configuration block sequence number - TRANSACTIONS_FILTER = 2; // Block metadata array position to store serialized bit array filter of invalid transactions - ORDERER = 3 [deprecated=true]; /* Block metadata array position to store operational metadata for orderers - e.g. For Kafka, this is where we store the last offset written to the local ledger */ - COMMIT_HASH = 4; /* Block metadata array position to store the hash of TRANSACTIONS_FILTER, State Updates, - and the COMMIT_HASH of the previous block */ + SIGNATURES = 0; // Block metadata array position for block signatures + LAST_CONFIG = 1 [deprecated=true]; // Block metadata array position to store last configuration block sequence number + TRANSACTIONS_FILTER = 2; // Block metadata array position to store serialized bit array filter of invalid transactions + ORDERER = 3 [deprecated=true]; /* Block metadata array position to store operational metadata for orderers + e.g. For Kafka, this is where we store the last offset written to the local ledger */ + COMMIT_HASH = 4; /* Block metadata array position to store the hash of TRANSACTIONS_FILTER, State Updates, + and the COMMIT_HASH of the previous block */ } // LastConfig is the encoded value for the Metadata message which is encoded in the LAST_CONFIGURATION block metadata index diff --git a/libraries/fabric-shim/protos/common/configtx.proto b/libraries/fabric-shim/protos/common/configtx.proto index 188848e6..f60e1548 100644 --- a/libraries/fabric-shim/protos/common/configtx.proto +++ b/libraries/fabric-shim/protos/common/configtx.proto @@ -39,16 +39,6 @@ message ConfigEnvelope { // Note that CONFIG_UPDATE has a Payload.Data of a Marshaled ConfigUpdate } -message ConfigGroupSchema { - map groups = 1; - map values = 2; - map policies = 3; -} - -message ConfigValueSchema {} - -message ConfigPolicySchema {} - // Config represents the config for a particular channel message Config { // Prevent removed tag re-use diff --git a/libraries/fabric-shim/protos/common/policies.proto b/libraries/fabric-shim/protos/common/policies.proto index 8ac81d09..9afaa10a 100644 --- a/libraries/fabric-shim/protos/common/policies.proto +++ b/libraries/fabric-shim/protos/common/policies.proto @@ -65,3 +65,20 @@ message ImplicitMetaPolicy { string sub_policy = 1; Rule rule = 2; } + +// ApplicationPolicy captures the diffenrent policy types that +// are set and evaluted at the application level. +message ApplicationPolicy { + option deprecated = true; + oneof Type { + // SignaturePolicy type is used if the policy is specified as + // a combination (using threshold gates) of signatures from MSP + // principals + SignaturePolicyEnvelope signature_policy = 1; + + // ChannelConfigPolicyReference is used when the policy is + // specified as a string that references a policy defined in + // the configuration of the channel + string channel_config_policy_reference = 2; + } +} diff --git a/libraries/fabric-shim/protos/discovery/protocol.proto b/libraries/fabric-shim/protos/discovery/protocol.proto index d2b29bdc..dec159a1 100644 --- a/libraries/fabric-shim/protos/discovery/protocol.proto +++ b/libraries/fabric-shim/protos/discovery/protocol.proto @@ -156,6 +156,8 @@ message ChaincodeInterest { message ChaincodeCall { string name = 1; repeated string collection_names = 2; + bool no_private_reads = 3; // Indicates we do not need to read from private data + bool no_public_writes = 4; // Indicates we do not need to write to the chaincode namespace } // ChaincodeQueryResult contains EndorsementDescriptors for diff --git a/libraries/fabric-shim/protos/gossip/message.proto b/libraries/fabric-shim/protos/gossip/message.proto index f567db5c..bd2560fa 100644 --- a/libraries/fabric-shim/protos/gossip/message.proto +++ b/libraries/fabric-shim/protos/gossip/message.proto @@ -9,7 +9,7 @@ option java_package = "org.hyperledger.fabric.protos.gossip"; package gossip; -import "common/collection.proto"; +import "peer/collection.proto"; // Gossip service Gossip { @@ -175,6 +175,7 @@ message ConnEstablish { bytes pki_id = 1; bytes identity = 2; bytes tls_cert_hash = 3; + bool probe = 4; } // PeerIdentity defines the identity of the peer @@ -257,7 +258,7 @@ message PrivatePayload { string tx_id = 3; bytes private_rwset = 4; uint64 private_sim_height = 5; - common.CollectionConfigPackage collection_configs = 6; + protos.CollectionConfigPackage collection_configs = 6; } // Membership messages diff --git a/libraries/fabric-shim/protos/peer/chaincode_shim.proto b/libraries/fabric-shim/protos/peer/chaincode_shim.proto index 48afbdb3..4b0ccca0 100644 --- a/libraries/fabric-shim/protos/peer/chaincode_shim.proto +++ b/libraries/fabric-shim/protos/peer/chaincode_shim.proto @@ -177,3 +177,9 @@ message StateMetadataResult { service ChaincodeSupport { rpc Register(stream ChaincodeMessage) returns (stream ChaincodeMessage); } + +// Chaincode as a server - peer establishes a connection to the chaincode as a client +// Currently only supports a stream connection. +service Chaincode { + rpc Connect(stream ChaincodeMessage) returns (stream ChaincodeMessage); +} diff --git a/libraries/fabric-shim/protos/peer/collection.proto b/libraries/fabric-shim/protos/peer/collection.proto new file mode 100644 index 00000000..dad26d81 --- /dev/null +++ b/libraries/fabric-shim/protos/peer/collection.proto @@ -0,0 +1,82 @@ +// Copyright the Hyperledger Fabric contributors. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + +syntax = "proto3"; + +option go_package = "github.com/hyperledger/fabric-protos-go/peer"; +option java_package = "org.hyperledger.fabric.protos.peer"; + +package protos; + +import "common/policies.proto"; +import "peer/policy.proto"; + +// CollectionConfigPackage represents an array of CollectionConfig +// messages; the extra struct is required because repeated oneof is +// forbidden by the protobuf syntax +message CollectionConfigPackage { + repeated CollectionConfig config = 1; +} + +// CollectionConfig defines the configuration of a collection object; +// it currently contains a single, static type. +// Dynamic collections are deferred. +message CollectionConfig { + oneof payload { + StaticCollectionConfig static_collection_config = 1; + } +} + + +// StaticCollectionConfig constitutes the configuration parameters of a +// static collection object. Static collections are collections that are +// known at chaincode instantiation time, and that cannot be changed. +// Dynamic collections are deferred. +message StaticCollectionConfig { + // the name of the collection inside the denoted chaincode + string name = 1; + // a reference to a policy residing / managed in the config block + // to define which orgs have access to this collection’s private data + CollectionPolicyConfig member_orgs_policy = 2; + // The minimum number of peers private data will be sent to upon + // endorsement. The endorsement would fail if dissemination to at least + // this number of peers is not achieved. + int32 required_peer_count = 3; + // The maximum number of peers that private data will be sent to + // upon endorsement. This number has to be bigger than required_peer_count. + int32 maximum_peer_count = 4; + // The number of blocks after which the collection data expires. + // For instance if the value is set to 10, a key last modified by block number 100 + // will be purged at block number 111. A zero value is treated same as MaxUint64 + uint64 block_to_live = 5; + // The member only read access denotes whether only collection member clients + // can read the private data (if set to true), or even non members can + // read the data (if set to false, for example if you want to implement more granular + // access logic in the chaincode) + bool member_only_read = 6; + // The member only write access denotes whether only collection member clients + // can write the private data (if set to true), or even non members can + // write the data (if set to false, for example if you want to implement more granular + // access logic in the chaincode) + bool member_only_write = 7; + // a reference to a policy residing / managed in the config block + // to define the endorsement policy for this collection + ApplicationPolicy endorsement_policy= 8; +} + + +// Collection policy configuration. Initially, the configuration can only +// contain a SignaturePolicy. In the future, the SignaturePolicy may be a +// more general Policy. Instead of containing the actual policy, the +// configuration may in the future contain a string reference to a policy. +message CollectionPolicyConfig { + oneof payload { + // Initially, only a signature policy is supported. + common.SignaturePolicyEnvelope signature_policy = 1; + // Later, the SignaturePolicy will be replaced by a Policy. + // Policy policy = 1; + // A reference to a Policy is planned to be added later. +// string reference = 2; + } +} diff --git a/libraries/fabric-shim/protos/peer/lifecycle/lifecycle.proto b/libraries/fabric-shim/protos/peer/lifecycle/lifecycle.proto index 4e48e687..f1889be7 100644 --- a/libraries/fabric-shim/protos/peer/lifecycle/lifecycle.proto +++ b/libraries/fabric-shim/protos/peer/lifecycle/lifecycle.proto @@ -9,7 +9,7 @@ option go_package = "github.com/hyperledger/fabric-protos-go/peer/lifecycle"; package lifecycle; -import "common/collection.proto"; +import "peer/collection.proto"; // InstallChaincodeArgs is the message used as the argument to // '_lifecycle.InstallChaincode'. @@ -97,7 +97,7 @@ message ApproveChaincodeDefinitionForMyOrgArgs { string endorsement_plugin = 4; string validation_plugin = 5; bytes validation_parameter = 6; - common.CollectionConfigPackage collections = 7; + protos.CollectionConfigPackage collections = 7; bool init_required = 8; ChaincodeSource source = 9; } @@ -130,7 +130,7 @@ message CommitChaincodeDefinitionArgs { string endorsement_plugin = 4; string validation_plugin = 5; bytes validation_parameter = 6; - common.CollectionConfigPackage collections = 7; + protos.CollectionConfigPackage collections = 7; bool init_required = 8; } @@ -149,7 +149,7 @@ message CheckCommitReadinessArgs { string endorsement_plugin = 4; string validation_plugin = 5; bytes validation_parameter = 6; - common.CollectionConfigPackage collections = 7; + protos.CollectionConfigPackage collections = 7; bool init_required = 8; } @@ -161,6 +161,26 @@ message CheckCommitReadinessResult{ map approvals = 1; } +// QueryApprovedChaincodeDefinitionArgs is the message used as arguments to +// `_lifecycle.QueryApprovedChaincodeDefinition`. +message QueryApprovedChaincodeDefinitionArgs { + string name = 1; + int64 sequence = 2; +} + +// QueryApprovedChaincodeDefinitionResult is the message returned by +// `_lifecycle.QueryApprovedChaincodeDefinition`. +message QueryApprovedChaincodeDefinitionResult { + int64 sequence = 1; + string version = 2; + string endorsement_plugin = 3; + string validation_plugin = 4; + bytes validation_parameter = 5; + protos.CollectionConfigPackage collections = 6; + bool init_required = 7; + ChaincodeSource source = 8; +} + // QueryChaincodeDefinitionArgs is the message used as arguments to // `_lifecycle.QueryChaincodeDefinition`. message QueryChaincodeDefinitionArgs { @@ -175,7 +195,7 @@ message QueryChaincodeDefinitionResult { string endorsement_plugin = 3; string validation_plugin = 4; bytes validation_parameter = 5; - common.CollectionConfigPackage collections = 6; + protos.CollectionConfigPackage collections = 6; bool init_required = 7; map approvals = 8; } @@ -194,7 +214,7 @@ message QueryChaincodeDefinitionsResult { string endorsement_plugin = 4; string validation_plugin = 5; bytes validation_parameter = 6; - common.CollectionConfigPackage collections = 7; + protos.CollectionConfigPackage collections = 7; bool init_required = 8; } repeated ChaincodeDefinition chaincode_definitions = 1; diff --git a/libraries/fabric-shim/protos/peer/transaction.proto b/libraries/fabric-shim/protos/peer/transaction.proto index fdffba33..93ef234e 100644 --- a/libraries/fabric-shim/protos/peer/transaction.proto +++ b/libraries/fabric-shim/protos/peer/transaction.proto @@ -13,20 +13,6 @@ package protos; import "peer/proposal_response.proto"; import "common/common.proto"; -// This message is necessary to facilitate the verification of the signature -// (in the signature field) over the bytes of the transaction (in the -// transactionBytes field). -message SignedTransaction { - // The bytes of the Transaction. NDD - bytes transaction_bytes = 1; - - // Signature of the transactionBytes The public key of the signature is in - // the header field of TransactionAction There might be multiple - // TransactionAction, so multiple headers, but there should be same - // transactor identity (cert) in all headers - bytes signature = 2; -} - // ProcessedTransaction wraps an Envelope that includes a transaction along with an indication // of whether the transaction was validated or invalidated by committing peer. // The use case is that GetTransactionByID API needs to retrieve the transaction Envelope diff --git a/libraries/fabric-shim/protos/transientstore/transientstore.proto b/libraries/fabric-shim/protos/transientstore/transientstore.proto index 1b6d577e..745ee9e7 100644 --- a/libraries/fabric-shim/protos/transientstore/transientstore.proto +++ b/libraries/fabric-shim/protos/transientstore/transientstore.proto @@ -10,7 +10,7 @@ option go_package = "github.com/hyperledger/fabric-protos-go/transientstore"; option java_package = "org.hyperledger.fabric.protos.transientstore"; import "ledger/rwset/rwset.proto"; -import "common/collection.proto"; +import "peer/collection.proto"; // TxPvtReadWriteSetWithConfigInfo encapsulates the transaction's private // read-write set and additional information about the configurations such as @@ -18,5 +18,5 @@ import "common/collection.proto"; message TxPvtReadWriteSetWithConfigInfo { uint64 endorsed_at = 1; rwset.TxPvtReadWriteSet pvt_rwset = 2; - map collection_configs = 3; + map collection_configs = 3; } diff --git a/libraries/fabric-shim/test/unit/chaincode.js b/libraries/fabric-shim/test/unit/chaincode.js index c1842dc0..2e7170b1 100644 --- a/libraries/fabric-shim/test/unit/chaincode.js +++ b/libraries/fabric-shim/test/unit/chaincode.js @@ -12,6 +12,7 @@ const expect = chai.expect; const rewire = require('rewire'); const fabprotos = require('../../bundle'); const path = require('path'); +const fs = require('fs'); const Logger = require('../../lib/logger'); @@ -19,6 +20,14 @@ const Stub = require('../../lib/stub'); const chaincodePath = '../../lib/chaincode.js'; const StartCommand = require('../../lib/cmds/startCommand.js'); +const caPath = path.join(__dirname, 'test-ca.pem'); +const certPath = path.join(__dirname, 'test-cert.base64'); +const keyPath = path.join(__dirname, 'test-key.base64'); + +const ca = fs.readFileSync(caPath, 'utf8'); +const key = fs.readFileSync(keyPath, 'utf8'); +const cert = fs.readFileSync(certPath, 'utf8'); + describe('Chaincode', () => { let Chaincode; let sandbox; @@ -88,7 +97,7 @@ describe('Chaincode', () => { }); it ('should start when passed init and invoke', () => { - const handlerClass = Chaincode.__get__('Handler'); + const handlerClass = Chaincode.__get__('ChaincodeSupportClient'); const chat = sandbox.stub(handlerClass.prototype, 'chat'); const myYargs = {'argv': {'$0': 'fabric-chaincode-node', 'peer.address': 'localhost:7051', 'chaincode-id-name': 'mycc'}}; @@ -131,8 +140,8 @@ describe('Chaincode', () => { const myYargs = {'argv': {'$0': 'fabric-chaincode-node', 'peer.address': 'localhost:7051', 'chaincode-id-name': 'mycc', 'some-other-arg': 'another-arg', 'yet-another-bad-arg': 'arg'}}; Chaincode.__set__('yargs', myYargs); - const handlerClass = Chaincode.__get__('Handler'); - Chaincode.__set__('Handler', MockHandler); + const handlerClass = Chaincode.__get__('ChaincodeSupportClient'); + Chaincode.__set__('ChaincodeSupportClient', MockHandler); const getArgsStub = sandbox.stub(StartCommand, 'getArgs').returns({ 'peer.address': 'localhost:7051', @@ -153,21 +162,19 @@ describe('Chaincode', () => { expect(testOpts.hasOwnProperty('module-path')).to.be.false; expect(testOpts.hasOwnProperty('peer.address')).to.be.true; - Chaincode.__set__('Handler', handlerClass); + Chaincode.__set__('ChaincodeSupportClient', handlerClass); getArgsStub.restore(); }); describe ('TLS handling', () => { - const testfile = path.join(__dirname, '../../../../package.json'); - const myYargs = {'argv': {'$0': 'fabric-chaincode-node', 'peer.address': 'localhost:7051', 'chaincode-id-name': 'mycc'}}; let getArgsStub; before(() => { process.env.CORE_PEER_TLS_ENABLED = true; - process.env.CORE_PEER_TLS_ROOTCERT_FILE = testfile; + process.env.CORE_PEER_TLS_ROOTCERT_FILE = caPath; }); beforeEach(() => { @@ -198,7 +205,7 @@ describe('Chaincode', () => { }); it ('should throw an error when CORE_TLS_CLIENT_KEY_PATH env var set but CORE_TLS_CLIENT_CERT_PATH env var not set', () => { - process.env.CORE_TLS_CLIENT_KEY_PATH = testfile; + process.env.CORE_TLS_CLIENT_KEY_PATH = keyPath; expect(() => { Chaincode.start({Init: function() {}, Invoke: function() {}}); }).to.throw(/The client key and cert are needed when TLS is enabled, but environment variables specifying the paths to these files are missing/); @@ -206,11 +213,11 @@ describe('Chaincode', () => { it ('should call handler.chat() with the correct object and output a message', () => { - const handlerClass = Chaincode.__get__('Handler'); + const handlerClass = Chaincode.__get__('ChaincodeSupportClient'); const chat = sandbox.stub(handlerClass.prototype, 'chat'); - process.env.CORE_TLS_CLIENT_KEY_PATH = testfile; - process.env.CORE_TLS_CLIENT_CERT_PATH = testfile; + process.env.CORE_TLS_CLIENT_KEY_PATH = keyPath; + process.env.CORE_TLS_CLIENT_CERT_PATH = certPath; Chaincode.start({Init: function() {}, Invoke: function() {}}); @@ -240,27 +247,22 @@ describe('Chaincode', () => { } } - const handlerClass = Chaincode.__get__('Handler'); - Chaincode.__set__('Handler', MockHandler); + const handlerClass = Chaincode.__get__('ChaincodeSupportClient'); + Chaincode.__set__('ChaincodeSupportClient', MockHandler); - process.env.CORE_TLS_CLIENT_KEY_PATH = testfile; - process.env.CORE_TLS_CLIENT_CERT_PATH = testfile; + process.env.CORE_TLS_CLIENT_KEY_PATH = keyPath; + process.env.CORE_TLS_CLIENT_CERT_PATH = certPath; Chaincode.start({Init: function() {}, Invoke: function() {}}); sinon.assert.calledOnce(getArgsStub); sinon.assert.calledWith(getArgsStub, myYargs); - const attributes = ['pem', 'cert', 'key']; - - attributes.forEach((attr) => { - expect(typeof testOpts[attr]).to.deep.equal('string'); + testOpts.pem.should.equal(ca); + testOpts.cert.should.equal(cert); + testOpts.key.should.equal(key); - const json = JSON.parse(testOpts[attr]); - expect(json.name).to.deep.equal('fabric-shim-test'); - }); - - Chaincode.__set__('Handler', handlerClass); + Chaincode.__set__('ChaincodeSupportClient', handlerClass); }); }); }); @@ -369,4 +371,23 @@ describe('Chaincode', () => { Logger.getLogger.restore(); }); }); + + describe('server()', () => { + before(() => { + Chaincode = rewire(chaincodePath); + }); + + it ('should create a ChaincodeServer instance', () => { + const mockObj = {_chaincode: {}, _serverOpts: {}}; + const serverStub = sinon.stub().returns(mockObj); + Chaincode.__set__('ChaincodeServer', serverStub); + + const mockChaincode = new Chaincode.ChaincodeInterface(); + const serverOpts = {ccid: 'example-cc-id:1', address: '0.0.0.0:9999'}; + + expect(Chaincode.server(mockChaincode, serverOpts)).to.deep.equal(mockObj); + expect(serverStub.calledOnce).to.be.true; + expect(serverStub.firstCall.args).to.deep.equal([mockChaincode, serverOpts]); + }); + }); }); diff --git a/libraries/fabric-shim/test/unit/cli.js b/libraries/fabric-shim/test/unit/cli.js index d1103bd3..7550e49a 100644 --- a/libraries/fabric-shim/test/unit/cli.js +++ b/libraries/fabric-shim/test/unit/cli.js @@ -20,11 +20,15 @@ const sinon = require('sinon'); const yargs = require('yargs'); +const {execSync} = require('child_process'); + describe('fabric-chaincode-node cli', () => { let sandbox; beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(yargs, 'parserConfiguration').returns(yargs); sandbox.stub(yargs, 'commandDir').returns(yargs); sandbox.stub(yargs, 'demandCommand').returns(yargs); @@ -34,10 +38,15 @@ describe('fabric-chaincode-node cli', () => { sandbox.stub(yargs, 'version').returns(yargs); sandbox.stub(process, 'exit'); + execSync('cp ./cli.js ./cli2.js', () => {}); + execSync('sed 1d ./cli2.js > ./cli.js', () => {}); }); afterEach(() => { sandbox.restore(); + delete require.cache[require.resolve('../../cli.js')]; + execSync('rm ./cli.js', () => {}); + execSync('mv ./cli2.js ./cli.js', () => {}); }); describe('Main test', () => { @@ -66,7 +75,6 @@ describe('fabric-chaincode-node cli', () => { }); delete require.cache[require.resolve('../../cli.js')]; require('../../cli.js'); - }); it('should handle rejected promise correctly', () => { @@ -78,7 +86,6 @@ describe('fabric-chaincode-node cli', () => { }); delete require.cache[require.resolve('../../cli.js')]; require('../../cli.js'); - }); }); }); diff --git a/libraries/fabric-shim/test/unit/cmds/chaincode.js b/libraries/fabric-shim/test/unit/cmds/chaincode.js index 5ad16488..fc53cfec 100644 --- a/libraries/fabric-shim/test/unit/cmds/chaincode.js +++ b/libraries/fabric-shim/test/unit/cmds/chaincode.js @@ -30,7 +30,7 @@ describe('chaincode cmd', () => { let sandbox; beforeEach(() => { - sandbox = sinon.sandbox.create(); + sandbox = sinon.createSandbox(); }); afterEach(() => { @@ -139,21 +139,21 @@ describe('chaincode cmd', () => { }; const mockYargsParser = sinon.stub().returns({ - chaincodeIdName: 'Jeremy', + 'CORE_PEER_ADDRESS': 'address', modulePath: '/home/andy/my/super/contract' }); const yp = chaincodeStartCommand.__get__('YargsParser'); chaincodeStartCommand.__set__('YargsParser', mockYargsParser); - process.argv = ['node', 'test.js', '--chaincode-id-name', 'mycc']; + process.argv = ['node', 'test.js', '--CORE_PEER_ADDRESS', 'address']; expect(() => { chaincodeStartCommand.getArgs(myYargs); - }).to.throw(/Missing required argument peer.address/); + }).to.throw(/Missing required argument chaincode-id-name/); sinon.assert.calledOnce(mockYargsParser); - sinon.assert.calledWith(mockYargsParser, ['--chaincode-id-name', 'mycc'], { + sinon.assert.calledWith(mockYargsParser, ['--CORE_PEER_ADDRESS', 'address'], { default: { 'grpc.max_send_message_length': -1, 'grpc.max_receive_message_length': -1, @@ -172,5 +172,53 @@ describe('chaincode cmd', () => { chaincodeStartCommand.__set__('YargsParser', yp); }); + + it ('should use yargs parser on process.argv, CORE_PEER_ADDRESS should override peer.address', () => { + const myYargs = { + argv: { + $0: 'index.js', + someArg: 'hello world' + }, + }; + + const mockYargsParser = sinon.stub().returns({ + chaincodeIdName: 'Jeremy', + modulePath: '/home/andy/my/super/contract', + 'peer.address': 'some addr', + 'CORE_PEER_ADDRESS': 'localhost:7052' + }); + + const yp = chaincodeStartCommand.__get__('YargsParser'); + chaincodeStartCommand.__set__('YargsParser', mockYargsParser); + + process.argv = ['node', 'test.js', '--peer.address', 'localhost:7051', '--chaincode-id-name', 'mycc', + '--CORE_PEER_ADDRESS', 'localhost:7052']; + + const args = chaincodeStartCommand.getArgs(myYargs); + + sinon.assert.calledOnce(mockYargsParser); + sinon.assert.calledWith(mockYargsParser, ['--peer.address', 'localhost:7051', '--chaincode-id-name', 'mycc', + '--CORE_PEER_ADDRESS', 'localhost:7052'], { + default: { + 'grpc.max_send_message_length': -1, + 'grpc.max_receive_message_length': -1, + 'grpc.keepalive_time_ms': 110000, + 'grpc.http2.min_time_between_pings_ms': 110000, + 'grpc.keepalive_timeout_ms': 20000, + 'grpc.http2.max_pings_without_data': 0, + 'grpc.keepalive_permit_without_calls': 1, + 'module-path': process.cwd() + }, + configuration: { + 'dot-notation': false + }, + envPrefix: 'CORE' + }); + expect(args['chaincode-id-name']).to.deep.equal('Jeremy'); + expect(args['peer.address']).to.deep.equal('localhost:7052'); + expect(args['module-path']).to.deep.equal('/home/andy/my/super/contract'); + + chaincodeStartCommand.__set__('YargsParser', yp); + }); }); }); diff --git a/libraries/fabric-shim/test/unit/cmds/metadata/lib/generate.js b/libraries/fabric-shim/test/unit/cmds/metadata/lib/generate.js index db4d99f1..fc7a9c7d 100644 --- a/libraries/fabric-shim/test/unit/cmds/metadata/lib/generate.js +++ b/libraries/fabric-shim/test/unit/cmds/metadata/lib/generate.js @@ -242,7 +242,7 @@ describe('generate', () => { sinon.assert.calledOnce(getInfoFromContractStub); sinon.assert.calledOnce(getMetadataStub); sinon.assert.calledOnce(infoStub); - infoStub.getCall(0).args.should.deep.equal(['Metadata is : \n', JSON.stringify( + infoStub.getCall(0).args.should.deep.equal([JSON.stringify( { info: { title: 'some title', diff --git a/libraries/fabric-shim/test/unit/cmds/serverCommand.js b/libraries/fabric-shim/test/unit/cmds/serverCommand.js new file mode 100644 index 00000000..14426b2f --- /dev/null +++ b/libraries/fabric-shim/test/unit/cmds/serverCommand.js @@ -0,0 +1,211 @@ +/* +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ + +'use strict'; + +const sinon = require('sinon'); + +const chai = require('chai'); +const expect = chai.expect; +const fs = require('fs'); +const path = require('path'); + +const yargs = require('yargs'); +const Bootstrap = require('../../../lib/contract-spi/bootstrap'); +const chaincodeServerCommand = require('../../../lib/cmds/serverCommand.js'); + +describe('server cmd', () => { + let sandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + describe('.builder', () => { + it('should configure the builder function', () => { + sandbox.stub(yargs, 'options'); + sandbox.stub(yargs, 'usage'); + sandbox.stub(yargs, 'check'); + + chaincodeServerCommand.builder(yargs); + + expect(yargs.options.calledOnce).to.be.true; + + const args = yargs.options.getCall(0).args[0]; + + expect(args['chaincode-address'].required).to.be.true; + expect(args['chaincode-id'].required).to.be.true; + expect(args['grpc.max_send_message_length'].default).to.deep.equal(-1); + expect(args['grpc.max_receive_message_length'].default).to.deep.equal(-1); + expect(args['grpc.keepalive_time_ms'].default).to.deep.equal(110000); + expect(args['grpc.http2.min_time_between_pings_ms'].default).to.deep.equal(110000); + expect(args['grpc.keepalive_timeout_ms'].default).to.deep.equal(20000); + expect(args['grpc.http2.max_pings_without_data'].default).to.deep.equal(0); + expect(args['grpc.keepalive_permit_without_calls'].default).to.deep.equal(1); + expect(args['module-path'].default).to.deep.equal(process.cwd()); + + expect(yargs.usage.calledOnce).to.be.true; + expect(yargs.check.calledOnce).to.be.true; + }); + }); + + describe('.handle', () => { + it('should handle properly and call bootstrap', () => { + sandbox.stub(Bootstrap, 'bootstrap'); + + const argv = {}; + chaincodeServerCommand.handler(argv); + + expect(Bootstrap.bootstrap.calledOnce).to.be.true; + }); + }); + + describe('.getArgs', () => { + const certFileEncoded = path.join(__dirname, '..', 'test-cert.base64'); + const keyFileEncoded = path.join(__dirname, '..', 'test-key.base64'); + const caFileEncoded = path.join(__dirname, '..', 'test-ca.base64'); + const certFile = path.join(__dirname, '..', 'test-cert.pem'); + const keyFile = path.join(__dirname, '..', 'test-key.pem'); + const caFile = path.join(__dirname, '..', 'test-ca.pem'); + const cert = Buffer.from(fs.readFileSync(certFileEncoded).toString(), 'base64'); + const key = Buffer.from(fs.readFileSync(keyFileEncoded).toString(), 'base64'); + const ca = Buffer.from(fs.readFileSync(caFileEncoded).toString(), 'base64'); + + it('should return the arguments properly', () => { + const argv = { + 'chaincode-address': '0.0.0.0:9999', + 'chaincode-id': 'test_id:1', + 'grpc.keepalive_time_ms': 1000, + 'module-path': '/tmp/example', + 'extra-options': 'something' + }; + + const ret = chaincodeServerCommand.getArgs({argv}); + + expect(ret.address).to.equal('0.0.0.0:9999'); + expect(ret.ccid).to.equal('test_id:1'); + expect(ret['grpc.keepalive_time_ms']).to.equal(1000); + expect(ret['module-path']).to.equal('/tmp/example'); + expect(ret['chaincode-address']).to.be.undefined; + expect(ret['chaincode-id']).to.be.undefined; + expect(ret['extra-options']).to.be.undefined; + }); + + it('should return the TLS arguments properly', () => { + const argv = { + 'chaincode-address': '0.0.0.0:9999', + 'chaincode-id': 'test_id:1', + 'module-path': '/tmp/example', + 'chaincode-tls-cert-path': certFileEncoded, + 'chaincode-tls-key-path': keyFileEncoded + }; + + const ret = chaincodeServerCommand.getArgs({argv}); + + expect(ret.address).to.equal('0.0.0.0:9999'); + expect(ret.ccid).to.equal('test_id:1'); + + expect(ret.tlsProps).to.deep.equal({ + cert, + key + }); + }); + + it('should return the mutual TLS arguments properly', () => { + const argv = { + 'chaincode-address': '0.0.0.0:9999', + 'chaincode-id': 'test_id:1', + 'module-path': '/tmp/example', + 'chaincode-tls-cert-path': certFileEncoded, + 'chaincode-tls-key-path': keyFileEncoded, + 'chaincode-tls-client-cacert-path': caFileEncoded + }; + + const ret = chaincodeServerCommand.getArgs({argv}); + + expect(ret.address).to.equal('0.0.0.0:9999'); + expect(ret.ccid).to.equal('test_id:1'); + + expect(ret.tlsProps).to.deep.equal({ + cert, + key, + clientCACerts: ca + }); + }); + + it('should return the TLS arguments with PEM files properly', () => { + const argv = { + 'chaincode-address': '0.0.0.0:9999', + 'chaincode-id': 'test_id:1', + 'module-path': '/tmp/example', + 'chaincode-tls-cert-file': certFile, + 'chaincode-tls-key-file': keyFile, + 'chaincode-tls-client-cacert-file': caFile + }; + + const ret = chaincodeServerCommand.getArgs({argv}); + + expect(ret.address).to.equal('0.0.0.0:9999'); + expect(ret.ccid).to.equal('test_id:1'); + + expect(ret.tlsProps).to.deep.equal({ + cert, + key, + clientCACerts: ca + }); + }); + }); + + describe('parse arguments', () => { + it('should parse the arguments successfully', () => { + expect(() => { + chaincodeServerCommand.builder(yargs) + .exitProcess(false) + .parse('--chaincode-id test_id:1 --chaincode-address 0.0.0.0:9999'); + }).not.to.throw(); + }); + + it('should parse the arguments successfully with TLS options', () => { + expect(() => { + chaincodeServerCommand.builder(yargs) + .exitProcess(false) + .parse('--chaincode-id test_id:1 --chaincode-address 0.0.0.0:9999 ' + + '--chaincode-tls-key-file tls.key --chaincode-tls-cert-file tls.pem'); + }).not.to.throw(); + }); + + it('should throw when conflicting arguments are passed', () => { + expect(() => { + chaincodeServerCommand.builder(yargs) + .exitProcess(false) + .parse('--chaincode-id test_id:1 --chaincode-address 0.0.0.0:9999 ' + + '--chaincode-tls-key-file tls.key --chaincode-tls-key-path tls.pem'); + }).to.throw(); + }); + + it('should throw when only TLS key is passed', () => { + expect(() => { + chaincodeServerCommand.builder(yargs) + .exitProcess(false) + .parse('--chaincode-id test_id:1 --chaincode-address 0.0.0.0:9999 ' + + '--chaincode-tls-key-file tls.key'); + }).to.throw(); + }); + + it('should throw when only TLS cert is passed', () => { + expect(() => { + chaincodeServerCommand.builder(yargs) + .exitProcess(false) + .parse('--chaincode-id test_id:1 --chaincode-address 0.0.0.0:9999 ' + + '--chaincode-tls-cert-file tls.pem'); + }).to.throw(); + }); + }); +}); diff --git a/libraries/fabric-shim/test/unit/contract-spi/bootstrap.js b/libraries/fabric-shim/test/unit/contract-spi/bootstrap.js index bd1698b7..34cb6c4b 100644 --- a/libraries/fabric-shim/test/unit/contract-spi/bootstrap.js +++ b/libraries/fabric-shim/test/unit/contract-spi/bootstrap.js @@ -59,6 +59,7 @@ describe('bootstrap.js', () => { let sandbox; let mockShim; + let mockServer; let mockCmd; let readFileStub; let pathExistsStub; @@ -73,7 +74,8 @@ describe('bootstrap.js', () => { useCleanCache: true }); sandbox = sinon.createSandbox(); - mockShim = {start : sandbox.stub()}; + mockServer = {start: sandbox.stub()}; + mockShim = {start : sandbox.stub(), server: sandbox.stub().returns(mockServer)}; getArgsStub = sandbox.stub(); mockCmd = {getArgs : getArgsStub}; @@ -84,6 +86,7 @@ describe('bootstrap.js', () => { mockery.registerMock('yargs', {}); mockery.registerMock('../chaincode', mockShim); mockery.registerMock('../cmds/startCommand.js', mockCmd); + mockery.registerMock('../cmds/serverCommand.js', mockCmd); mockery.registerMock('./chaincodefromcontract', MockChaincodeFromContract); mockery.registerMock('fs-extra', {pathExists:pathExistsStub, readFileSync : readFileStub}); @@ -103,6 +106,16 @@ describe('bootstrap.js', () => { sinon.assert.calledOnce(mockShim.start); }); + it('should pass on the register to the shim in the server mode', async () => { + const opts = {ccid: 'abcdef', address: '0.0.0.0:9999'}; + await Bootstrap.register([sc], {}, {}, 'some title', 'some version', opts, true); + + sinon.assert.calledOnce(mockShim.server); + sinon.assert.calledOnce(mockServer.start); + + expect(mockShim.server.getCall(0).args[1]).to.deep.equal(opts); + }); + }); describe('#bootstrap', () => { @@ -129,8 +142,24 @@ describe('bootstrap.js', () => { sinon.assert.calledOnce(getMetadataStub); sinon.assert.calledOnce(getInfoFromContractStub); sinon.assert.calledOnce(registerStub); - sinon.assert.calledWith(registerStub, [sc], {}, {}, 'some title', 'some version'); + sinon.assert.calledWith(registerStub, [sc], {}, {}, 'some title', 'some version', {'module-path':'fakepath'}, false); + }); + + it ('should correctly call the register method in the server mode', async () => { + getMetadataStub.resolves({}); + mockery.registerMock(path.resolve(process.cwd(), 'fakepath', 'entrypoint'), {contracts: [sc]}); + const registerStub = sandbox.stub(); + Bootstrap.register = registerStub; + getInfoFromContractStub.returns({contracts: [sc], serializers : {}, title: 'some title', version: 'some version'}); + + await Bootstrap.bootstrap(true); + + sinon.assert.calledOnce(getMetadataStub); + sinon.assert.calledOnce(getInfoFromContractStub); + sinon.assert.calledOnce(registerStub); + sinon.assert.calledWith(registerStub, [sc], {}, {}, 'some title', 'some version', {'module-path':'fakepath'}, true); }); + }); describe('#getInfoFromContract', () => { @@ -270,13 +299,25 @@ describe('bootstrap.js', () => { describe('#getMetadata', () => { - it ('should handle when there are files available', async () => { + it ('should handle when there are files available in META-INF dir', async () => { pathExistsStub.returns(true); Bootstrap.loadAndValidateMetadata = sandbox.stub().resolves({'hello':'world'}); const metadata = await Bootstrap.getMetadata('fake path'); metadata.should.deep.equal({'hello':'world'}); + sinon.assert.calledOnce(pathExistsStub); + }); + + it ('should handle when there are files available in contract-metadata dir', async () => { + pathExistsStub.onFirstCall().returns(false); + pathExistsStub.onSecondCall().returns(true); + Bootstrap.loadAndValidateMetadata = sandbox.stub().resolves({'hello':'world'}); + + const metadata = await Bootstrap.getMetadata('fake path'); + + metadata.should.deep.equal({'hello':'world'}); + sinon.assert.calledTwice(pathExistsStub); }); it ('should handle when files not available', async () => { @@ -285,6 +326,7 @@ describe('bootstrap.js', () => { const metadata = await Bootstrap.getMetadata('fake path'); metadata.should.deep.equal({}); + sinon.assert.calledTwice(pathExistsStub); }); }); @@ -340,12 +382,6 @@ describe('bootstrap.js', () => { Bootstrap.__set__('Ajv', originalAjv); }); - xit ('Correct schema path is pointed to in the validate method', () => { - const schemaPath = path.resolve(__dirname, '../../../../fabric-contract-api/schema/contract-schema.json'); - const schemaPathCheck = fs.pathExistsSync(schemaPath); - expect(schemaPathCheck).to.equal(true, 'Current contract-schema path: ' + schemaPath + ' is incorrect'); - }); - it('Should correct validate a schema', () => { const json = ` { @@ -387,6 +423,11 @@ describe('bootstrap.js', () => { expect(metadata).to.deep.equal(JSON.parse(json)); }); + it('Coverage', () => { + const noop = require(path.join(pathToRoot, 'fabric-shim/lib/contract-spi/bootstrap.js')).noop; + noop(); + }); + }); }); diff --git a/libraries/fabric-shim/test/unit/contract-spi/chaincodefromcontract.js b/libraries/fabric-shim/test/unit/contract-spi/chaincodefromcontract.js index 159e98a2..9c383dc0 100644 --- a/libraries/fabric-shim/test/unit/contract-spi/chaincodefromcontract.js +++ b/libraries/fabric-shim/test/unit/contract-spi/chaincodefromcontract.js @@ -38,14 +38,10 @@ const Contract = require('fabric-contract-api').Contract; const JSONSerializer = require(path.join(pathToRoot, 'fabric-contract-api/lib/jsontransactionserializer.js')); const SystemContract = require(path.join('../../../', 'lib/contract-spi/systemcontract')); - const StartCommand = require(path.join('../../../', 'lib/cmds/startCommand.js')); +const StartCommand = require(path.join('../../../', 'lib/cmds/startCommand.js')); const ChaincodeFromContract = require(path.join('../../../', 'lib/contract-spi/chaincodefromcontract')); const shim = require(path.join('../../../', 'lib/chaincode')); -// const SystemContract = require('fabric-shim/lib/contract-spi/systemcontract'); -// const StartCommand = require('fabric-shim/lib/cmds/startCommand.js'); -// const ChaincodeFromContract = require('fabric-shim/lib/contract-spi/chaincodefromcontract'); -// const shim = require( 'fabric-shim/lib/chaincode'); const utils = require('../../../lib/utils/utils'); const defaultSerialization = { @@ -475,6 +471,7 @@ describe('chaincodefromcontract', () => { }); it('should pass the logging object to contracts', async () => { + let i=0; const idBytes = Buffer.from(certWithoutAttrs); const tempClass = class extends Contract { constructor() { @@ -489,8 +486,9 @@ describe('chaincodefromcontract', () => { return alphaStub(ctx, arg1, arg2); } }; + const systemContract = new SystemContract(); - const appClass = new tempClass(); + const appClass = new SCAlpha(); sandbox.stub(ChaincodeFromContract.prototype, '_resolveContractImplementations') .returns({ 'org.hyperledger.fabric': { @@ -509,6 +507,7 @@ describe('chaincodefromcontract', () => { } } }); + sandbox.stub(ChaincodeFromContract.prototype, '_checkAgainstSuppliedMetadata').returns([]); sandbox.stub(ChaincodeFromContract.prototype, '_compileSchemas'); @@ -516,34 +515,43 @@ describe('chaincodefromcontract', () => { mspid: 'Org1MSP', idBytes }; + const cc = new ChaincodeFromContract([tempClass], defaultSerialization); + const mockStub = {getBufferArgs: sandbox.stub().returns(['logging:alpha']), getTxID: sandbox.stub().returns('12345897asd7a7a77v7b77'), getChannelID: sandbox.stub().returns('channel-id-fake'), getCreator: sandbox.stub().returns(mockSigningId) }; - // + const levelSpy = sinon.spy(Logger, 'setLevel'); + + + let spyLogger = { + info: sinon.stub(), + debug: sinon.stub() + } + sandbox.stub(Logger,'getLogger').returns(spyLogger) + await cc.Invoke(mockStub); + const ctx = alphaStub.getCall(0).args[0]; + ctx.logging.setLevel('DEBUG'); sinon.assert.called(levelSpy); sinon.assert.calledWith(levelSpy, 'DEBUG'); - const cclogger = ctx.logging.getLogger(); - const logger = Logger.getLogger('logging'); - const infospy = sinon.spy(logger, 'info'); + + const cclogger = ctx.logging.getLogger(); cclogger.info('info'); - sinon.assert.calledWith(infospy, 'info'); + sinon.assert.calledWith(spyLogger.info, 'info'); ctx.logging.setLevel('INFO'); sinon.assert.called(levelSpy); sinon.assert.calledWith(levelSpy, 'INFO'); - - - const ccloggerNamed = ctx.logging.getLogger('wibble'); - const debugSpy = sinon.spy(Logger.getLogger('logging:wibble'), 'debug'); - ccloggerNamed.debug('Named logger'); - sinon.assert.calledWith(debugSpy, 'Named logger'); + + const cclogger_named = ctx.logging.getLogger("Named"); + cclogger_named.debug('Named logger'); + sinon.assert.calledWith(spyLogger.debug, 'Named logger'); }); @@ -597,7 +605,7 @@ describe('chaincodefromcontract', () => { }); fakeError = sinon.fake((e) => { - log(e); + log(`Expected Error ${e}`); }); sandbox.replace(shim, 'success', fakeSuccess); @@ -630,20 +638,28 @@ describe('chaincodefromcontract', () => { return 'a channel id'; } }; - await cc.invokeFunctionality(mockStub); - + + try { + await cc.invokeFunctionality(mockStub); + } catch (e){ + // ok.... + } + sinon.assert.called(fakeError); sinon.assert.notCalled(fakeSuccess); }); - it ('should handle valid contract name, but missing function', async () => { + it('should handle valid contract name, but missing function', async () => { const idBytes = Buffer.from(certWithoutAttrs); const ctx = { setChaincodeStub: sandbox.stub(), - setClientIdentity: sandbox.stub() + setClientIdentity: sandbox.stub(), + logging:{ + setLevel:()=>{},getLogger:()=>{} + } }; const nameMetadata = { @@ -669,6 +685,7 @@ describe('chaincodefromcontract', () => { 'name': nameMetadata } }); + const cc = new ChaincodeFromContract([SCAlpha], defaultSerialization); sinon.assert.calledOnce(ChaincodeFromContract.prototype._resolveContractImplementations); sinon.assert.calledOnce(_checkSuppliedStub); @@ -689,8 +706,8 @@ describe('chaincodefromcontract', () => { } }; cc.contractImplementations.name = nameMetadata; - await cc.invokeFunctionality(mockStub); + sinon.assert.called(fakeSuccess); sinon.assert.notCalled(fakeError); @@ -878,7 +895,7 @@ describe('chaincodefromcontract', () => { { returns: {name: 'success', schema: {type: 'string'}}, name: 'fn', - tag: ['submitTx'], + tag: ['SUBMIT', 'submitTx'], parameters: [] }, ] @@ -1023,7 +1040,7 @@ describe('chaincodefromcontract', () => { } } ], - tags: ['submitTx'] + tags: ['SUBMIT', 'submitTx'] }]); delete Object.getPrototypeOf(ci).property; @@ -1059,7 +1076,7 @@ describe('chaincodefromcontract', () => { } } ], - tags: ['submitTx'] + tags: ['SUBMIT', 'submitTx'] }]); delete Object.getPrototypeOf(ci).property; @@ -1142,11 +1159,11 @@ describe('chaincodefromcontract', () => { } } ], - tags: ['submitTx'] + tags: ['SUBMIT', 'submitTx'] }, { name: 'conga', - tags: ['submitTx'] + tags: ['SUBMIT', 'submitTx'] } ]); @@ -1154,7 +1171,7 @@ describe('chaincodefromcontract', () => { }); }); - describe ('#_augmentMetadataFromCode', () => { + describe('#_augmentMetadataFromCode', () => { const exampleMetadata = { $schema: 'my schema link', contracts: { @@ -1209,7 +1226,7 @@ describe('chaincodefromcontract', () => { const metadata = fakeCcfc._augmentMetadataFromCode(partialMetadata); const correctData = { - '$schema': 'https://fabric-shim.github.io/master/contract-schema.json', + '$schema': 'https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json', 'components': { 'schemas': {} }, @@ -1344,7 +1361,7 @@ describe('chaincodefromcontract', () => { metadata.components.should.deep.equal(metadataToSend.components); metadata.contracts.should.deep.equal(metadataToSend.contracts); metadata.info.should.deep.equal(metadataToSend.info); - metadata.$schema.should.deep.equal('https://fabric-shim.github.io/master/contract-schema.json'); + metadata.$schema.should.deep.equal('https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json'); }); }); diff --git a/libraries/fabric-shim/test/unit/handler.js b/libraries/fabric-shim/test/unit/handler.js index 09bf0530..35cb1f05 100644 --- a/libraries/fabric-shim/test/unit/handler.js +++ b/libraries/fabric-shim/test/unit/handler.js @@ -21,7 +21,9 @@ const StateQueryIterator = require('../../../fabric-shim/lib/iterators.js').Stat const HistoryQueryIterator = require('../../../fabric-shim/lib/iterators.js').HistoryQueryIterator; const fabprotos = require('../../bundle'); -const grpc = require('grpc'); +const grpc = require('@grpc/grpc-js'); +const fs = require('fs'); +const path = require('path'); const sandbox = sinon.createSandbox(); @@ -30,10 +32,14 @@ const mockChaincodeImpl = { Invoke: function() {} }; +const ca = fs.readFileSync(path.join(__dirname, 'test-ca.pem'), 'utf8'); +const key = fs.readFileSync(path.join(__dirname, 'test-key.base64'), 'utf8'); +const cert = fs.readFileSync(path.join(__dirname, 'test-cert.base64'), 'utf8'); + const mockOpts = { - pem: 'dummy pem string', - key: 'dummy key', - cert: 'dummy cert' + pem: ca, + key: key, + cert: cert }; const mockPeerAddress = { @@ -90,7 +96,7 @@ describe('Handler', () => { it ('should call the resolve function', () => { qMsg.success('response'); - expect(resolve.calledOnce).to.be.ok; + expect(resolve.calledOnce).to.be.true; expect(resolve.firstCall.args).to.deep.equal(['response']); }); }); @@ -99,7 +105,7 @@ describe('Handler', () => { it ('should call the reject function', () => { qMsg.fail('err'); - expect(reject.calledOnce).to.be.ok; + expect(reject.calledOnce).to.be.true; expect(reject.firstCall.args).to.deep.equal(['err']); }); }); @@ -138,7 +144,7 @@ describe('Handler', () => { it ('should add message to the queue and call sendMsg and handle when txContentId not in txQueues', () => { qHandler.queueMsg(qMsg); - expect(mockSendMsg.calledOnce).to.be.ok; + expect(mockSendMsg.calledOnce).to.be.true; expect(mockSendMsg.firstCall.args).to.deep.equal([txContextId]); expect(qHandler.txQueues[txContextId]).to.deep.equal([qMsg]); }); @@ -148,7 +154,7 @@ describe('Handler', () => { qHandler.queueMsg(qMsg); - expect(mockSendMsg.calledOnce).to.be.ok; + expect(mockSendMsg.calledOnce).to.be.true; expect(mockSendMsg.firstCall.args).to.deep.equal([txContextId]); expect(qHandler.txQueues[txContextId]).to.deep.equal([qMsg]); }); @@ -158,7 +164,7 @@ describe('Handler', () => { qHandler.queueMsg(qMsg); - expect(mockSendMsg.notCalled).to.be.ok; + expect(mockSendMsg.notCalled).to.be.true; expect(qHandler.txQueues[txContextId]).to.deep.equal(['some qMsg', qMsg]); }); }); @@ -204,12 +210,12 @@ describe('Handler', () => { qHandler.handleMsgResponse(response); - expect(mockGetCurrMsg.calledOnce).to.be.ok; + expect(mockGetCurrMsg.calledOnce).to.be.true; expect(mockGetCurrMsg.firstCall.args).to.deep.equal([response.channel_id + response.txid]); - expect(mockParseResponse.notCalled).to.be.ok; - expect(qMsg.success.notCalled).to.be.ok; - expect(qMsg.fail.notCalled).to.be.ok; - expect(mockRemoveCurrentAndSendNextMsg.notCalled).to.be.ok; + expect(mockParseResponse.notCalled).to.be.true; + expect(qMsg.success.notCalled).to.be.true; + expect(qMsg.fail.notCalled).to.be.true; + expect(mockRemoveCurrentAndSendNextMsg.notCalled).to.be.true; }); it ('should call qMsg success when parseResponse does not throw an error _removeCurrentAndSendNextMsg', () => { @@ -218,14 +224,14 @@ describe('Handler', () => { qHandler.handleMsgResponse(response); - expect(mockGetCurrMsg.calledOnce).to.be.ok; + expect(mockGetCurrMsg.calledOnce).to.be.true; expect(mockGetCurrMsg.firstCall.args).to.deep.equal([response.channel_id + response.txid]); - expect(mockParseResponse.calledOnce).to.be.ok; + expect(mockParseResponse.calledOnce).to.be.true; expect(mockParseResponse.firstCall.args).to.deep.equal([mockHandler, response, 'some method']); - expect(qMsg.success.calledOnce).to.be.ok; + expect(qMsg.success.calledOnce).to.be.true; expect(qMsg.success.firstCall.args).to.deep.equal(['parsed response']); - expect(qMsg.fail.notCalled).to.be.ok; - expect(mockRemoveCurrentAndSendNextMsg.calledOnce).to.be.ok; + expect(qMsg.fail.notCalled).to.be.true; + expect(mockRemoveCurrentAndSendNextMsg.calledOnce).to.be.true; expect(mockRemoveCurrentAndSendNextMsg.firstCall.args).to.deep.equal([response.channel_id + response.txid]); }); @@ -236,14 +242,14 @@ describe('Handler', () => { qHandler.handleMsgResponse(response); - expect(mockGetCurrMsg.calledOnce).to.be.ok; + expect(mockGetCurrMsg.calledOnce).to.be.true; expect(mockGetCurrMsg.firstCall.args).to.deep.equal([response.channel_id + response.txid]); - expect(mockParseResponse.calledOnce).to.be.ok; + expect(mockParseResponse.calledOnce).to.be.true; expect(mockParseResponse.firstCall.args).to.deep.equal([mockHandler, response, 'some method']); - expect(qMsg.success.notCalled).to.be.ok; - expect(qMsg.fail.calledOnce).to.be.ok; + expect(qMsg.success.notCalled).to.be.true; + expect(qMsg.fail.calledOnce).to.be.true; expect(qMsg.fail.firstCall.args).to.deep.equal([err]); - expect(mockRemoveCurrentAndSendNextMsg.calledOnce).to.be.ok; + expect(mockRemoveCurrentAndSendNextMsg.calledOnce).to.be.true; expect(mockRemoveCurrentAndSendNextMsg.firstCall.args).to.deep.equal([response.channel_id + response.txid]); }); }); @@ -287,7 +293,7 @@ describe('Handler', () => { qHandler._removeCurrentAndSendNextMsg(txContextId); - expect(sendMsg.calledOnce).to.be.ok; + expect(sendMsg.calledOnce).to.be.true; expect(qHandler.txQueues[txContextId]).to.deep.equal(['message2']); expect(qHandler.txQueues[alternateTxContextId]).to.deep.equal(['message3', 'message4']); }); @@ -297,7 +303,7 @@ describe('Handler', () => { qHandler._removeCurrentAndSendNextMsg(txContextId); - expect(sendMsg.notCalled).to.be.ok; + expect(sendMsg.notCalled).to.be.true; expect(qHandler.txQueues[txContextId]).to.be.undefined; expect(qHandler.txQueues[alternateTxContextId]).to.deep.equal(['message3', 'message4']); }); @@ -307,7 +313,7 @@ describe('Handler', () => { qHandler._removeCurrentAndSendNextMsg(txContextId); - expect(sendMsg.notCalled).to.be.ok; + expect(sendMsg.notCalled).to.be.true; expect(qHandler.txQueues[txContextId]).to.be.null; expect(qHandler.txQueues[alternateTxContextId]).to.deep.equal(['message3', 'message4']); }); @@ -326,10 +332,10 @@ describe('Handler', () => { qHandler._sendMsg(txContextId); - expect(getCurrStub.calledOnce).to.be.ok; + expect(getCurrStub.calledOnce).to.be.true; expect(getCurrStub.firstCall.args).to.deep.equal([txContextId]); - expect(qHandler.stream.write.notCalled).to.be.ok; - expect(mockQMsg.fail.notCalled).to.be.ok; + expect(qHandler.stream.write.notCalled).to.be.true; + expect(mockQMsg.fail.notCalled).to.be.true; }); it ('should write to the stream the current message', () => { @@ -337,11 +343,11 @@ describe('Handler', () => { qHandler._sendMsg(txContextId); - expect(getCurrStub.calledOnce).to.be.ok; + expect(getCurrStub.calledOnce).to.be.true; expect(getCurrStub.firstCall.args).to.deep.equal([txContextId]); - expect(qHandler.stream.write.calledOnce).to.be.ok; + expect(qHandler.stream.write.calledOnce).to.be.true; expect(qHandler.stream.write.firstCall.args).to.deep.equal(['some message']); - expect(mockQMsg.fail.notCalled).to.be.ok; + expect(mockQMsg.fail.notCalled).to.be.true; }); it ('should call fail on the QMsg if stream write errors', () => { @@ -352,9 +358,9 @@ describe('Handler', () => { qHandler._sendMsg(txContextId); - expect(getCurrStub.calledOnce).to.be.ok; + expect(getCurrStub.calledOnce).to.be.true; expect(getCurrStub.firstCall.args).to.deep.equal([txContextId]); - expect(mockQMsg.fail.calledOnce).to.be.ok; + expect(mockQMsg.fail.calledOnce).to.be.true; expect(mockQMsg.fail.firstCall.args).to.deep.equal([err]); }); }); @@ -363,19 +369,19 @@ describe('Handler', () => { describe('ChaincodeSupportClient', () => { it ('should throw an error when chaincode not passed', () => { expect(() => { - new Handler(); + new Handler.ChaincodeSupportClient(); }).to.throw(/Missing required argument: chaincode/); }); it ('should throw an error if argument does not match chaincode format', () => { expect(() => { - new Handler({}); + new Handler.ChaincodeSupportClient({}); }).to.throw(/The chaincode argument must implement the mandatory "Init\(\)" method/); }); it ('should throw an error if argument only part matches chaincode format', () => { expect(() => { - new Handler({ + new Handler.ChaincodeSupportClient({ Init: function() {} }); }).to.throw(/The chaincode argument must implement the mandatory "Invoke\(\)" method/); @@ -383,32 +389,32 @@ describe('Handler', () => { it ('should throw an error if argument missing URL argument', () => { expect(() => { - new Handler(mockChaincodeImpl); + new Handler.ChaincodeSupportClient(mockChaincodeImpl); }).to.throw(/Invalid URL: undefined/); }); it ('should throw an error if URL argument does not use grpc as protocol', () => { expect(() => { - new Handler(mockChaincodeImpl, 'https://' + mockPeerAddress.base); + new Handler.ChaincodeSupportClient(mockChaincodeImpl, 'https://' + mockPeerAddress.base); }).to.throw(/Invalid protocol: https. {2}URLs must begin with grpc:\/\/ or grpcs:\/\//); }); it ('should set endpoint, client and default timeout', () => { const credsSpy = sinon.spy(grpc.credentials, 'createInsecure'); - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.unsecure); expect(handler._request_timeout).to.deep.equal(30000); expect(handler._endpoint.addr).to.deep.equal(mockPeerAddress.base); - expect(credsSpy.calledOnce).to.be.ok; - expect(handler._endpoint.creds.constructor.name).to.deep.equal('ChannelCredentials'); - expect(handler._client.constructor.name).to.deep.equal('ServiceClient'); + expect(credsSpy.calledOnce).to.be.true; + expect(handler._endpoint.creds.constructor.name).to.deep.equal('InsecureChannelCredentialsImpl'); + expect(handler._client.constructor.name).to.deep.equal('ServiceClientImpl'); credsSpy.restore(); }); it ('should override the default request timeout if value passed', () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure, { + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.unsecure, { 'request-timeout': 123456 }); @@ -416,7 +422,7 @@ describe('Handler', () => { }); it ('should store additional grpc options', () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure, { + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.unsecure, { 'grpc.max_send_message_length': 1, 'grpc.max_receive_message_length': 2, 'grpc.keepalive_time_ms': 3, @@ -436,30 +442,30 @@ describe('Handler', () => { }); it ('should preserve casing in handler addr', () => { - const handler = new Handler(mockChaincodeImpl, 'grpc://' + mockPeerAddress.base.toUpperCase()); + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, 'grpc://' + mockPeerAddress.base.toUpperCase()); expect(handler._endpoint.addr).to.deep.equal(mockPeerAddress.base.toUpperCase()); }); it ('should throw an error if connection secure and certificate not passed', () => { expect(() => { - new Handler(mockChaincodeImpl, mockPeerAddress.secure); + new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.secure); }).to.throw(/PEM encoded certificate is required./); }); it ('should throw an error if connection secure encoded private key not passed as opt', () => { expect(() => { - new Handler(mockChaincodeImpl, mockPeerAddress.secure, { - pem: 'dummy pem string' + new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.secure, { + pem: ca }); }).to.throw(/encoded Private key is required./); }); it ('should throw an error if connection secure encoded private key not passed as opt', () => { expect(() => { - new Handler(mockChaincodeImpl, mockPeerAddress.secure, { - pem: 'dummy pem string', - key: 'dummy key' + new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.secure, { + pem: ca, + key: key }); }).to.throw(/encoded client certificate is required./); }); @@ -467,22 +473,22 @@ describe('Handler', () => { it ('should set endpoint, client and default timeout for a secure connection', () => { const credsSpy = sinon.spy(grpc.credentials, 'createSsl'); - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.secure, mockOpts); + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.secure, mockOpts); expect(handler._options.cert).to.deep.equal(mockOpts.cert); expect(handler._request_timeout).to.deep.equal(30000); expect(handler._endpoint.addr).to.deep.equal(mockPeerAddress.base); - expect(credsSpy.calledOnce).to.be.ok; - expect(credsSpy.calledWith(Buffer.from(mockOpts.pem), Buffer.from(mockOpts.key, 'base64'), Buffer.from(mockOpts.cert, 'base64'))).to.be.ok; - expect(handler._endpoint.creds.constructor.name).to.deep.equal('ChannelCredentials'); - expect(handler._client.constructor.name).to.deep.equal('ServiceClient'); + expect(credsSpy.calledOnce).to.be.true; + expect(credsSpy.calledWith(Buffer.from(mockOpts.pem), Buffer.from(mockOpts.key, 'base64'), Buffer.from(mockOpts.cert, 'base64'))).to.be.true; + expect(handler._endpoint.creds.constructor.name).to.deep.equal('SecureChannelCredentialsImpl'); + expect(handler._client.constructor.name).to.deep.equal('ServiceClientImpl'); }); it ('should set grpc ssl options when ssl-target-name-override passed', () => { const opts = Object.assign({}, mockOpts); opts['ssl-target-name-override'] = 'dummy override'; - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.secure, opts); + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.secure, opts); expect(handler._options['grpc.ssl_target_name_override']).to.deep.equal('dummy override'); expect(handler._options['grpc.default_authority']).to.deep.equal('dummy override'); @@ -490,15 +496,51 @@ describe('Handler', () => { describe('close', () => { it ('should call end on the stream', () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.unsecure); handler._stream = {end: sinon.stub()}; handler.close(); - expect(handler._stream.end.calledOnce).to.be.ok; + expect(handler._stream.end.calledOnce).to.be.true; }); }); + describe('chat', () => { + afterEach(() => { + Handler = rewire('../../../fabric-shim/lib/handler.js'); + }); + + it ('should create an instance of ChaincodeMessageHandler and pass the argument', () => { + const mockChaincodeMessageHandler = sinon.spy(() => { + return sinon.createStubInstance(Handler.ChaincodeMessageHandler); + }); + Handler.__set__('ChaincodeMessageHandler', mockChaincodeMessageHandler); + + const mockStream = {write: sinon.stub(), on: sinon.stub()}; + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.unsecure); + handler._client.register = sinon.stub().returns(mockStream); + + handler.chat('starter message example'); + + expect(handler._client.register.calledOnce).to.be.true; + expect(mockChaincodeMessageHandler.calledWithNew()).to.be.false; + expect(handler._stream).to.deep.equal(mockStream); + expect(handler._handler).to.deep.equal(new mockChaincodeMessageHandler(mockStream, mockChaincodeImpl)); + expect(handler._handler.chat.calledOnce).to.be.true; + expect(handler._handler.chat.firstCall.args).to.deep.equal(['starter message example']); + }); + }); + + describe('toString', () => { + it ('should return ChaincodeSupportClient object as a string with the URL', () => { + const handler = new Handler.ChaincodeSupportClient(mockChaincodeImpl, mockPeerAddress.unsecure); + + expect(handler.toString()).to.deep.equal(`ChaincodeSupportClient : {url:${mockPeerAddress.unsecure}}`); + }); + }); + }); + + describe('ChaincodeMessageHandler', () => { describe('chat', () => { afterEach(() => { Handler = rewire('../../../fabric-shim/lib/handler.js'); @@ -513,17 +555,14 @@ describe('Handler', () => { const mockStream = {write: sinon.stub(), on: sinon.stub()}; - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); - handler._client.register = sinon.stub().returns(mockStream); - + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.chat('some starter message'); - expect(handler._client.register.calledOnce).to.be.ok; - expect(mockMsgQueueHandler.calledWithNew).to.been.ok; + expect(mockMsgQueueHandler.calledWithNew()).to.be.false; expect(handler._stream).to.deep.equal(mockStream); expect(handler.msgQueueHandler).to.deep.equal(new mockMsgQueueHandler(handler)); - expect(mockStream.write.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; expect(mockStream.write.firstCall.args).to.deep.equal(['some starter message']); expect(mockStream.on.callCount).to.deep.equal(3); expect(mockStream.on.firstCall.args[0]).to.deep.equal('data'); @@ -577,8 +616,7 @@ describe('Handler', () => { mockStream = {write: (sinon.stub()), on: mockEventEmitter, cancel: sinon.stub(), end: sinon.stub()}; - handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); - handler._client.register = sinon.stub().returns(mockStream); + handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.chat('some starter message'); handleInitSpy = sinon.spy(); @@ -595,8 +633,8 @@ describe('Handler', () => { eventReg.data(badRegisteredMsg); - expect(mockStream.write.calledTwice).to.be.ok; - expect(mockNewErrorMsg.calledOnce).to.be.ok; + expect(mockStream.write.calledTwice).to.be.true; + expect(mockNewErrorMsg.calledOnce).to.be.true; expect(mockStream.write.secondCall.args).to.deep.equal(['some error']); expect(mockNewErrorMsg.firstCall.args).to.deep.equal([badRegisteredMsg, 'created']); }); @@ -609,8 +647,8 @@ describe('Handler', () => { eventReg.data(registeredMsg); eventReg.data(badEstablishedMsg); - expect(mockStream.write.calledTwice).to.be.ok; - expect(mockNewErrorMsg.calledOnce).to.be.ok; + expect(mockStream.write.calledTwice).to.be.true; + expect(mockNewErrorMsg.calledOnce).to.be.true; expect(mockStream.write.secondCall.args).to.deep.equal(['some error']); expect(mockNewErrorMsg.firstCall.args).to.deep.equal([badEstablishedMsg, 'established']); }); @@ -620,11 +658,11 @@ describe('Handler', () => { eventReg.data(establishedMsg); eventReg.data(registeredMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.notCalled).to.be.ok; - expect(handleInitSpy.notCalled).to.be.ok; - expect(handleTransactionSpy.notCalled).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.notCalled).to.be.true; + expect(handleInitSpy.notCalled).to.be.true; + expect(handleTransactionSpy.notCalled).to.be.true; }); it ('should do nothing when in state ready and MSG_TYPE equals READY', () => { @@ -632,11 +670,11 @@ describe('Handler', () => { eventReg.data(establishedMsg); eventReg.data(establishedMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.notCalled).to.be.ok; - expect(handleInitSpy.notCalled).to.be.ok; - expect(handleTransactionSpy.notCalled).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.notCalled).to.be.true; + expect(handleInitSpy.notCalled).to.be.true; + expect(handleTransactionSpy.notCalled).to.be.true; }); it ('should call handleMsgResponse when in state ready and MSG_TYPE equals RESPONSE', () => { @@ -651,12 +689,12 @@ describe('Handler', () => { eventReg.data(readyMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.calledOnce).to.be.true; expect(handleMsgResponseSpy.firstCall.args).to.deep.equal([readyMsg]); - expect(handleInitSpy.notCalled).to.be.ok; - expect(handleTransactionSpy.notCalled).to.be.ok; + expect(handleInitSpy.notCalled).to.be.true; + expect(handleTransactionSpy.notCalled).to.be.true; }); it ('should call handleMsgResponse when in state ready and MSG_TYPE equals ERROR', () => { @@ -671,12 +709,12 @@ describe('Handler', () => { eventReg.data(readyMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.calledOnce).to.be.true; expect(handleMsgResponseSpy.firstCall.args).to.deep.equal([readyMsg]); - expect(handleInitSpy.notCalled).to.be.ok; - expect(handleTransactionSpy.notCalled).to.be.ok; + expect(handleInitSpy.notCalled).to.be.true; + expect(handleTransactionSpy.notCalled).to.be.true; }); it ('should call handleInit when in state ready and MSG_TYPE equals INIT', () => { @@ -690,12 +728,12 @@ describe('Handler', () => { }; eventReg.data(readyMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.notCalled).to.be.ok; - expect(handleInitSpy.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.notCalled).to.be.true; + expect(handleInitSpy.calledOnce).to.be.true; expect(handleInitSpy.firstCall.args).to.deep.equal([readyMsg]); - expect(handleTransactionSpy.notCalled).to.be.ok; + expect(handleTransactionSpy.notCalled).to.be.true; }); it ('should call handleTransaction when in state ready and MSG_TYPE equals TRANSACTION', () => { @@ -709,11 +747,11 @@ describe('Handler', () => { }; eventReg.data(readyMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.notCalled).to.be.ok; - expect(handleInitSpy.notCalled).to.be.ok; - expect(handleTransactionSpy.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.notCalled).to.be.true; + expect(handleInitSpy.notCalled).to.be.true; + expect(handleTransactionSpy.calledOnce).to.be.true; expect(handleTransactionSpy.firstCall.args).to.deep.equal([readyMsg]); }); @@ -730,12 +768,12 @@ describe('Handler', () => { }; eventReg.data(readyMsg); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockNewErrorMsg.notCalled).to.be.ok; - expect(handleMsgResponseSpy.notCalled).to.be.ok; - expect(handleInitSpy.notCalled).to.be.ok; - expect(handleTransactionSpy.notCalled).to.be.ok; - expect(processStub.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockNewErrorMsg.notCalled).to.be.true; + expect(handleMsgResponseSpy.notCalled).to.be.true; + expect(handleInitSpy.notCalled).to.be.true; + expect(handleTransactionSpy.notCalled).to.be.true; + expect(processStub.calledOnce).to.be.true; expect(processStub.firstCall.args).to.deep.equal([1]); processStub.restore(); @@ -751,14 +789,13 @@ describe('Handler', () => { const mockStream = {write: sinon.stub(), on: mockEventEmitter, cancel: sinon.stub(), end: sinon.stub()}; - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); - handler._client.register = sinon.stub().returns(mockStream); + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.chat('some starter message'); eventReg.end(); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockStream.cancel.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockStream.cancel.calledOnce).to.be.true; }); }); @@ -771,14 +808,13 @@ describe('Handler', () => { const mockStream = {write: sinon.stub(), on: mockEventEmitter, end: sinon.stub()}; - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); - handler._client.register = sinon.stub().returns(mockStream); + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.chat('some starter message'); eventReg.error({}); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockStream.end.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockStream.end.calledOnce).to.be.true; }); it ('should end the with error', () => { const eventReg = {}; @@ -788,14 +824,13 @@ describe('Handler', () => { const mockStream = {write: sinon.stub(), on: mockEventEmitter, end: sinon.stub()}; - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); - handler._client.register = sinon.stub().returns(mockStream); + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.chat('some starter message'); const error = new Error(); eventReg.error(error); - expect(mockStream.write.calledOnce).to.be.ok; - expect(mockStream.end.calledOnce).to.be.ok; + expect(mockStream.write.calledOnce).to.be.true; + expect(mockStream.end.calledOnce).to.be.true; }); }); }); @@ -807,10 +842,11 @@ describe('Handler', () => { const handleMessage = sinon.spy(); Handler.__set__('handleMessage', handleMessage); - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.handleInit('some message'); - expect(handleMessage.calledOnce).to.be.ok; + expect(handleMessage.calledOnce).to.be.true; expect(handleMessage.firstCall.args).to.deep.equal(['some message', handler, 'init']); Handler.__set__('handleMessage', savedHandleMessage); @@ -824,10 +860,11 @@ describe('Handler', () => { const handleMessage = sinon.spy(); Handler.__set__('handleMessage', handleMessage); - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.handleTransaction('some message'); - expect(handleMessage.calledOnce).to.be.ok; + expect(handleMessage.calledOnce).to.be.true; expect(handleMessage.firstCall.args).to.deep.equal(['some message', handler, 'invoke']); Handler.__set__('handleMessage', savedHandleMessage); @@ -854,7 +891,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleGetState(collection, key, 'theChannelID', 'theTxID'); @@ -866,7 +904,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleGetState(collection, key, 'theChannelID', 'theTxID'); @@ -900,7 +939,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handlePutState(collection, key, value, 'theChannelID', 'theTxID'); @@ -912,7 +952,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handlePutState(collection, key, value, 'theChannelID', 'theTxID'); @@ -945,7 +986,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleDeleteState(collection, key, 'theChannelID', 'theTxID'); @@ -957,7 +999,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen rejects', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleDeleteState(collection, key, 'theChannelID', 'theTxID'); @@ -998,7 +1041,8 @@ describe('Handler', () => { }); it('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handlePutStateMetadata(collection, key, metadataKey, ep, 'theChannelID', 'theTxID'); @@ -1010,7 +1054,8 @@ describe('Handler', () => { }); it('should reject when _askPeerAndListen rejects', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handlePutStateMetadata(collection, key, metadataKey, ep, 'theChannelID', 'theTxID'); @@ -1042,7 +1087,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleGetPrivateDataHash(collection, key, 'theChannelID', 'theTxID'); @@ -1054,7 +1100,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen rejects', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleGetPrivateDataHash(collection, key, 'theChannelID', 'theTxID'); @@ -1086,7 +1133,8 @@ describe('Handler', () => { }); it('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleGetStateMetadata(collection, key, 'theChannelID', 'theTxID'); @@ -1098,7 +1146,8 @@ describe('Handler', () => { }); it('should reject when _askPeerAndListen rejects', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleGetStateMetadata(collection, key, 'theChannelID', 'theTxID'); @@ -1131,7 +1180,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleGetStateByRange(collection, startKey, endKey, 'theChannelID', 'theTxID'); @@ -1143,7 +1193,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleGetStateByRange(collection, startKey, endKey, 'theChannelID', 'theTxID'); @@ -1155,7 +1206,8 @@ describe('Handler', () => { }); it ('should resolve with metadata when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const metadata = Buffer.from('metadata'); @@ -1194,7 +1246,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleQueryStateNext(id, 'theChannelID', 'theTxID'); @@ -1206,7 +1259,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleQueryStateNext(id, 'theChannelID', 'theTxID'); @@ -1237,7 +1291,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleQueryStateClose(id, 'theChannelID', 'theTxID'); @@ -1249,7 +1304,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleQueryStateClose(id, 'theChannelID', 'theTxID'); @@ -1281,7 +1337,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleGetQueryResult(collection, query, null, 'theChannelID', 'theTxID'); @@ -1293,7 +1350,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen rejects', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleGetQueryResult(collection, query, null, 'theChannelID', 'theTxID'); @@ -1305,7 +1363,8 @@ describe('Handler', () => { }); it ('handleGetQueryResult with metadata should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const metadata = Buffer.from('some metadata'); @@ -1344,7 +1403,8 @@ describe('Handler', () => { }); it ('should resolve when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves('some response'); const result = await handler.handleGetHistoryForKey(key, 'theChannelID', 'theTxID'); @@ -1356,7 +1416,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const result = handler.handleGetHistoryForKey(key, 'theChannelID', 'theTxID'); @@ -1397,7 +1458,8 @@ describe('Handler', () => { }); it ('should return decoded response when chaincode message type COMPLETED', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves({type: fabprotos.protos.ChaincodeMessage.Type.COMPLETED, payload: 'some payload'}); const decodeStub = sandbox.stub(fabprotos.protos.Response, 'decode').returns('some response'); @@ -1412,7 +1474,8 @@ describe('Handler', () => { }); it ('should throw an error when _askPeerAndListen resolves with an error', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves({type: fabprotos.protos.ChaincodeMessage.Type.ERROR, payload: 'some payload'}); const decodeStub = sandbox.stub(fabprotos.protos.Response, 'decode').returns('some response'); @@ -1426,7 +1489,8 @@ describe('Handler', () => { }); it ('should reject when _askPeerAndListen resolves', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').rejects(); const decodeStub = sandbox.stub(fabprotos.protos.Response, 'decode').returns('some response'); @@ -1440,7 +1504,8 @@ describe('Handler', () => { }); it ('should return nothing chaincode message type not COMPLETED or ERROR', async () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); const _askPeerAndListenStub = sandbox.stub(handler, '_askPeerAndListen').resolves({type: fabprotos.protos.ChaincodeMessage.Type.SOMETHING_ELSE, payload: 'some payload'}); const decodeStub = sandbox.stub(fabprotos.protos.Response, 'decode').returns('some response'); @@ -1459,7 +1524,8 @@ describe('Handler', () => { const msg = 'some message'; const method = 'SomeMethod'; - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); handler.msgQueueHandler = sinon.createStubInstance(MsgQueueHandler); handler.msgQueueHandler.queueMsg.callsFake((qMsg) => { @@ -1477,9 +1543,10 @@ describe('Handler', () => { describe('toString', () => { it ('should return ChaincodeSupportClient object as a string with the URL', () => { - const handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + const mockStream = {write: sinon.stub(), end: sinon.stub()}; + const handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); - expect(handler.toString()).to.deep.equal(`ChaincodeSupportClient : {url:${mockPeerAddress.unsecure}}`); + expect(handler.toString()).to.deep.equal('ChaincodeMessageHandler : {}'); }); }); }); @@ -1545,8 +1612,8 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'init'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); }); @@ -1558,8 +1625,8 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'init'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); }); @@ -1568,13 +1635,13 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'init'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler.chaincode.Init.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler.chaincode.Init.calledOnce).to.be.true; expect(mockHandler.chaincode.Init.firstCall.args[0]).to.deep.equal(mockStub); const text = '[theChannelID-aTX] Calling chaincode Init() has not called success or error.'; expectedResponse.payload = Buffer.from(text); - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0].payload.toString()).to.equal(text); expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); }); @@ -1584,12 +1651,12 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'invoke'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler.chaincode.Invoke.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler.chaincode.Invoke.calledOnce).to.be.true; expect(mockHandler.chaincode.Invoke.firstCall.args[0]).to.deep.equal(mockStub); const text = '[theChannelID-aTX] Calling chaincode Invoke() has not called success or error.'; expectedResponse.payload = Buffer.from(text); - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0].payload.toString()).to.equal(text); expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); @@ -1600,13 +1667,13 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'init'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler.chaincode.Init.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler.chaincode.Init.calledOnce).to.be.true; expect(mockHandler.chaincode.Init.firstCall.args[0]).to.deep.equal(mockStub); const text = '[theChannelID-aTX] Calling chaincode Init() has not called success or error.'; expectedResponse.payload = Buffer.from(text); - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0].payload.toString()).to.equal(text); expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); @@ -1617,13 +1684,13 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'invoke'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler.chaincode.Invoke.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler.chaincode.Invoke.calledOnce).to.be.true; expect(mockHandler.chaincode.Invoke.firstCall.args[0]).to.deep.equal(mockStub); const text = '[theChannelID-aTX] Calling chaincode Invoke() has not called success or error.'; expectedResponse.payload = Buffer.from(text); - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); expect(mockHandler._stream.write.firstCall.args[0].payload.toString()).to.equal(text); }); @@ -1647,10 +1714,10 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'init'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler.chaincode.Init.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler.chaincode.Init.calledOnce).to.be.true; expect(mockHandler.chaincode.Init.firstCall.args[0]).to.deep.equal(mockStub); - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); }); @@ -1659,10 +1726,10 @@ describe('Handler', () => { await handleMessage(msg, mockHandler, 'invoke'); - expect(decodeStub.calledOnce).to.be.ok; - expect(mockHandler.chaincode.Invoke.calledOnce).to.be.ok; + expect(decodeStub.calledOnce).to.be.true; + expect(mockHandler.chaincode.Invoke.calledOnce).to.be.true; expect(mockHandler.chaincode.Invoke.firstCall.args[0]).to.deep.equal(mockStub); - expect(mockHandler._stream.write.calledOnce).to.be.ok; + expect(mockHandler._stream.write.calledOnce).to.be.true; expect(mockHandler._stream.write.firstCall.args[0]).to.deep.equal(expectedResponse); }); }); @@ -1680,7 +1747,7 @@ describe('Handler', () => { const createStub = Handler.__get__('createStub'); createStub({}, 'channelID', 'txID', 'some input', 'some proposal'); - expect(mockStub.calledWithNew).to.be.ok; + expect(mockStub.calledWithNew()).to.be.false; expect(mockStub.firstCall.args[0]).to.deep.equal({}); expect(mockStub.firstCall.args[1]).to.deep.equal('channelID'); expect(mockStub.firstCall.args[2]).to.deep.equal('txID'); @@ -1759,6 +1826,7 @@ describe('Handler', () => { let saveStateQueryIterator; let saveHistoryQueryIterator; + let mockStream; before(() => { saveStateQueryIterator = Handler.__get__('StateQueryIterator'); @@ -1781,7 +1849,8 @@ describe('Handler', () => { txid: 'aTx' }; - handler = new Handler(mockChaincodeImpl, mockPeerAddress.unsecure); + mockStream = {write: sinon.stub(), end: sinon.stub()}; + handler = new Handler.ChaincodeMessageHandler(mockStream, mockChaincodeImpl); }); after(() => { @@ -1851,7 +1920,7 @@ describe('Handler', () => { parseResponse(handler, res, 'GetStateByRange'); - expect(mockStateQueryIterator.calledWithNew).to.be.ok; + expect(mockStateQueryIterator.calledWithNew()).to.be.false; expect(mockStateQueryIterator.firstCall.args).to.deep.equal([handler, res.channel_id, res.txid, qrDecodedPayload]); }); @@ -1869,7 +1938,7 @@ describe('Handler', () => { const result = parseResponse(handler, res, 'GetStateByRange'); - expect(mockStateQueryIterator.calledWithNew).to.be.ok; + expect(mockStateQueryIterator.calledWithNew()).to.be.false; expect(mockStateQueryIterator.firstCall.args).to.deep.equal([handler, res.channel_id, res.txid, pagedQrPayload]); expect(result.metadata).to.eql(mdDecodedPayload); @@ -1884,7 +1953,7 @@ describe('Handler', () => { parseResponse(handler, res, 'GetQueryResult'); - expect(mockStateQueryIterator.calledWithNew).to.be.ok; + expect(mockStateQueryIterator.calledWithNew()).to.be.false; expect(mockStateQueryIterator.firstCall.args).to.deep.equal([handler, res.channel_id, res.txid, qrDecodedPayload]); }); @@ -1896,7 +1965,7 @@ describe('Handler', () => { parseResponse(handler, res, 'GetHistoryForKey'); - expect(mockHistoryQueryIterator.calledWithNew).to.be.ok; + expect(mockHistoryQueryIterator.calledWithNew()).to.be.false; expect(mockHistoryQueryIterator.firstCall.args).to.deep.equal([handler, res.channel_id, res.txid, qrDecodedPayload]); }); diff --git a/libraries/fabric-shim/test/unit/iterators.js b/libraries/fabric-shim/test/unit/iterators.js index 3150c578..4c3b768f 100644 --- a/libraries/fabric-shim/test/unit/iterators.js +++ b/libraries/fabric-shim/test/unit/iterators.js @@ -14,7 +14,7 @@ const rewire = require('rewire'); const Iterator = rewire('../../../fabric-shim/lib/iterators.js'); const StateQueryIterator = Iterator.StateQueryIterator; const HistoryQueryIterator = Iterator.HistoryQueryIterator; -const handler = require('../../../fabric-shim/lib/handler.js'); +const {ChaincodeMessageHandler} = require('../../../fabric-shim/lib/handler.js'); const fabprotos = require('../../bundle'); const channel_id = 'theChannelId'; @@ -26,7 +26,7 @@ describe('Iterator', () => { let sandbox; beforeEach(() => { sandbox = sinon.createSandbox(); - mockHandler = sandbox.createStubInstance(handler); + mockHandler = sandbox.createStubInstance(ChaincodeMessageHandler); mockResponse = {}; }); @@ -107,9 +107,9 @@ describe('Iterator', () => { getResultFromBytesStub.restore(); }); - it ('should return value of first element of results converted from bytes and done false when has_more false and results has no more elements after currentLoc', () => { + it ('should return value of first element of results converted from bytes and done false when hasMore false and results has no more elements after currentLoc', () => { mockResponse.results = ['some result bytes']; - mockResponse.has_more = false; + mockResponse.hasMore = false; const result = ci._createAndEmitResult(); @@ -121,9 +121,9 @@ describe('Iterator', () => { }); }); - it ('should return value of first element of results converted from bytes and done false when has_more true and results has no more elements after currentLoc', () => { + it ('should return value of first element of results converted from bytes and done false when hasMore true and results has no more elements after currentLoc', () => { mockResponse.results = ['some result bytes']; - mockResponse.has_more = true; + mockResponse.hasMore = true; const result = ci._createAndEmitResult(); @@ -136,9 +136,9 @@ describe('Iterator', () => { }); }); - it ('should return value of first element of results converted from bytes and done false when has_more false and results has elements after currentLoc', () => { + it ('should return value of first element of results converted from bytes and done false when hasMore false and results has elements after currentLoc', () => { mockResponse.results = ['some result bytes', 'some more result bytes']; - mockResponse.has_more = false; + mockResponse.hasMore = false; const result = ci._createAndEmitResult(); @@ -151,9 +151,9 @@ describe('Iterator', () => { }); }); - it ('should return value of first element of results converted from bytes and done false when has_more true and results has elements after currentLoc', () => { + it ('should return value of first element of results converted from bytes and done false when hasMore true and results has elements after currentLoc', () => { mockResponse.results = ['some result bytes', 'some more result bytes']; - mockResponse.has_more = true; + mockResponse.hasMore = true; const result = ci._createAndEmitResult(); @@ -168,7 +168,7 @@ describe('Iterator', () => { it ('should return as expected with non-zero currentLoc', () => { mockResponse.results = ['some result bytes', 'some more result bytes']; - mockResponse.has_more = true; + mockResponse.hasMore = true; ci.currentLoc = 1; @@ -185,7 +185,7 @@ describe('Iterator', () => { it ('should return value of first element of results converted from bytes and done false', () => { mockResponse.results = ['some result bytes', 'some more result bytes']; - mockResponse.has_more = false; + mockResponse.hasMore = false; const expectedResult = { value: 'some result', @@ -222,13 +222,13 @@ describe('Iterator', () => { expect(result).to.deep.equal('some result'); }); - it ('should return _createAndEmitResult when response has_more and no error occurs', async () => { + it ('should return _createAndEmitResult when response hasMore and no error occurs', async () => { mockResponse.results = []; - mockResponse.has_more = true; + mockResponse.hasMore = true; const nextResponse = { results: ['some result bytes', 'some more result bytes'], - has_more: false + hasMore: false }; mockHandler.handleQueryStateNext = sinon.stub().resolves(nextResponse); @@ -242,36 +242,9 @@ describe('Iterator', () => { expect(ci.response).to.deep.equal(nextResponse); }); - /* - it ('should emit an error if error occurs when has_more and listenerCount for data > 0', async () => { + it ('should throw an error if error occurs when hasMore and listenerCount for data = 0', async () => { mockResponse.results = []; - mockResponse.has_more = true; - - const err = new Error('some error'); - - mockHandler.handleQueryStateNext = sinon.stub().rejects(err); - const emitStub = sinon.stub(ci, 'emit'); - const listenerCountStub = sinon.stub(ci, 'listenerCount').returns(1); - - ci.currentLoc = 1; - - const result = await ci.next(); - - expect(result).to.be.undefined; - expect(createAndEmitResultStub.notCalled).to.be.ok; - expect(listenerCountStub.calledOnce).to.be.ok; - expect(listenerCountStub.firstCall.args).to.deep.equal(['data']); - expect(emitStub.calledOnce).to.be.ok; - expect(emitStub.firstCall.args).to.deep.equal(['error', ci, err]); - - listenerCountStub.restore(); - emitStub.restore(); - }); - */ - - it ('should throw an error if error occurs when has_more and listenerCount for data = 0', async () => { - mockResponse.results = []; - mockResponse.has_more = true; + mockResponse.hasMore = true; const err = new Error('some error'); @@ -285,9 +258,9 @@ describe('Iterator', () => { expect(createAndEmitResultStub.notCalled).to.be.true; }); - it ('should return done if response does not has_more and listenerCount for end > 0', async () => { + it ('should return done if response does not hasMore and listenerCount for end > 0', async () => { mockResponse.results = []; - mockResponse.has_more = false; + mockResponse.hasMore = false; const result = await ci.next(); @@ -295,9 +268,9 @@ describe('Iterator', () => { expect(createAndEmitResultStub.notCalled).to.be.true; }); - it ('should return done if response does not has_more and listenerCount for end = 0', async () => { + it ('should return done if response does not hasMore and listenerCount for end = 0', async () => { mockResponse.results = []; - mockResponse.has_more = false; + mockResponse.hasMore = false; const result = await ci.next(); diff --git a/libraries/fabric-shim/test/unit/server.js b/libraries/fabric-shim/test/unit/server.js new file mode 100644 index 00000000..9f651efd --- /dev/null +++ b/libraries/fabric-shim/test/unit/server.js @@ -0,0 +1,215 @@ +/* +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ +/* global describe it beforeEach afterEach before after */ +'use strict'; + +const sinon = require('sinon'); +const chai = require('chai'); +chai.use(require('chai-as-promised')); +const expect = chai.expect; +const fs = require('fs'); +const path = require('path'); +const rewire = require('rewire'); + +const fabprotos = require('../../bundle'); +const grpc = require('@grpc/grpc-js'); + +const serverPath = '../../lib/server'; +let ChaincodeServer = rewire(serverPath); + +const mockChaincode = {Init: () => {}, Invoke: () => {}}; + +describe('ChaincodeServer', () => { + const tlsKey = Buffer.from(fs.readFileSync(path.join(__dirname, 'test-key.pem')).toString(), 'base64'); + const tlsCert = Buffer.from(fs.readFileSync(path.join(__dirname, 'test-cert.pem')).toString(), 'base64'); + const tlsClientCA = fs.readFileSync(path.join(__dirname, 'test-ca.pem')); + + let grpcServerStub; + const serverOpts = { + ccid: 'example-chaincode-id', + address: '0.0.0.0:9999' + }; + const serverTLSOpts = { + ccid: 'example-chaincode-id', + address: '0.0.0.0:9999', + tlsProps: { + // test-cert.pem and test-key.pem are base64-encoded and need to decode to make Buffer + key: tlsKey, + cert: tlsCert + } + }; + const serverMutualTLSOpts = { + ccid: 'example-chaincode-id', + address: '0.0.0.0:9999', + tlsProps: { + key: tlsKey, + cert: tlsCert, + clientCACerts: tlsClientCA + } + }; + const mockCredentials = {type: 'insecure'}; + const mockTLSCredentials = {type: 'secure'}; + let insecureCredentialsStub; + let sslCredentialsStub; + + let mockGrpcServerInstance; + + beforeEach(() => { + mockGrpcServerInstance = { + addService: sinon.stub() + }; + + grpcServerStub = sinon.stub(grpc, 'Server').returns(mockGrpcServerInstance); + insecureCredentialsStub = sinon.stub(grpc.ServerCredentials, 'createInsecure').returns(mockCredentials); + sslCredentialsStub = sinon.stub(grpc.ServerCredentials, 'createSsl').returns(mockTLSCredentials); + }); + afterEach(() => { + grpcServerStub.restore(); + insecureCredentialsStub.restore(); + sslCredentialsStub.restore(); + }); + + describe('constructor', () => { + it('should create a gRPC server instance and call addService in the constructor', () => { + const server = new ChaincodeServer(mockChaincode, serverOpts); + + expect(server._chaincode).to.deep.equal(mockChaincode); + expect(server._serverOpts).to.deep.equal(serverOpts); + expect(server._credentials).to.deep.equal(mockCredentials); + + expect(insecureCredentialsStub.calledOnce).to.be.true; + }); + it('should create a gRPC server instance with TLS credentials and call addService in the constructor', () => { + const server = new ChaincodeServer(mockChaincode, serverTLSOpts); + + expect(server._chaincode).to.deep.equal(mockChaincode); + expect(server._serverOpts).to.deep.equal(serverTLSOpts); + expect(server._credentials).to.deep.equal(mockTLSCredentials); + + expect(sslCredentialsStub.calledOnce).to.be.true; + expect(sslCredentialsStub.firstCall.args[0]).to.be.null; + expect(sslCredentialsStub.firstCall.args[1]).to.deep.equal([{ + private_key: tlsKey, + cert_chain: tlsCert + }]); + expect(sslCredentialsStub.firstCall.args[2]).to.be.false; + }); + it('should create a gRPC server instance with mutual TLS credentials and call addService in the constructor', () => { + const server = new ChaincodeServer(mockChaincode, serverMutualTLSOpts); + + expect(server._chaincode).to.deep.equal(mockChaincode); + expect(server._serverOpts).to.deep.equal(serverMutualTLSOpts); + expect(server._credentials).to.deep.equal(mockTLSCredentials); + + expect(sslCredentialsStub.calledOnce).to.be.true; + expect(sslCredentialsStub.firstCall.args[0]).to.deep.equal(tlsClientCA); + expect(sslCredentialsStub.firstCall.args[1]).to.deep.equal([{ + private_key: tlsKey, + cert_chain: tlsCert, + }]); + expect(sslCredentialsStub.firstCall.args[2]).to.be.true; + }); + + it('should throw an error when chaincode is missing', () => { + expect(() => new ChaincodeServer(null, serverOpts)).to.throw('Missing required argument: chaincode'); + }); + it('should throw an error when chaincode implements only Invoke', () => { + expect(() => new ChaincodeServer({Invoke: sinon.stub()}, serverOpts)) + .to.throw('The "chaincode" argument must implement Init() and Invoke() methods'); + }); + it('should throw an error when chaincode implements only Init', () => { + expect(() => new ChaincodeServer({Init: sinon.stub()}, serverOpts)) + .to.throw('The "chaincode" argument must implement Init() and Invoke() methods'); + }); + it('should throw an error when serverOpts is missing', () => { + expect(() => new ChaincodeServer(mockChaincode)).to.throw('Missing required argument: serverOpts'); + }); + it('should throw an error when serverOpts.ccid is missing', () => { + expect(() => new ChaincodeServer(mockChaincode, {})).to.throw('Missing required property in serverOpts: ccid'); + }); + it('should throw an error when serverOpts.address is missing', () => { + expect(() => new ChaincodeServer(mockChaincode, {ccid: 'some id'})).to.throw('Missing required property in serverOpts: address'); + }); + it('should throw an error when serverOpts.tlsProps.key is missing', () => { + expect(() => new ChaincodeServer(mockChaincode, {ccid: 'some id', address: '0.0.0.0:9999', tlsProps: {}})). + to.throw('Missing required property in serverOpts.tlsProps: key'); + }); + it('should throw an error when serverOpts.tlsProps.cert is missing', () => { + expect(() => new ChaincodeServer(mockChaincode, {ccid: 'some id', address: '0.0.0.0:9999', tlsProps: {key: Buffer.from('a')}})). + to.throw('Missing required property in serverOpts.tlsProps: cert'); + }); + }); + + describe('start()', () => { + it('should call bindAsync and start', async () => { + const server = new ChaincodeServer(mockChaincode, serverOpts); + + server._server = { + bindAsync: sinon.stub().callsFake((address, credentials, callback) => { + callback(null, 9999); + }), + start: sinon.stub() + }; + + expect(await server.start()).not.to.throw; + expect(server._server.bindAsync.calledOnce).to.be.true; + expect(server._server.bindAsync.firstCall.args[0]).to.equal(serverOpts.address); + expect(server._server.bindAsync.firstCall.args[1]).to.equal(mockCredentials); + expect(server._server.start.calledOnce).to.be.true; + }); + + it('should throw if bindAsync fails', async () => { + const server = new ChaincodeServer(mockChaincode, serverOpts); + + server._server = { + bindAsync: sinon.stub().callsFake((address, credentials, callback) => { + callback('failed to bind', 9999); + }), + start: sinon.stub() + }; + expect(server.start()).to.eventually.be.rejectedWith('failed to bind'); + }); + }); + + describe('connect()', () => { + it('should call connect', () => { + const mockHandler = { + chat: sinon.stub() + }; + const mockHandlerStub = sinon.stub().returns(mockHandler); + ChaincodeServer.__set__('ChaincodeMessageHandler', mockHandlerStub); + + const server = new ChaincodeServer(mockChaincode, serverOpts); + const mockStream = {on: sinon.stub(), write: sinon.stub()}; + + server.connect(mockStream); + + expect(mockHandlerStub.calledOnce).to.be.true; + expect(mockHandler.chat.calledOnce).to.be.true; + expect(mockHandler.chat.firstCall.args).to.deep.equal([{ + type: fabprotos.protos.ChaincodeMessage.Type.REGISTER, + payload: fabprotos.protos.ChaincodeID.encode({ + name: 'example-chaincode-id' + }).finish() + }]); + }); + + it('should not throw even if chat fails', () => { + const mockHandler = { + chat: sinon.stub().throws(new Error('Some error from chat')) + }; + const mockHandlerStub = sinon.stub().returns(mockHandler); + ChaincodeServer.__set__('ChaincodeMessageHandler', mockHandlerStub); + + const server = new ChaincodeServer(mockChaincode, serverOpts); + const mockStream = {on: sinon.stub(), write: sinon.stub()}; + + server.connect(mockStream); + expect(mockHandlerStub.calledOnce).to.be.true; + expect(mockHandler.chat.calledOnce).to.be.true; + }); + }); +}); diff --git a/libraries/fabric-shim/test/unit/stub.js b/libraries/fabric-shim/test/unit/stub.js index d6e745a0..bbe96ac4 100644 --- a/libraries/fabric-shim/test/unit/stub.js +++ b/libraries/fabric-shim/test/unit/stub.js @@ -414,17 +414,17 @@ describe('Stub', () => { }); expect(stub.binding).to.deep.equal('some proposal binding'); - expect(_proposalProtoProposalDecodeStub.calledOnce).to.be.ok; + expect(_proposalProtoProposalDecodeStub.calledOnce).to.be.true; expect(_proposalProtoProposalDecodeStub.firstCall.args).to.deep.equal(['some bytes']); - expect(_commonProtoHeaderDecodeStub.calledOnce).to.be.ok; + expect(_commonProtoHeaderDecodeStub.calledOnce).to.be.true; expect(_commonProtoHeaderDecodeStub.firstCall.args).to.deep.equal([decodedProposal.header]); - expect(_commonProtoSignatureHeaderDecodeStub.calledOnce).to.be.ok; + expect(_commonProtoSignatureHeaderDecodeStub.calledOnce).to.be.true; expect(_commonProtoSignatureHeaderDecodeStub.firstCall.args).to.deep.equal([decodedHeader.signatureHeader]); - expect(_idProtoSerializedIdentityDecodeStub.calledOnce).to.be.ok; + expect(_idProtoSerializedIdentityDecodeStub.calledOnce).to.be.true; expect(_idProtoSerializedIdentityDecodeStub.firstCall.args).to.deep.equal([decodedSigHeader.creator]); - expect(_commonProtoChannelHeaderDecodeStub.calledOnce).to.be.ok; + expect(_commonProtoChannelHeaderDecodeStub.calledOnce).to.be.true; expect(_commonProtoChannelHeaderDecodeStub.firstCall.args).to.deep.equal([decodedHeader.channelHeader]); - expect(_proposalProtoChaincodeProposalPayloadDecodeStub.calledOnce).to.be.ok; + expect(_proposalProtoChaincodeProposalPayloadDecodeStub.calledOnce).to.be.true; expect(_proposalProtoChaincodeProposalPayloadDecodeStub.firstCall.args).to.deep.equal([decodedProposal.payload]); Stub.__set__('computeProposalBinding', saveComputeProposalBinding); @@ -527,6 +527,43 @@ describe('Stub', () => { }); }); + describe('getMspID', () => { + let mspID; + + beforeEach(() => { + if ('CORE_PEER_LOCALMSPID' in process.env) { + mspID = process.env.CORE_PEER_LOCALMSPID; + } + }); + + afterEach(() => { + delete process.env.CORE_PEER_LOCALMSPID; + if (mspID) { + process.env.CORE_PEER_LOCALMSPID = mspID; + } + }); + + it ('should return MSPID', () => { + process.env.CORE_PEER_LOCALMSPID = 'some MSPID'; + + const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', { + args: [] + }); + + expect(stub.getMspID()).to.deep.equal('some MSPID'); + }); + + it ('should throw Error if MSPID is not available', () => { + const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', { + args: [] + }); + + expect(() => { + stub.getMspID() + }).to.throw('CORE_PEER_LOCALMSPID is unset in chaincode process'); + }); + }); + describe('getTransient', () => { it ('should return transient map', () => { const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', { @@ -563,6 +600,17 @@ describe('Stub', () => { }); }); + describe('getDateTimestamp', () => { + it ('should return transaction date as Node.js Date object', () => { + const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', { + args: [] + }); + stub.txTimestamp = {seconds: 1606233385, nanos: 54000000}; + + expect(stub.getDateTimestamp()).to.deep.equal(new Date(1606233385054)); + }); + }); + describe('getBinding', () => { it ('should return binding', () => { const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', { @@ -588,7 +636,7 @@ describe('Stub', () => { const result = await stub.getState('a key'); expect(result).to.deep.equal('some state'); - expect(handleGetStateStub.calledOnce).to.be.ok; + expect(handleGetStateStub.calledOnce).to.be.true; expect(handleGetStateStub.firstCall.args).to.deep.equal(['', 'a key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -606,7 +654,7 @@ describe('Stub', () => { const result = await stub.putState('a key', 'a value'); expect(result).to.deep.equal('some state'); - expect(handlePutStateStub.calledOnce).to.be.ok; + expect(handlePutStateStub.calledOnce).to.be.true; expect(handlePutStateStub.firstCall.args).to.deep.equal(['', 'a key', Buffer.from('a value'), 'dummyChannelId', 'dummyTxid']); }); it ('should return handler.handlePutState', async () => { @@ -621,7 +669,7 @@ describe('Stub', () => { const result = await stub.putState('a key', {a:'value'}); expect(result).to.deep.equal('some state'); - expect(handlePutStateStub.calledOnce).to.be.ok; + expect(handlePutStateStub.calledOnce).to.be.true; expect(handlePutStateStub.firstCall.args).to.deep.equal(['', 'a key', {a:'value'}, 'dummyChannelId', 'dummyTxid']); }); }); @@ -639,7 +687,7 @@ describe('Stub', () => { const result = await stub.deleteState('a key'); expect(result).to.deep.equal('some state'); - expect(handleDeleteStateStub.calledOnce).to.be.ok; + expect(handleDeleteStateStub.calledOnce).to.be.true; expect(handleDeleteStateStub.firstCall.args).to.deep.equal(['', 'a key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -689,7 +737,7 @@ describe('Stub', () => { const result = await stub.getStateByRange('start key', 'end key'); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; expect(handleGetStateByRangeStub.firstCall.args).to.deep.equal(['', 'start key', 'end key', 'dummyChannelId', 'dummyTxid']); }); @@ -707,7 +755,7 @@ describe('Stub', () => { const result = await stub.getStateByRange(null, 'end key'); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; expect(handleGetStateByRangeStub.firstCall.args).to.deep.equal(['', EMPTY_KEY_SUBSTITUTE, 'end key', 'dummyChannelId', 'dummyTxid']); }); @@ -760,7 +808,7 @@ describe('Stub', () => { const result = await stub.getStateByRangeWithPagination(null, 'end key', 3); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; const metadataBuffer = fabprotos.protos.QueryResponseMetadata.encode({ bookmark: '', fetchedRecordsCount: 3 @@ -780,7 +828,7 @@ describe('Stub', () => { const result = await stub.getStateByRangeWithPagination('start key', 'end key', 3); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; const metadataBuffer = fabprotos.protos.QueryResponseMetadata.encode({ bookmark: '', fetchedRecordsCount: 3 @@ -800,7 +848,7 @@ describe('Stub', () => { const result = await stub.getStateByRangeWithPagination('start key', 'end key', 3, 'a bookmark'); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; const metadataBuffer = fabprotos.protos.QueryResponseMetadata.encode({ bookmark: 'a bookmark', fetchedRecordsCount: 3 @@ -822,7 +870,7 @@ describe('Stub', () => { const result = await stub.getQueryResult('a query'); expect(result).to.deep.equal('some query result'); - expect(handleGetQueryResultStub.calledOnce).to.be.ok; + expect(handleGetQueryResultStub.calledOnce).to.be.true; expect(handleGetQueryResultStub.firstCall.args).to.deep.equal(['', 'a query', null, 'dummyChannelId', 'dummyTxid']); }); }); @@ -840,7 +888,7 @@ describe('Stub', () => { const result = await stub.getQueryResultWithPagination('a query', 3); expect(result).to.deep.equal('some query result'); - expect(handleGetQueryResultStub.calledOnce).to.be.ok; + expect(handleGetQueryResultStub.calledOnce).to.be.true; const metadata = handleGetQueryResultStub.firstCall.args[2]; const decoded = fabprotos.protos.QueryMetadata.decode(metadata); expect(decoded.pageSize).to.equal(3); @@ -859,7 +907,7 @@ describe('Stub', () => { const result = await stub.getQueryResultWithPagination('a query', 3, 'a bookmark'); expect(result).to.deep.equal('some query result'); - expect(handleGetQueryResultStub.calledOnce).to.be.ok; + expect(handleGetQueryResultStub.calledOnce).to.be.true; const metadata = handleGetQueryResultStub.firstCall.args[2]; const decoded = fabprotos.protos.QueryMetadata.decode(metadata); expect(decoded.pageSize).to.equal(3); @@ -880,7 +928,7 @@ describe('Stub', () => { const result = await stub.getHistoryForKey('a key'); expect(result).to.deep.equal('some history'); - expect(handleGetHistoryForKeyStub.calledOnce).to.be.ok; + expect(handleGetHistoryForKeyStub.calledOnce).to.be.true; expect(handleGetHistoryForKeyStub.firstCall.args).to.deep.equal(['a key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -903,7 +951,7 @@ describe('Stub', () => { const result = await stub.invokeChaincode('chaincodeName', ['some', 'args'], 'someChannel'); expect(result).to.deep.equal('invoked'); - expect(handleInvokeChaincodeStub.calledOnce).to.be.ok; + expect(handleInvokeChaincodeStub.calledOnce).to.be.true; expect(handleInvokeChaincodeStub.firstCall.args).to.deep.equal(['chaincodeName/someChannel', ['some', 'args'], 'dummyChannelId', 'dummyTxid']); }); @@ -911,7 +959,7 @@ describe('Stub', () => { const result = await stub.invokeChaincode('chaincodeName', ['some', 'args']); expect(result).to.deep.equal('invoked'); - expect(handleInvokeChaincodeStub.calledOnce).to.be.ok; + expect(handleInvokeChaincodeStub.calledOnce).to.be.true; expect(handleInvokeChaincodeStub.firstCall.args).to.deep.equal(['chaincodeName', ['some', 'args'], 'dummyChannelId', 'dummyTxid']); }); }); @@ -966,7 +1014,7 @@ describe('Stub', () => { expect(() => { stub.createCompositeKey('some type', 'some attributes'); }).to.throw(/attributes must be an array/); - expect(mockValidate.calledOnce).to.be.ok; + expect(mockValidate.calledOnce).to.be.true; expect(mockValidate.firstCall.args).to.deep.equal(['some type']); }); @@ -977,7 +1025,7 @@ describe('Stub', () => { const result = stub.createCompositeKey('some type', ['attr1', 'attr2']); expect(result).to.deep.equal(`${COMPOSITEKEY_NS}some type${MIN_UNICODE_RUNE_VALUE}attr1${MIN_UNICODE_RUNE_VALUE}attr2${MIN_UNICODE_RUNE_VALUE}`); - expect(mockValidate.calledThrice).to.be.ok; + expect(mockValidate.calledThrice).to.be.true; expect(mockValidate.firstCall.args).to.deep.equal(['some type']); expect(mockValidate.secondCall.args).to.deep.equal(['attr1']); expect(mockValidate.thirdCall.args).to.deep.equal(['attr2']); @@ -1033,9 +1081,9 @@ describe('Stub', () => { const result = await stub.getStateByPartialCompositeKey('some type', ['attr1', 'attr2']); expect(result).to.deep.equal('some state'); - expect(createCompositeKeyStub.calledOnce).to.be.ok; + expect(createCompositeKeyStub.calledOnce).to.be.true; expect(createCompositeKeyStub.firstCall.args).to.deep.equal(['some type', ['attr1', 'attr2']]); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; expect(handleGetStateByRangeStub.firstCall.args).to.deep.equal(['', 'some composite key', `some composite key${MAX_UNICODE_RUNE_VALUE}`, 'dummyChannelId', 'dummyTxid']); }); }); @@ -1060,9 +1108,9 @@ describe('Stub', () => { const result = await stub.getStateByPartialCompositeKeyWithPagination('some type', ['attr1', 'attr2'], 3); expect(result).to.deep.equal(response); - expect(createCompositeKeyStub.calledOnce).to.be.ok; + expect(createCompositeKeyStub.calledOnce).to.be.true; expect(createCompositeKeyStub.firstCall.args).to.deep.equal(['some type', ['attr1', 'attr2']]); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; const metadata = handleGetStateByRangeStub.firstCall.args[5]; const decoded = fabprotos.protos.QueryMetadata.decode(metadata); expect(decoded.pageSize).to.equal(3); @@ -1079,9 +1127,9 @@ describe('Stub', () => { const createCompositeKeyStub = sinon.stub(stub, 'createCompositeKey').returns('some composite key'); const result = await stub.getStateByPartialCompositeKeyWithPagination('some type', ['attr1', 'attr2'], 23, 'a bookmark'); expect(result).to.deep.equal(response); - expect(createCompositeKeyStub.calledOnce).to.be.ok; + expect(createCompositeKeyStub.calledOnce).to.be.true; expect(createCompositeKeyStub.firstCall.args).to.deep.equal(['some type', ['attr1', 'attr2']]); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; const metadata = handleGetStateByRangeStub.firstCall.args[5]; const decoded = fabprotos.protos.QueryMetadata.decode(metadata); expect(decoded.pageSize).to.equal(23); @@ -1121,7 +1169,7 @@ describe('Stub', () => { const result = await stub.getPrivateData('some collection', 'some key'); expect(result).to.deep.equal('some state'); - expect(handleGetStateStub.calledOnce).to.be.ok; + expect(handleGetStateStub.calledOnce).to.be.true; expect(handleGetStateStub.firstCall.args).to.deep.equal(['some collection', 'some key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -1158,7 +1206,7 @@ describe('Stub', () => { const result = await stub.getPrivateDataHash('some collection', 'some key'); expect(result).to.deep.equal('some state'); - expect(handleGetPrivateDataHashStub.calledOnce).to.be.ok; + expect(handleGetPrivateDataHashStub.calledOnce).to.be.true; expect(handleGetPrivateDataHashStub.firstCall.args).to.deep.equal(['some collection', 'some key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -1204,7 +1252,7 @@ describe('Stub', () => { it ('should return handler.handlePutState with string', async () => { const result = await stub.putPrivateData('some collection', 'some key', 'some value'); expect(result).to.deep.equal('some state'); - expect(handlePutStateStub.calledOnce).to.be.ok; + expect(handlePutStateStub.calledOnce).to.be.true; expect(handlePutStateStub.firstCall.args).to.deep.equal(['some collection', 'some key', Buffer.from('some value'), 'dummyChannelId', 'dummyTxid']); }); @@ -1212,7 +1260,7 @@ describe('Stub', () => { const result = await stub.putPrivateData('some collection', 'some key', {some :'value'}); expect(result).to.deep.equal('some state'); - expect(handlePutStateStub.calledOnce).to.be.ok; + expect(handlePutStateStub.calledOnce).to.be.true; expect(handlePutStateStub.firstCall.args).to.deep.equal(['some collection', 'some key', {some :'value'}, 'dummyChannelId', 'dummyTxid']); }); }); @@ -1249,7 +1297,7 @@ describe('Stub', () => { const result = await stub.deletePrivateData('some collection', 'some key'); expect(result).to.deep.equal('some state'); - expect(handleDeleteStateStub.calledOnce).to.be.ok; + expect(handleDeleteStateStub.calledOnce).to.be.true; expect(handleDeleteStateStub.firstCall.args).to.deep.equal(['some collection', 'some key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -1325,7 +1373,7 @@ describe('Stub', () => { const result = await stub.getPrivateDataByRange('some collection', null, 'some end key'); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; expect(handleGetStateByRangeStub.firstCall.args).to.deep.equal(['some collection', EMPTY_KEY_SUBSTITUTE, 'some end key', 'dummyChannelId', 'dummyTxid']); }); @@ -1333,7 +1381,7 @@ describe('Stub', () => { const result = await stub.getPrivateDataByRange('some collection', 'some start key', 'some end key'); expect(result).to.deep.equal('some state'); - expect(handleGetStateByRangeStub.calledOnce).to.be.ok; + expect(handleGetStateByRangeStub.calledOnce).to.be.true; expect(handleGetStateByRangeStub.firstCall.args).to.deep.equal(['some collection', 'some start key', 'some end key', 'dummyChannelId', 'dummyTxid']); }); }); @@ -1376,9 +1424,9 @@ describe('Stub', () => { const result = await stub.getPrivateDataByPartialCompositeKey('some collection', 'some type', ['arg1', 'arg2']); expect(result).to.deep.equal('some data by range'); - expect(createCompositeKeyStub.calledOnce).to.be.ok; + expect(createCompositeKeyStub.calledOnce).to.be.true; expect(createCompositeKeyStub.firstCall.args).to.deep.equal(['some type', ['arg1', 'arg2']]); - expect(getPrivateDataByRangeStub.calledOnce).to.be.ok; + expect(getPrivateDataByRangeStub.calledOnce).to.be.true; expect(getPrivateDataByRangeStub.firstCall.args).to.deep.equal(['some collection', 'some composite key', `some composite key${MAX_UNICODE_RUNE_VALUE}`]); }); }); @@ -1415,7 +1463,7 @@ describe('Stub', () => { const result = await stub.getPrivateDataQueryResult('some collection', 'some query'); expect(result).to.deep.equal('some query result'); - expect(handleGetQueryResultStub.calledOnce).to.be.ok; + expect(handleGetQueryResultStub.calledOnce).to.be.true; expect(handleGetQueryResultStub.firstCall.args).to.deep.equal(['some collection', 'some query', null, 'dummyChannelId', 'dummyTxid']); }); }); diff --git a/libraries/fabric-shim/test/unit/test-ca.base64 b/libraries/fabric-shim/test/unit/test-ca.base64 new file mode 100644 index 00000000..fc88d63f --- /dev/null +++ b/libraries/fabric-shim/test/unit/test-ca.base64 @@ -0,0 +1,11 @@ +LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrekNCOVFJSkFKMFo4akZpUFBpOU1Bb0dD +Q3FHU000OUJBTUNNQTR4RERBS0JnTlZCQU1NQTNSc2N6QWUKRncweU1EQTFNRGN4TmpNME1qRmFG +dzB6TURBMU1EVXhOak0wTWpGYU1BNHhEREFLQmdOVkJBTU1BM1JzY3pDQgptekFRQmdjcWhrak9Q +UUlCQmdVcmdRUUFJd09CaGdBRUFDb1VTM3pnOVFqNUNnUWVOQ1krOXNQTTJZV1lIVVVRClNCRS9v +WXBncldWOEU4VHF0V2tXY2h3WFA0T29aQXE3Yk1KMmJOUUU1U3E2SVkrYlpyWXBPS2pmQVNweVM0 +cVIKNHhKZkN1bjdCSVpBallIdlZxbWN1RjhhSmFmaDhGOTNHQmprSUxIZ0hUcnRMTHNBcTZzQnB6 +RXVWSmxzdWYxaApMaEtuQ0FxdmZFdEMxSUJWTUFvR0NDcUdTTTQ5QkFNQ0E0R01BRENCaUFKQ0FO +R1VwNDU5UDNhTWh0VFpkWEZxCm1jOFFWTTdySFIzWmxpOWttV3NHVmRKdmJVYnVIY1g2KzBBVTFT +OFIyRGhQQThvZUJ1UVQ3ZGJvdllmd2V1VmIKUWZSM0FrSUFwYUtlc2lOOUxOeTlhclNCR1hURktK +cXVCVDYzdjRiaTRmeUNOaGhkQzN3eEtldHNKMURDcElkcgpCbDhabmNKeFVNakNyZDdCTmxrQk5Q +N2pDR2RLcFBrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t diff --git a/libraries/fabric-shim/test/unit/test-ca.pem b/libraries/fabric-shim/test/unit/test-ca.pem new file mode 100644 index 00000000..d072ef52 --- /dev/null +++ b/libraries/fabric-shim/test/unit/test-ca.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBkzCB9QIJAJ0Z8jFiPPi9MAoGCCqGSM49BAMCMA4xDDAKBgNVBAMMA3RsczAe +Fw0yMDA1MDcxNjM0MjFaFw0zMDA1MDUxNjM0MjFaMA4xDDAKBgNVBAMMA3RsczCB +mzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAEACoUS3zg9Qj5CgQeNCY+9sPM2YWYHUUQ +SBE/oYpgrWV8E8TqtWkWchwXP4OoZAq7bMJ2bNQE5Sq6IY+bZrYpOKjfASpyS4qR +4xJfCun7BIZAjYHvVqmcuF8aJafh8F93GBjkILHgHTrtLLsAq6sBpzEuVJlsuf1h +LhKnCAqvfEtC1IBVMAoGCCqGSM49BAMCA4GMADCBiAJCANGUp459P3aMhtTZdXFq +mc8QVM7rHR3Zli9kmWsGVdJvbUbuHcX6+0AU1S8R2DhPA8oeBuQT7dbovYfweuVb +QfR3AkIApaKesiN9LNy9arSBGXTFKJquBT63v4bi4fyCNhhdC3wxKetsJ1DCpIdr +Bl8ZncJxUMjCrd7BNlkBNP7jCGdKpPk= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/libraries/fabric-shim/test/unit/test-cert.base64 b/libraries/fabric-shim/test/unit/test-cert.base64 new file mode 100644 index 00000000..0181cedc --- /dev/null +++ b/libraries/fabric-shim/test/unit/test-cert.base64 @@ -0,0 +1 @@ +LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrakNCOVFJSkFPZTRqL3NqV3ltRE1Bb0dDQ3FHU000OUJBTUNNQTR4RERBS0JnTlZCQU1NQTNSc2N6QWUKRncweU1EQTFNRGN4TmpNek5UUmFGdzB6TURBMU1EVXhOak16TlRSYU1BNHhEREFLQmdOVkJBTU1BM1JzY3pDQgptekFRQmdjcWhrak9QUUlCQmdVcmdRUUFJd09CaGdBRUFPcllIem5BZmVXZ3pVM3dVZ1Q1Ylk5NkUvT2ZMb3p4CitlUUFIL2Y5cDV3TUxuUzliMTJZczBHWitTNEdjSEYva1FBNlpoMVZBcFdKYnJ6MjFYVWhSbU5QQVRibDd3K2cKbytyazJ2cVZ5Y0E3dU1tUERlL0J2MVlldEh1WXZCd05vajVLVm9vVnVpUnJPOUlkU2N3ZUxkai9WOXoyQUkvQgpmUC9iN01aYWFwbUdUQjVFTUFvR0NDcUdTTTQ5QkFNQ0E0R0xBRENCaHdKQmVZQ1ZPclFWR3dmb1Q3OWRqRWpqCm1YVkVIL3hWcGk4b1ZhWkxVRm0yN2RldkYwb1ViZHowZSt2MzhZdkx6aERnWWh2MUtMQzhnYWxxaFdleTI2MmkKVVcwQ1FnRWRrUHFOYUZlbjF0WEQ5RWJoTjhSdVRyQWE3RGphNzZ3SWVMZUZSdFloZ0hCZlMvZmM0VWR3N1hWbgpQcG9nQ0xhM0ZMNkNDSUZIQWEyTU9kc3VMeld4V2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t \ No newline at end of file diff --git a/libraries/fabric-shim/test/unit/test-cert.pem b/libraries/fabric-shim/test/unit/test-cert.pem new file mode 100644 index 00000000..11719b04 --- /dev/null +++ b/libraries/fabric-shim/test/unit/test-cert.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBkjCB9QIJAOe4j/sjWymDMAoGCCqGSM49BAMCMA4xDDAKBgNVBAMMA3RsczAe +Fw0yMDA1MDcxNjMzNTRaFw0zMDA1MDUxNjMzNTRaMA4xDDAKBgNVBAMMA3RsczCB +mzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAEAOrYHznAfeWgzU3wUgT5bY96E/OfLozx ++eQAH/f9p5wMLnS9b12Ys0GZ+S4GcHF/kQA6Zh1VApWJbrz21XUhRmNPATbl7w+g +o+rk2vqVycA7uMmPDe/Bv1YetHuYvBwNoj5KVooVuiRrO9IdScweLdj/V9z2AI/B +fP/b7MZaapmGTB5EMAoGCCqGSM49BAMCA4GLADCBhwJBeYCVOrQVGwfoT79djEjj +mXVEH/xVpi8oVaZLUFm27devF0oUbdz0e+v38YvLzhDgYhv1KLC8galqhWey262i +UW0CQgEdkPqNaFen1tXD9EbhN8RuTrAa7Dja76wIeLeFRtYhgHBfS/fc4Udw7XVn +PpogCLa3FL6CCIFHAa2MOdsuLzWxWg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/libraries/fabric-shim/test/unit/test-key.base64 b/libraries/fabric-shim/test/unit/test-key.base64 new file mode 100644 index 00000000..d9368608 --- /dev/null +++ b/libraries/fabric-shim/test/unit/test-key.base64 @@ -0,0 +1 @@ +LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1JSGNBZ0VCQkVJQmZXcmJQam9pdHcwd3AwUjA3dHdKeDhxaDZGenhpVFArekpFNEZHZ3EvTXh6Sy9kdUhIN2YKRjNzOWtmM1dkcWxYNlkwTnM2K3VRR2hmK2laODZtd01zaU9nQndZRks0RUVBQ09oZ1lrRGdZWUFCQURxMkI4NQp3SDNsb00xTjhGSUUrVzJQZWhQem55Nk04Zm5rQUIvMy9hZWNEQzUwdlc5ZG1MTkJtZmt1Qm5CeGY1RUFPbVlkClZRS1ZpVzY4OXRWMUlVWmpUd0UyNWU4UG9LUHE1TnI2bGNuQU83akpqdzN2d2I5V0hyUjdtTHdjRGFJK1NsYUsKRmJva2F6dlNIVW5NSGkzWS8xZmM5Z0NQd1h6LzIrekdXbXFaaGt3ZVJBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQ== \ No newline at end of file diff --git a/libraries/fabric-shim/test/unit/test-key.pem b/libraries/fabric-shim/test/unit/test-key.pem new file mode 100644 index 00000000..f42cbdc2 --- /dev/null +++ b/libraries/fabric-shim/test/unit/test-key.pem @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIHcAgEBBEIBfWrbPjoitw0wp0R07twJx8qh6FzxiTP+zJE4FGgq/MxzK/duHH7f +F3s9kf3WdqlX6Y0Ns6+uQGhf+iZ86mwMsiOgBwYFK4EEACOhgYkDgYYABADq2B85 +wH3loM1N8FIE+W2PehPzny6M8fnkAB/3/aecDC50vW9dmLNBmfkuBnBxf5EAOmYd +VQKViW689tV1IUZjTwE25e8PoKPq5Nr6lcnAO7jJjw3vwb9WHrR7mLwcDaI+SlaK +FbokazvSHUnMHi3Y/1fc9gCPwXz/2+zGWmqZhkweRA== +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/libraries/fabric-shim/types/index.d.ts b/libraries/fabric-shim/types/index.d.ts index cbf3cacb..c939a8d3 100644 --- a/libraries/fabric-shim/types/index.d.ts +++ b/libraries/fabric-shim/types/index.d.ts @@ -45,6 +45,24 @@ declare module 'fabric-shim' { static newLogger(name: string): Logger; static start(chaincode: ChaincodeInterface): any; static success(payload?: Uint8Array): ChaincodeResponse; + static server(chaincode: ChaincodeInterface, serverOpts: ChaincodeServerOpts): ChaincodeServer; + } + + export class ChaincodeServer { + constructor(chaincode: ChaincodeInterface, serverOpts: ChaincodeServerOpts); + start(): Promise; + } + + export interface ChaincodeServerOpts { + ccid: string; + address: string; + tlsProps: ChaincodeServerTLSProperties; + } + + export interface ChaincodeServerTLSProperties { + key: Buffer; + cert: Buffer; + clientCACerts: Buffer; } export class ClientIdentity implements IClientIdentity { @@ -76,10 +94,12 @@ declare module 'fabric-shim' { getTxID(): string; getChannelID(): string; getCreator(): SerializedIdentity; + getMspID(): string; getTransient(): Map; getSignedProposal(): ChaincodeProposal.SignedProposal; getTxTimestamp(): Timestamp; + getDateTimestamp(): Date; getBinding(): string; getState(key: string): Promise; diff --git a/package.json b/package.json deleted file mode 100644 index e912bc1a..00000000 --- a/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "fabric-shim-test", - "version": "2.0.0-beta.1", - "tag": "beta", - "description": "fabric-shim, fabric-shim-crypto", - "testFabricVersion": "master", - "testFabricThirdParty": "0.4.15", - "docsLatestVersion": "release-1.4", - "engines": { - "node": "10.15.2", - "npm": "^6.4.1" - }, - "engineStrict": true, - "license": "Apache-2.0", - "scripts": { - }, - "dependencies": { - }, - "devDependencies": { - - } -} diff --git a/release_notes/v2.0.0.txt b/release_notes/v2.0.0.txt new file mode 100644 index 00000000..f46b59db --- /dev/null +++ b/release_notes/v2.0.0.txt @@ -0,0 +1,53 @@ +v2.0.0, 22 January 2020 +----------------------- + +Release Notes +------------- +The main change in the v2.0.0 is the level of NodeJS runtime has moved up to the latest LTS version of v12.13.0 +v2.0.0 has the fixes from v1.4.4 level. + +Migration Notes +--------------- +Note that a change needed to be made to the metadata schema as it was in error; it had diverged from the JSONSchema standard +so that it was not possible to validate complex objects. + +If you have custom metadata defined in the contract, then for the complex objects defined in the 'components' section +the properties of this object where previously held as array; they now need to be held as a map with the key as the name +of the property + +Return types on functions where returned as an array of schema objects. this has been modified to be a single object. i.e. +the single value array is now just a single value. + +There is also a new nodeenv docker image that is used for hosting the chaincode rather than use the baseos image as in V1.4 + +In v1.4, the fabric-contract-api had a dependency on the fabric-shim. This has changed in this version to have a dependency +on the new fabric-shim-api module. This allows the fabric-contract-api to be used client side for annotations. + +For contributors, the v2.0.0 repo is built using rush and is organized as a full mono-repo. + +The @Object annotation has been deprecated in favour of the @DataType annotation + +The x509 library used for parsing has changed; this should be parse the X509 certificates exactly the same way; this is a note that +differences are observed in the parsed certificates please raise an issue. + +Summary of the programming model +------------------------------- + +This is designed to improve developer productivity and ease of use. +For more information see https://hyperledger-fabric.readthedocs.io/en/developapps/developing_applications.html + +Known Vulnerabilities +--------------------- +none + +Resolved Vulnerabilities +------------------------ +none + +Known Issues & Workarounds +-------------------------- +none + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.0.0 diff --git a/release_notes/v2.1.0.txt b/release_notes/v2.1.0.txt new file mode 100644 index 00000000..b052bdb4 --- /dev/null +++ b/release_notes/v2.1.0.txt @@ -0,0 +1,17 @@ +v2.1.0 +------ + +Release Notes +------------- +There are minimal changes between v2.0.0 and v2.1.0, please see the change log for a full list of updates. + +The release-2.0 branch has been renamed to release-2.x; the v2.1.0 release supercedes v2.0.0. +The release-1.4 branch is currently LTS, please see the proposed Fabric LTS strategy for more information: +https://github.com/hyperledger/fabric-rfcs/pull/23 + +- FABCN-373 Added a compatibility.md file, explaining support for node and fabric versions +- FABCN-381 Exposes a new shim function for returning the CORE_PEER_LOCALMSPID peer environment variable + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.1.0 diff --git a/release_notes/v2.1.1.txt b/release_notes/v2.1.1.txt new file mode 100644 index 00000000..4c4a709b --- /dev/null +++ b/release_notes/v2.1.1.txt @@ -0,0 +1,16 @@ +v2.1.1 +------ + +Release Notes +------------- +There are minimal changes between v2.1.0 and v2.1.1, please see the change log for a full list of updates. + +The release-2.0 branch has been renamed to release-2.x; the v2.1.0 release supercedes v2.0.0. +The release-1.4 branch is currently LTS, please see the proposed Fabric LTS strategy for more information: +https://github.com/hyperledger/fabric-rfcs/pull/23 + +- FABCN-394 fabric-shim incorrectly implements interface ChaincodeStub from fabric-shim-api + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.1.1 diff --git a/release_notes/v2.1.2.txt b/release_notes/v2.1.2.txt new file mode 100644 index 00000000..375563d8 --- /dev/null +++ b/release_notes/v2.1.2.txt @@ -0,0 +1,15 @@ +v2.1.2 +------ + +Release Notes +------------- + +This release fixs a bug when querying more than 100 assets. + +The release-2.0 branch has been renamed to release-2.x; the v2.1.0 release supercedes v2.0.0. +The release-1.4 branch is currently LTS, please see the proposed Fabric LTS strategy for more information: +https://github.com/hyperledger/fabric-rfcs/pull/23 + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.1.2 diff --git a/release_notes/v2.1.3.txt b/release_notes/v2.1.3.txt new file mode 100644 index 00000000..3c17c2c0 --- /dev/null +++ b/release_notes/v2.1.3.txt @@ -0,0 +1,16 @@ +v2.1.3 +------ + +Release Notes +------------- + +Locks the version of the @grpc/grpc-js library to 1.0.3 +The updated grpc lirbary of 1.1.0 prevents the chaincode from contacting the peer. + +The release-2.0 branch has been renamed to release-2.x; the v2.1.0 release supercedes v2.0.0. +The release-1.4 branch is currently LTS, please see the proposed Fabric LTS strategy for more information: +https://github.com/hyperledger/fabric-rfcs/pull/23 + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.1.3 diff --git a/release_notes/v2.1.4.txt b/release_notes/v2.1.4.txt new file mode 100644 index 00000000..7c7de146 --- /dev/null +++ b/release_notes/v2.1.4.txt @@ -0,0 +1,20 @@ +v2.1.4 +------ + +Release Notes +------------- + +- FABCN-418 Dependency unable to use git + + Locks the version of the winston library to 3.2.1 + The updated winston library after 3.3.0 prevents chaincode installing due to + a new requirement for git which is not available in the + hyperledger/fabric-nodeenv docker image. + +The release-2.0 branch has been renamed to release-2.x; the v2.1.0 release supercedes v2.0.0. +The release-1.4 branch is currently LTS, please see the proposed Fabric LTS strategy for more information: +https://github.com/hyperledger/fabric-rfcs/pull/23 + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.1.4 diff --git a/release_notes/v2.2.0.txt b/release_notes/v2.2.0.txt new file mode 100644 index 00000000..9a9302c4 --- /dev/null +++ b/release_notes/v2.2.0.txt @@ -0,0 +1,12 @@ +v2.2.0 +------ + +Release Notes +------------- + +The v2.2.0 release is the LTS version of the fabric-chaincode-node + + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.2.0 diff --git a/release_notes/v2.2.1.txt b/release_notes/v2.2.1.txt new file mode 100644 index 00000000..8bac9173 --- /dev/null +++ b/release_notes/v2.2.1.txt @@ -0,0 +1,16 @@ +v2.2.1 +------ + +Release Notes +------------- + +The v2.2.1 release is the LTS version of the fabric-chaincode-node + +- FABCN-430 Wrong type definition for timestamp +- FABCN-435 OutOfMemory with large message sizes + +See the change log for a full list of updates. + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.2/CHANGELOG.md#v2.2.1 diff --git a/release_notes/v2.2.2.txt b/release_notes/v2.2.2.txt new file mode 100644 index 00000000..9d1ccbeb --- /dev/null +++ b/release_notes/v2.2.2.txt @@ -0,0 +1,12 @@ +v2.2.2 +------ + +Release Notes +------------- + +The v2.2.2 release is the LTS version of the fabric-chaincode-node + + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.2.2 diff --git a/release_notes/v2.2.3.txt b/release_notes/v2.2.3.txt new file mode 100644 index 00000000..9e96edcf --- /dev/null +++ b/release_notes/v2.2.3.txt @@ -0,0 +1,15 @@ +v2.2.3 +------ + +Release Notes +------------- + +This release corrects the TypeScript type definitions for the ChaincodeStub interface + +The v2.2.3 release is the LTS version of the fabric-chaincode-node + +See the change log for a full list of updates + +Change Log +---------- +https://github.com/hyperledger/fabric-chaincode-node/blob/release-2.x/CHANGELOG.md#v2.2.3 diff --git a/rush.json b/rush.json index 463fd4fd..a5f1a54d 100644 --- a/rush.json +++ b/rush.json @@ -15,7 +15,7 @@ * path segment in the "$schema" field for all your Rush config files. This will ensure * correct error-underlining and tab-completion for editors such as VS Code. */ - "rushVersion": "5.16.0", + "rushVersion": "5.55.0", /** * The next field selects which package manager should be installed and determines its version. * Rush installs its own local copy of the package manager to ensure that your build process @@ -24,7 +24,7 @@ * Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation * for details about these alternatives. */ - "pnpmVersion": "4.1.7", + "pnpmVersion": "6.16.1", /** * Options that are only used when the PNPM package manager is selected */ @@ -39,7 +39,7 @@ * The default value is false to avoid legacy compatibility issues. * It is strongly recommended to set strictPeerDependencies=true. */ - // "strictPeerDependencies": true, + // "strictPeerDependencies": true, /** * Configures the strategy used to select versions during installation. * @@ -62,7 +62,7 @@ * Specify a SemVer range to ensure developers use a Node.js version that is appropriate * for your repo. */ - "nodeSupportedVersionRange": ">=10.13.0 <13.0.0", + "nodeSupportedVersionRange": ">=12.15.0 <13.0.0", /** * Odd-numbered major versions of Node.js are experimental. Even-numbered releases * spend six months in a stabilization period before the first Long Term Support (LTS) version. @@ -343,8 +343,8 @@ "reviewCategory": "docker" }, { - "packageName": "apidocs", - "projectFolder": "docs/apidocs", + "packageName": "fabric-shim-docs", + "projectFolder": "docs", "reviewCategory": "docs" }, { @@ -364,11 +364,6 @@ "projectFolder": "tools/toolchain", "reviewCategory": "tools" }, - { - "packageName": "azure-mocha-reporter", - "projectFolder": "tools/azure-mocha-reporter", - "reviewCategory": "tools" - }, { "packageName": "fvtests", "projectFolder": "test/fv", diff --git a/test/chaincodes/annotations/package.json b/test/chaincodes/annotations/package.json index 81a52963..02aa7780 100644 --- a/test/chaincodes/annotations/package.json +++ b/test/chaincodes/annotations/package.json @@ -2,7 +2,7 @@ "name": "ts_chaincode", "description": "Chaincode testing typescript functionality and annotations", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -18,11 +18,11 @@ "author": "", "license": "APACHE-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1", - "@types/node": "^10.3.6", + "@types/node": "^14.6.4", + "fabric-contract-api": "2.2.4-unstable", + "fabric-shim": "2.2.4-unstable", "ts-node": "^3.3.0", "tslint": "^5.6.0", - "typescript": "^2.5.3" + "typescript": "^4.0.2" } } diff --git a/test/chaincodes/annotations/src/test_contract/expected-metadata.json b/test/chaincodes/annotations/src/test_contract/expected-metadata.json index 63293306..21d3b0c4 100644 --- a/test/chaincodes/annotations/src/test_contract/expected-metadata.json +++ b/test/chaincodes/annotations/src/test_contract/expected-metadata.json @@ -1,5 +1,5 @@ { - "$schema": "https://fabric-shim.github.io/master/contract-schema.json", + "$schema": "https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json", "contracts": { "TestContract": { "name": "TestContract", @@ -10,6 +10,7 @@ "transactions": [ { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -53,6 +54,7 @@ }, { "tag": [ + "SUBMIT", "submitTx" ], "parameters": [ @@ -71,7 +73,7 @@ "$ref": "#/components/schemas/Asset" }, "name": "getAsset", - "tag": [], + "tag": ["EVALUATE"], "parameters": [ { "name": "id", diff --git a/test/chaincodes/clientidentity/chaincode.js b/test/chaincodes/clientidentity/chaincode.js index cdf2a8e5..0382b7fb 100644 --- a/test/chaincodes/clientidentity/chaincode.js +++ b/test/chaincodes/clientidentity/chaincode.js @@ -37,5 +37,10 @@ class ClientIdentityChaincode extends Contract { return {mspId: cid.mspId, id: cid.id}; } + async localMspID({stub}) { + const localMspID = stub.getMspID(); + return {localMspID}; + } + } module.exports = ClientIdentityChaincode; \ No newline at end of file diff --git a/test/chaincodes/clientidentity/package.json b/test/chaincodes/clientidentity/package.json index bab56b39..762f1f6f 100644 --- a/test/chaincodes/clientidentity/package.json +++ b/test/chaincodes/clientidentity/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing ClientIdentity functionality", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/crosschaincode/package.json b/test/chaincodes/crosschaincode/package.json index 90818c7c..a0807e51 100644 --- a/test/chaincodes/crosschaincode/package.json +++ b/test/chaincodes/crosschaincode/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing cross chaincode functionality", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/crosschaincode2/package.json b/test/chaincodes/crosschaincode2/package.json index 90818c7c..a3433e5c 100644 --- a/test/chaincodes/crosschaincode2/package.json +++ b/test/chaincodes/crosschaincode2/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing cross chaincode functionality", "engines": { - "node": ">=8.4.0", + "node":"^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/crud/chaincode.js b/test/chaincodes/crud/chaincode.js index 8e37c5b7..8e0c286d 100644 --- a/test/chaincodes/crud/chaincode.js +++ b/test/chaincodes/crud/chaincode.js @@ -63,6 +63,13 @@ class CrudChaincode extends Contract { await stub.putState(`key${i}`, Buffer.from(`value${i}`)); await stub.putState(`jsonkey${i}`, Buffer.from(JSON.stringify({key: `k${i}`, value: `value${i}`}))); } + + // add a large set of keys for testing pagination and larger data sets + const DATA_SET_SIZE=229; + for (let i = 0; i < DATA_SET_SIZE;i++){ + const compositeKey = stub.createCompositeKey('bulk-data',['bulk',i.toString().padStart(3,'0')]); + await stub.putState(compositeKey, Buffer.from(i.toString().padStart(3,'0'))); + } } async getKey({stub}) { diff --git a/test/chaincodes/crud/package.json b/test/chaincodes/crud/package.json index 6e797f9e..a00f0921 100644 --- a/test/chaincodes/crud/package.json +++ b/test/chaincodes/crud/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing crud functionality", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/encryption/package.json b/test/chaincodes/encryption/package.json index 31ddf184..2634ddf2 100644 --- a/test/chaincodes/encryption/package.json +++ b/test/chaincodes/encryption/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing encryption functionality", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,8 +15,8 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1", - "fabric-shim-crypto": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable", + "fabric-shim-crypto": "2.2.4-unstable" } } diff --git a/test/chaincodes/events/package.json b/test/chaincodes/events/package.json index a3a7af6a..821da51c 100644 --- a/test/chaincodes/events/package.json +++ b/test/chaincodes/events/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing events functionality", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/privateData/chaincode.js b/test/chaincodes/privateData/chaincode.js new file mode 100644 index 00000000..a8635163 --- /dev/null +++ b/test/chaincodes/privateData/chaincode.js @@ -0,0 +1,87 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +'use strict'; + +const { Contract } = require('fabric-contract-api'); +const crypto = require('crypto'); + +class privateDataContract extends Contract { + + async assetExists(ctx, assetId) { + const data = await ctx.stub.getPrivateDataHash("collection", assetId); + return (!!data && data.length > 0); + } + + async createAsset(ctx, assetId) { + const exists = await this.assetExists(ctx, assetId); + if (exists) { + throw new Error(`The asset asset ${assetId} already exists`); + } + + const privateAsset = {}; + + const transientData = ctx.stub.getTransient(); + if (transientData.size === 0 || !transientData.has('privateValue')) { + throw new Error('The privateValue key was not specified in transient data. Please try again.'); + } + privateAsset.privateValue = transientData.get('privateValue').toString(); + + await ctx.stub.putPrivateData("collection", assetId, Buffer.from(JSON.stringify(privateAsset))); + } + + async readAsset(ctx, assetId) { + const exists = await this.assetExists(ctx, assetId); + if (!exists) { + throw new Error(`The asset ${assetId} does not exist`); + } + let privateDataString; + const privateData = await ctx.stub.getPrivateData("collection", assetId); + privateDataString = JSON.parse(privateData.toString()); + return privateDataString; + } + + async updateAsset(ctx, assetId) { + const exists = await this.assetExists(ctx, assetId); + if (!exists) { + throw new Error(`The asset asset ${assetId} does not exist`); + } + const privateAsset = {}; + + const transientData = ctx.stub.getTransient(); + if (transientData.size === 0 || !transientData.has('privateValue')) { + throw new Error('The privateValue key was not specified in transient data. Please try again.'); + } + privateAsset.privateValue = transientData.get('privateValue').toString(); + + await ctx.stub.putPrivateData("collection", assetId, Buffer.from(JSON.stringify(privateAsset))); + } + + async deleteAsset(ctx, assetId) { + const exists = await this.assetExists(ctx, assetId); + if (!exists) { + throw new Error(`The asset asset ${assetId} does not exist`); + } + await ctx.stub.deletePrivateData("collection", assetId); + } + + async verifyAsset(ctx, mspid, assetId, objectToVerify) { + + const hashToVerify = crypto.createHash('sha256').update(objectToVerify).digest('hex'); + const pdHashBytes = await ctx.stub.getPrivateDataHash("collection", assetId); + if (pdHashBytes.length === 0) { + throw new Error('No private data hash with the key: ' + assetId); + } + + const actualHash = Buffer.from(pdHashBytes).toString('hex'); + + if (hashToVerify === actualHash) { + return true; + } else { + return false; + } + } +} + +module.exports = privateDataContract; diff --git a/test/chaincodes/privateData/collection-config/collection.json b/test/chaincodes/privateData/collection-config/collection.json new file mode 100644 index 00000000..046909df --- /dev/null +++ b/test/chaincodes/privateData/collection-config/collection.json @@ -0,0 +1,11 @@ +[ + { + "name": "collection", + "policy": "OR('Org1MSP.member', 'Org2MSP.member')", + "requiredPeerCount": 1, + "maxPeerCount": 1, + "blockToLive":1000000, + "memberOnlyRead": true, + "memberOnlyWrite": true + } +] diff --git a/test/chaincodes/privateData/index.js b/test/chaincodes/privateData/index.js new file mode 100644 index 00000000..5a0b2629 --- /dev/null +++ b/test/chaincodes/privateData/index.js @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +'use strict'; + +const Chaincode = require('./chaincode'); + +module.exports.contracts = [Chaincode]; + diff --git a/test/chaincodes/privateData/package.json b/test/chaincodes/privateData/package.json new file mode 100644 index 00000000..e62d445e --- /dev/null +++ b/test/chaincodes/privateData/package.json @@ -0,0 +1,21 @@ +{ + "name": "chaincode", + "description": "Chaincode testing private data functionality", + "engines": { + "node":"^12.16.1", + "npm": ">=5.3.0" + }, + "scripts": { + "start": "fabric-chaincode-node start" + }, + "main": "index.js", + "engine-strict": true, + "engineStrict": true, + "version": "1.0.0", + "author": "", + "license": "Apache-2.0", + "dependencies": { + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" + } +} diff --git a/test/chaincodes/query/package.json b/test/chaincodes/query/package.json index e0226fbc..30672ad4 100644 --- a/test/chaincodes/query/package.json +++ b/test/chaincodes/query/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "Chaincode testing query functionality", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/scenario/package.json b/test/chaincodes/scenario/package.json index 5cdfc4ef..c4c733f1 100644 --- a/test/chaincodes/scenario/package.json +++ b/test/chaincodes/scenario/package.json @@ -2,7 +2,7 @@ "name": "chaincode", "description": "My first exciting chaincode implemented in node.js", "engines": { - "node": ">=8.4.0", + "node": "^12.16.1", "npm": ">=5.3.0" }, "scripts": { @@ -15,7 +15,7 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "fabric-shim": "2.0.0-beta.1", - "fabric-contract-api": "2.0.0-beta.1" + "fabric-shim": "2.2.4-unstable", + "fabric-contract-api": "2.2.4-unstable" } } diff --git a/test/chaincodes/server/.dockerignore b/test/chaincodes/server/.dockerignore new file mode 100644 index 00000000..f8b6bbd6 --- /dev/null +++ b/test/chaincodes/server/.dockerignore @@ -0,0 +1,3 @@ +node_modules +package.lock.json +package diff --git a/test/chaincodes/server/Dockerfile b/test/chaincodes/server/Dockerfile new file mode 100644 index 00000000..8dbb1a7e --- /dev/null +++ b/test/chaincodes/server/Dockerfile @@ -0,0 +1,7 @@ +FROM hyperledger/fabric-nodeenv:latest + +ADD . /opt/chaincode +RUN cd /opt/chaincode; npm install + +WORKDIR /opt/chaincode +ENTRYPOINT ["npm", "start"] diff --git a/test/chaincodes/server/index.js b/test/chaincodes/server/index.js new file mode 100644 index 00000000..7d1accc5 --- /dev/null +++ b/test/chaincodes/server/index.js @@ -0,0 +1,30 @@ +/* +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ +"use strict"; + +const { Contract } = require('fabric-contract-api'); + +class ServerTestChaincode extends Contract { + async unknownTransaction({stub}) { + const {fcn, params} = stub.getFunctionAndParameters(); + throw new Error(`Could not find chaincode function: ${fcn}`); + } + + constructor() { + super('org.mynamespace.server'); + } + + async putValue(ctx, value) { + await ctx.stub.putState('state1', Buffer.from(JSON.stringify(value))); + } + + async getValue(ctx) { + const value = await ctx.stub.getState('state1'); + return JSON.parse(value.toString()); + } +} + +exports.contracts = [ ServerTestChaincode ]; diff --git a/test/chaincodes/server/package/connection.json b/test/chaincodes/server/package/connection.json new file mode 100644 index 00000000..96f2571f --- /dev/null +++ b/test/chaincodes/server/package/connection.json @@ -0,0 +1,5 @@ +{ + "address": "cc-server:9999", + "dial_timeout": "10s", + "tls_required": false +} diff --git a/test/chaincodes/server/package/metadata.json b/test/chaincodes/server/package/metadata.json new file mode 100644 index 00000000..31b9bba2 --- /dev/null +++ b/test/chaincodes/server/package/metadata.json @@ -0,0 +1,5 @@ +{ + "path": "", + "type": "external", + "label": "server_v0" +} diff --git a/test/e2e/package.json b/test/e2e/package.json index 161838b9..659bea56 100644 --- a/test/e2e/package.json +++ b/test/e2e/package.json @@ -5,7 +5,7 @@ "main": "docker.js", "scripts": { "build": "", - "test:e2e": "gulp -f ./scenario.js --reporter azure-mocha-reporter 2>&1" + "test:e2e": "gulp -f ./scenario.js --reporter spec-junit-splitter-mocha-reporter 2>&1" }, "keywords": [], "author": "", @@ -15,10 +15,10 @@ "gulp": "^4.0.0", "toolchain": "1.0.0", "delay": "4.3.0", - "fs-extra": "8.1.0", + "fs-extra": "^9.0.1", "ip": "^1.1.5", - "ajv": "^6.5.5", - "ajv-cli": "^3.0.0", - "azure-mocha-reporter": "1.0.0" + "ajv": "^6.12.2", + "ajv-cli": "^3.2.1", + "spec-junit-splitter-mocha-reporter": "1.0.1" } } diff --git a/test/e2e/scenario.js b/test/e2e/scenario.js index 9ff1c2c0..fe01bc90 100644 --- a/test/e2e/scenario.js +++ b/test/e2e/scenario.js @@ -12,17 +12,28 @@ const util = require('util'); const fs = require('fs-extra'); const path = require('path'); -const { shell: runcmds , getTLSArgs } = require('toolchain'); +const { shell: runcmds , getTLSArgs, getPeerAddresses } = require('toolchain'); const Ajv = require('ajv'); const ip = require('ip'); const CHANNEL_NAME = 'mychannel'; /* eslint-disable no-console */ +const dir = path.join(__dirname, '..', '..', 'fabric-samples'); +const exportPeerCommand = async(org) => { + const port = org === 'org1' ? 7051 : 9051; + const role = 'Admin'; + const args = `export PATH=${dir}/bin:$PATH && export FABRIC_CFG_PATH=${dir}/config/ && ` + + `export CORE_PEER_TLS_ENABLED=true && export CORE_PEER_LOCALMSPID="${org[0].toUpperCase() + org.slice(1)}MSP" && ` + + `export CORE_PEER_TLS_ROOTCERT_FILE=${dir}/test-network/organizations/peerOrganizations/${org}.example.com/peers/peer0.${org}.example.com/tls/ca.crt && ` + + `export CORE_PEER_MSPCONFIGPATH=${dir}/test-network/organizations/peerOrganizations/${org}.example.com/users/${role}@${org}.example.com/msp && ` + + `export CORE_PEER_ADDRESS=localhost:${port}`; + return args; +} const invokeFunctions = async () => { - - const args = util.format('docker exec org1_cli peer chaincode invoke %s -C %s -n %s -c %s --waitForEvent', + const args = await exportPeerCommand('org1') + ' && ' + util.format( + 'peer chaincode invoke -o localhost:7050 %s -C %s -n %s -c %s --waitForEvent', getTLSArgs(), CHANNEL_NAME, 'mysmartcontract', @@ -32,8 +43,8 @@ const invokeFunctions = async () => { }; const queryFunctions = async () => { - - const args = util.format('docker exec org2_cli peer chaincode query %s -C %s -n %s -c %s', + const args = await exportPeerCommand('org2') + ' && ' + util.format( + 'peer chaincode query -o localhost:7050 %s -C %s -n %s -c %s', getTLSArgs(), CHANNEL_NAME, 'mysmartcontract', @@ -43,11 +54,10 @@ const queryFunctions = async () => { const stdout = stdoutList[0]; // validate the stdout/stderr console.log(stdout); - // console.log(stderr); const metadata = JSON.parse(stdout); - const expectedMetadata = '{"$schema":"https://fabric-shim.github.io/master/contract-schema.json","contracts":{"UpdateValues":{"name":"UpdateValues","contractInstance":{"name":"UpdateValues","logBuffer":{"output":[]},"default":true},"transactions":[{"name":"setup","tags":["submitTx"]},{"name":"setNewAssetValue","tags":["submitTx"],"parameters":[{"name":"arg0","description":"Argument 0","schema":{"type":"string"}}]},{"name":"doubleAssetValue","tags":["submitTx"]}],"info":{"title":"","version":""}},"RemoveValues":{"name":"RemoveValues","contractInstance":{"name":"RemoveValues"},"transactions":[{"name":"quarterAssetValue","tags":["submitTx"]},{"name":"getAssetValue","tags":["submitTx"]}],"info":{"title":"","version":""}},"org.hyperledger.fabric":{"name":"org.hyperledger.fabric","contractInstance":{"name":"org.hyperledger.fabric"},"transactions":[{"name":"GetMetadata"}],"info":{"title":"","version":""}}},"info":{"version":"1.0.0","title":"chaincode"},"components":{"schemas":{}}}'; + const expectedMetadata = '{"$schema":"https://hyperledger.github.io/fabric-chaincode-node/release-2.1/api/contract-schema.json","contracts":{"UpdateValues":{"name":"UpdateValues","contractInstance":{"name":"UpdateValues","logBuffer":{"output":[]},"default":true},"transactions":[{"name":"setup","tags":["SUBMIT","submitTx"]},{"name":"setNewAssetValue","tags":["SUBMIT","submitTx"],"parameters":[{"name":"arg0","description":"Argument 0","schema":{"type":"string"}}]},{"name":"doubleAssetValue","tags":["SUBMIT","submitTx"]}],"info":{"title":"","version":""}},"RemoveValues":{"name":"RemoveValues","contractInstance":{"name":"RemoveValues"},"transactions":[{"name":"quarterAssetValue","tags":["SUBMIT","submitTx"]},{"name":"getAssetValue","tags":["SUBMIT","submitTx"]}],"info":{"title":"","version":""}},"org.hyperledger.fabric":{"name":"org.hyperledger.fabric","contractInstance":{"name":"org.hyperledger.fabric"},"transactions":[{"name":"GetMetadata"}],"info":{"title":"","version":""}}},"info":{"version":"1.0.0","title":"chaincode"},"components":{"schemas":{}}}'; const schema = fs.readFileSync(path.join(__dirname, '../../apis/fabric-contract-api/schema/contract-schema.json')); @@ -66,40 +76,56 @@ const queryFunctions = async () => { const instantiateChaincode = async () => { + // Invoke init function await runcmds([ - util.format('docker exec org1_cli peer chaincode instantiate -o %s %s -l node -C %s -n %s -v v0 -c %s -P %s', - 'orderer.example.com:7050', + await exportPeerCommand('org1') + ' && ' + + util.format( + 'peer chaincode invoke -o localhost:7050 %s -C %s -n %s -c %s --waitForEvent', getTLSArgs(), CHANNEL_NAME, 'mysmartcontract', - '\'{"Args":["UpdateValues:setup"]}\'', - '\'OR ("Org1MSP.member")\'') + '\'{"Args":["UpdateValues:setup"]}\'' + ) ]); - await delay(3000); +}; + +const findPackageId = (queryOutput, label) => { + const output = JSON.parse(queryOutput); + + const cc = output.installed_chaincodes.filter((chaincode) => chaincode.label === label); + if (cc.length !== 1) { + throw new Error('Failed to find installed chaincode'); + } + + return cc[0].package_id; }; const installChaincode = async () => { - const peerInstall = util.format( - 'peer chaincode install -l node -n %s -v v0 -p %s', + const packageChaincode = util.format( + 'peer lifecycle chaincode package %s -l node --label %s_v0 -p %s', + '/tmp/scenario.tar.gz', 'mysmartcontract', // the test folder containing scenario is mapped to /opt/gopath/src/github.com/chaincode '/opt/gopath/src/github.com/chaincode/scenario' ); + const peerInstall = util.format( + 'peer lifecycle chaincode install %s', + '/tmp/scenario.tar.gz' + ); const npmrc = path.join(__dirname, '..', '..', 'test', 'chaincodes','scenario', '.npmrc'); + + const CCDir = path.join(__dirname, '..', 'chaincodes', 'scenario'); + await runcmds([ `echo "registry=http://${ip.address()}:4873" > ${npmrc}`, util.format( - 'docker exec %s %s', - 'org1_cli', - peerInstall - ), - util.format( - 'docker exec %s %s', - 'org2_cli', - peerInstall - ), - `rm -f ${npmrc}` + await exportPeerCommand('org1') + ' && ', + `cd ${dir}/test-network && ./network.sh deployCC -ccn mysmartcontract -ccp ${CCDir} -ccl javascript -ccep "OR('Org1MSP.peer','Org2MSP.peer')"` + ) ]); }; -exports.default = series(installChaincode, instantiateChaincode, invokeFunctions, queryFunctions); +const clientTests = series(installChaincode, instantiateChaincode, invokeFunctions, queryFunctions); +const serverTests = require('./server').default; + +exports.default = series(clientTests); // removing the server tests as currently there is an issue with the pipeline/docker maybe that stops these working diff --git a/test/e2e/server.js b/test/e2e/server.js new file mode 100644 index 00000000..4c84cde1 --- /dev/null +++ b/test/e2e/server.js @@ -0,0 +1,165 @@ +/* +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ +'use strict'; + +const {series} = require('gulp'); + +const util = require('util'); +const path = require('path'); + +const { shell: runcmds , getTLSArgs, getPeerAddresses } = require('toolchain'); +const ip = require('ip'); + +const CHANNEL_NAME = 'mychannel'; + +const chaincodeDir = path.join(__dirname, '..', '..', 'test', 'chaincodes', 'server'); + +async function packageChaincode() { + await runcmds([ + util.format( + 'tar -C %s/package -cvzf %s/package/code.tar.gz connection.json', + chaincodeDir, chaincodeDir + ), + util.format( + 'tar -C %s/package -cvzf %s/package/chaincode.tar.gz code.tar.gz metadata.json', + chaincodeDir, chaincodeDir + ), + ]); +} + +async function buildChaincode() { + const npmrc = path.join(chaincodeDir, '.npmrc'); + + await runcmds([ + `echo "registry=http://${ip.address()}:4873" > ${npmrc}`, + util.format( + 'docker build --no-cache -t chaincode-e2e-server %s', + chaincodeDir + ), + `rm -f ${npmrc}` + ]); +} + +async function installChaincode() { + const peerInstall = 'peer lifecycle chaincode install /opt/gopath/src/github.com/chaincode/server/package/chaincode.tar.gz'; + + await runcmds([ + util.format( + 'docker exec %s %s', + 'peer0.org1.example.com', + peerInstall + ), + util.format( + 'docker exec %s %s', + 'peer0.org2.example.com', + peerInstall + ) + ]); +}; + +function findPackageId(queryOutput, label) { + const output = JSON.parse(queryOutput); + + const cc = output.installed_chaincodes.filter((chaincode) => chaincode.label === label); + if (cc.length !== 1) { + throw new Error('Failed to find installed chaincode'); + } + + return cc[0].package_id; +} + +async function instantiateChaincode() { + const endorsementPolicy = '"OR (\'Org1MSP.member\', \'Org2MSP.member\')"'; + const queryInstalled = util.format( + 'peer lifecycle chaincode queryinstalled --output json' + ); + const sequence = 1; + + const approveChaincode = util.format( + 'peer lifecycle chaincode approveformyorg -o %s %s -C %s -n %s -v %s --package-id %s --sequence %d --signature-policy %s', + 'orderer.example.com:7050', + getTLSArgs(), + CHANNEL_NAME, + 'server', + 'v0', + '%s', // To be filled in for each org + sequence, + endorsementPolicy + ); + + const outputs = await runcmds([ + util.format( + 'docker exec %s %s', + 'peer0.org1.example.com', + queryInstalled + ), + util.format( + 'docker exec %s %s', + 'peer0.org2.example.com', + queryInstalled + ), + ]); + + const packageIdOrg1 = findPackageId(outputs[0], 'server_v0'); + const packageIdOrg2 = findPackageId(outputs[1], 'server_v0'); + + // TODO: Assuming the two package IDs are the same + await runcmds([ + // Start the CC Server container + `docker run -e CORE_CHAINCODE_ID=${packageIdOrg1} -e CORE_CHAINCODE_ADDRESS=0.0.0.0:9999 -h cc-server --name cc-server -d --network node_default chaincode-e2e-server`, + // Approve the chaincode definition by each org + util.format('docker exec %s %s', + 'peer0.org1.example.com', + util.format(approveChaincode, packageIdOrg1) + ), + util.format('docker exec %s %s', + 'peer0.org2.example.com', + util.format(approveChaincode, packageIdOrg2) + ), + // Commit the chaincode definition + util.format('docker exec peer0.org1.example.com peer lifecycle chaincode commit -o %s %s -C %s -n %s -v %s --sequence %d --signature-policy %s %s', + 'orderer.example.com:7050', + getTLSArgs(), + CHANNEL_NAME, + 'server', + 'v0', + sequence, + endorsementPolicy, + getPeerAddresses() + ) + ]); +} + +const invokeFunctions = async () => { + const args = util.format('docker exec peer0.org1.example.com peer chaincode invoke %s -C %s -n %s -c %s --waitForEvent', + getTLSArgs(), + CHANNEL_NAME, + 'server', + '\'{"Args":["putValue","\'42\'"]}\''); + + await runcmds([args]); +}; + +const queryFunctions = async () => { + const args = util.format('docker exec peer0.org1.example.com peer chaincode query %s -C %s -n %s -c %s', + getTLSArgs(), + CHANNEL_NAME, + 'server', + '\'{"Args":["getValue"]}\''); + + const ret = await runcmds([args]); + + const response = JSON.parse(ret[0]); + + if (response !== 42) { + throw new Error("Unexpected result from chaincode"); + } +} + +exports.default = series( + packageChaincode, buildChaincode, installChaincode, instantiateChaincode, + invokeFunctions, queryFunctions +); diff --git a/test/fv/annotations.js b/test/fv/annotations.js index 1d310921..1dfe5d53 100644 --- a/test/fv/annotations.js +++ b/test/fv/annotations.js @@ -16,10 +16,10 @@ const {SHORT_STEP, LONG_STEP} = utils.TIMEOUTS; describe('Typescript chaincode', () => { const suite = 'annotations'; + utils.registerAndEnroll(); before(async function () { this.timeout(LONG_STEP); - return utils.installAndInstantiate(suite); }); @@ -33,7 +33,7 @@ describe('Typescript chaincode', () => { expect(payload).to.eql({id: 'GLD', name: 'GOLD_BAR', value: 100, extra: {id: 'EXTRA_ID', value: 50}}); }); - it ('should update an asset', async function() { + it('should update an asset', async function() { this.timeout(SHORT_STEP); await utils.invoke(suite, 'TestContract:updateAsset', [JSON.stringify({id: 'GLD', name: 'GOLD_BAR', value: 200, extra: {id: 'EXTRA_ID', value: 100}})]); const payload = JSON.parse(await utils.query(suite, 'TestContract:getAsset', ['GLD'])); diff --git a/test/fv/clientidentity.js b/test/fv/clientidentity.js index 768ac612..12e354cc 100644 --- a/test/fv/clientidentity.js +++ b/test/fv/clientidentity.js @@ -25,7 +25,14 @@ describe('Chaincode clientidentity', () => { const payload = JSON.parse(await utils.query(suite, 'org.mynamespace.clientidentity:clientIdentityInstance', [])); expect(payload.mspId).to.equal('Org2MSP', 'Test mspId value'); - expect(payload.id).to.equal('x509::/C=US/ST=California/L=San Francisco/CN=Admin@org2.example.com::/C=US/ST=California/L=San Francisco/O=org2.example.com/CN=ca.org2.example.com', 'Test getID()'); + expect(payload.id).to.equal('x509::/C=US/ST=North Carolina/O=Hyperledger/OU=client/CN=buyer::/C=UK/ST=Hampshire/L=Hursley/O=org2.example.com/CN=ca.org2.example.com', 'Test getID()'); + }); + + it('should be able to check the peer MSPID', async function () { + this.timeout(MED_STEP); + + const payload = JSON.parse(await utils.query(suite, 'org.mynamespace.clientidentity:localMspID', [])); + expect(payload.localMspID).to.equal('Org2MSP', 'Test stub.getMspID()'); }); }); \ No newline at end of file diff --git a/test/fv/crosschaincode.js b/test/fv/crosschaincode.js index 1a236d69..330dc88d 100644 --- a/test/fv/crosschaincode.js +++ b/test/fv/crosschaincode.js @@ -31,7 +31,7 @@ describe('Chaincode crosschaincode', () => { this.timeout(LONGEST_STEP); const payload = await utils.query(suite, 'org.mynamespace.crosschaincode:invokeChaincode', ['getKey', 'key1']); - expect(JSON.parse(payload)).to.equal('crosschaincode2'); + expect(payload).to.equal('crosschaincode2'); }); it('should throw an error when invoking chaincode', async function () { diff --git a/test/fv/crud.js b/test/fv/crud.js index 668281a7..a9bc2ffd 100755 --- a/test/fv/crud.js +++ b/test/fv/crud.js @@ -11,7 +11,7 @@ const expect = chai.expect; const utils = require('./utils'); const {SHORT_STEP, MED_STEP, LONG_STEP} = utils.TIMEOUTS; -describe.only('Chaincode CRUD', () => { +describe('Chaincode CRUD', () => { const suite = 'crud'; before(async function () { @@ -154,6 +154,13 @@ describe.only('Chaincode CRUD', () => { expect(JSON.parse(payload)).to.deep.equal(['annblack', 'annred', 'annyellow']); }); + + it('should return the bulk states from a partial composite key using the old iterator style', async function() { + this.timeout(MED_STEP); + const payload = await utils.query(suite, 'org.mynamespace.crud:getStateByPartialCompositeKey', ['bulk-data','bulk']); + expect(JSON.parse(payload)).to.have.lengthOf(229); + }); + it('should return a state from a partial composite key using the new iterator style', async function() { this.timeout(SHORT_STEP); const payload = await utils.query(suite, 'org.mynamespace.crud:getStateByPartialCompositeKeyUsingAsyncIterator', ['name~color', 'ann']); diff --git a/test/fv/package.json b/test/fv/package.json index 8b5fafcc..595c593e 100644 --- a/test/fv/package.json +++ b/test/fv/package.json @@ -1,19 +1,19 @@ { "name": "fvtests", - "version": "2.0.0-beta.1", + "version": "2.2.4-unstable", "description": "fv tests", "testFabricVersion": "master", "testFabricThirdParty": "0.4.15", "docsLatestVersion": "release-1.4", "engines": { - "node": "10.15.2", + "node": "^12.16.1", "npm": "^6.4.1" }, "engineStrict": true, "license": "Apache-2.0", "scripts": { "hello": "echo test fv project", - "test:fv": "mocha *.js --reporter azure-mocha-reporter 2>&1", + "test:fv": "mocha *.js --reporter spec-junit-splitter-mocha-reporter 2>&1", "build": "" }, "dependencies": { @@ -26,11 +26,11 @@ "del": "^3.0.0", "delay": "4.3.0", "eslint": "6.6.0", - "fabric-contract-api": "2.0.0-beta.1", - "fabric-shim": "2.0.0-beta.1", - "fabric-shim-api": "2.0.0-beta.1", - "fabric-shim-crypto": "2.0.0-beta.1", - "fs-extra": "8.1.0", + "fabric-contract-api": "2.2.4-unstable", + "fabric-shim": "2.2.4-unstable", + "fabric-shim-api": "2.2.4-unstable", + "fabric-shim-crypto": "2.2.4-unstable", + "fs-extra": "^9.0.1", "git-rev-sync": "1.12.0", "gulp": "^4.0.0", "ip": "^1.1.5", @@ -41,6 +41,6 @@ "rewire": "4.0.1", "sinon": "7.5.0", "sinon-test": "^2.2.0", - "azure-mocha-reporter": "1.0.0" + "spec-junit-splitter-mocha-reporter": "1.0.1" } } diff --git a/test/fv/privateData.js b/test/fv/privateData.js new file mode 100644 index 00000000..e6a47a78 --- /dev/null +++ b/test/fv/privateData.js @@ -0,0 +1,51 @@ +/* +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +*/ +'use strict'; + +const chai = require('chai'); +chai.use(require('chai-as-promised')); +const expect = chai.expect; +const utils = require('./utils'); +const {MED_STEP, LONG_STEP} = utils.TIMEOUTS; + +describe('Chaincode privateData', () => { + const suite = 'privateData'; + + before(async function () { + this.timeout(LONG_STEP); + return utils.installAndInstantiate(suite, null, null, true); + }); + + it('should write and read an asset with private data', async function () { + this.timeout(MED_STEP); + const privateData = Buffer.from('privateData').toString('base64'); + await utils.invoke(suite, 'privateDataContract:createAsset', ['1'], `{"privateValue":"${privateData}"}`); + const payload = await utils.query(suite, 'privateDataContract:readAsset', ['1']); + expect(payload).to.eql('{"privateValue":"privateData"}'); + }); + + it('should update an asset with private data', async function () { + this.timeout(MED_STEP); + let privateData = Buffer.from('privateData').toString('base64'); + await utils.invoke(suite, 'privateDataContract:createAsset', ['2'], `{"privateValue":"${privateData}"}`); + privateData = Buffer.from('updatedPrivateData').toString('base64'); + await utils.invoke(suite, 'privateDataContract:updateAsset', ['2'], `{"privateValue":"${privateData}"}`); + const payload = await utils.query(suite, 'privateDataContract:readAsset', ['2']); + expect(payload).to.eql('{"privateValue":"updatedPrivateData"}'); + }); + + it('should delete an asset with private data', async function () { + this.timeout(MED_STEP); + const privateData = Buffer.from('privateData').toString('base64'); + await utils.invoke(suite, 'privateDataContract:createAsset', ['3'], `{"privateValue":"${privateData}"}`); + let payload = await utils.query(suite, 'privateDataContract:readAsset', ['3']); + expect(payload).to.eql('{"privateValue":"privateData"}'); + await utils.invoke(suite, 'privateDataContract:deleteAsset', ['3']); + payload = await utils.query(suite, 'privateDataContract:assetExists', ['3']); + expect(payload).to.eql('false'); + }); + +}); \ No newline at end of file diff --git a/test/fv/utils.js b/test/fv/utils.js index 1f92b36c..31077fd1 100755 --- a/test/fv/utils.js +++ b/test/fv/utils.js @@ -11,42 +11,54 @@ const exec = util.promisify(childProcess.exec); const fs = require('fs'); const path = require('path'); const ip = require('ip'); - - -const ordererCA = '/etc/hyperledger/config/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem'; -const tls = process.env.TLS && process.env.TLS.toLowerCase() === 'true' ? true : false; +const execSync = require('child_process').execSync; + +const ordererCA = '/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem'; +const dir = path.join(__dirname, '..', '..', 'fabric-samples'); +const registerAndEnroll = () => { + const cmd = `export PATH=${dir}/bin:$PATH && export FABRIC_CFG_PATH=${dir}/config/ && ` + + `export FABRIC_CA_CLIENT_HOME=${dir}/test-network/organizations/peerOrganizations/org1.example.com/ && ` + + `fabric-ca-client register --caname ca-org1 --id.name owner --id.secret ownerpw --id.type client --tls.certfiles "${dir}/test-network/organizations/fabric-ca/org1/tls-cert.pem" && ` + + `fabric-ca-client enroll -u https://owner:ownerpw@localhost:7054 --caname ca-org1 -M "${dir}/test-network/organizations/peerOrganizations/org1.example.com/users/owner@org1.example.com/msp" --tls.certfiles "${dir}/test-network/organizations/fabric-ca/org1/tls-cert.pem" && ` + + `cp "${dir}/test-network/organizations/peerOrganizations/org1.example.com/msp/config.yaml" "${dir}/test-network/organizations/peerOrganizations/org1.example.com/users/owner@org1.example.com/msp/config.yaml" && ` + + `export FABRIC_CA_CLIENT_HOME=${dir}/test-network/organizations/peerOrganizations/org2.example.com/ && ` + + `fabric-ca-client register --caname ca-org2 --id.name buyer --id.secret buyerpw --id.type client --tls.certfiles "${dir}/test-network/organizations/fabric-ca/org2/tls-cert.pem" && ` + + `fabric-ca-client enroll -u https://buyer:buyerpw@localhost:8054 --caname ca-org2 -M "${dir}/test-network/organizations/peerOrganizations/org2.example.com/users/buyer@org2.example.com/msp" --tls.certfiles "${dir}/test-network/organizations/fabric-ca/org2/tls-cert.pem" && ` + + `cp "${dir}/test-network/organizations/peerOrganizations/org2.example.com/msp/config.yaml" "${dir}/test-network/organizations/peerOrganizations/org2.example.com/users/buyer@org2.example.com/msp/config.yaml"`; + execSync(cmd); +}; const getTLSArgs = () => { - if (tls) { - return '--tls true --cafile ' + ordererCA; - } - - return ''; + return `--tls true --cafile ${dir}` + ordererCA; }; - // Increase the timeouts on zLinux! const arch = require('os').arch(); const multiplier = arch === 's390x' ? 2 : 1; -async function install(ccName) { +async function install(ccName, transient) { const npmrc = path.join(__dirname, '..', 'chaincodes', ccName, '.npmrc'); try { fs.writeFileSync(npmrc, `registry=http://${ip.address()}:4873`); - const folderName = '/opt/gopath/src/github.com/chaincode/' + ccName; - const cmd = `docker exec %s peer chaincode install -l node -n ${ccName} -v v0 -p ${folderName} --connTimeout 60s`; - await exec(util.format(cmd, 'org1_cli')); - await exec(util.format(cmd, 'org2_cli')); - + const networkScriptDir = path.join(__dirname, '..', '..', 'fabric-samples', 'test-network'); + const CCDir = path.join(__dirname, '..', 'chaincodes', ccName); + const collectionConfig = transient ? `-cccg ${CCDir}/collection-config/collection.json` : ''; + const cmd = `cd ${networkScriptDir} && ./network.sh deployCC -ccn ${ccName} -ccp ${CCDir} -ccl javascript ${collectionConfig} -ccep "OR('Org1MSP.peer','Org2MSP.peer')"`; + await exec(cmd); } finally { fs.unlinkSync(npmrc); } } async function instantiate(ccName, func, args) { - const cmd = `docker exec org1_cli peer chaincode instantiate ${getTLSArgs()} -o orderer.example.com:7050 -l node -C mychannel -n ${ccName} -v v0 -c '${printArgs(func, args)}' -P 'OR ("Org1MSP.member")'`; - console.log(cmd) - const res = await exec(cmd); - await new Promise(resolve => setTimeout(resolve, 5000)); + let res = null; + if (func !== undefined) { + const initCmd = `export PATH=${dir}/bin:$PATH && export FABRIC_CFG_PATH=${dir}/config/ && ` + + `export CORE_PEER_TLS_ENABLED=true && export CORE_PEER_LOCALMSPID="Org1MSP" && ` + + `export CORE_PEER_TLS_ROOTCERT_FILE=${dir}/test-network/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt && ` + + `export CORE_PEER_MSPCONFIGPATH=${dir}/test-network/organizations/peerOrganizations/org1.example.com/users/owner@org1.example.com/msp && ` + + `export CORE_PEER_ADDRESS=localhost:7051 && peer chaincode invoke ${getTLSArgs()} -o localhost:7050 -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --waitForEvent`; + res = await exec(initCmd); + } return res; } @@ -65,27 +77,34 @@ function printArgs(func, args) { } async function invoke(ccName, func, args, transient) { - let cmd; + let cmd = `export PATH=${dir}/bin:$PATH && export FABRIC_CFG_PATH=${dir}/config/ && ` + + `export CORE_PEER_TLS_ENABLED=true && export CORE_PEER_LOCALMSPID="Org1MSP" && ` + + `export CORE_PEER_TLS_ROOTCERT_FILE=${dir}/test-network/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt && ` + + `export CORE_PEER_MSPCONFIGPATH=${dir}/test-network/organizations/peerOrganizations/org1.example.com/users/owner@org1.example.com/msp && ` + + `export CORE_PEER_ADDRESS=localhost:7051 && `; if (transient) { - cmd = `docker exec org1_cli peer chaincode invoke ${getTLSArgs()} -o orderer.example.com:7050 -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --transient '${transient}' --waitForEvent --waitForEventTimeout 100s 2>&1`; + cmd += `peer chaincode invoke ${getTLSArgs()} -o localhost:7050 -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --transient '${transient}' --waitForEvent --waitForEventTimeout 200s 2>&1`; } else { - cmd = `docker exec org1_cli peer chaincode invoke ${getTLSArgs()} -o orderer.example.com:7050 -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --waitForEvent --waitForEventTimeout 100s 2>&1`; + cmd += `peer chaincode invoke ${getTLSArgs()} -o localhost:7050 -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --waitForEvent --waitForEventTimeout 100s 2>&1`; } - - const {stderr} = await exec(cmd); + const {stderr} = execSync(cmd); if (stderr) { throw new Error(stderr); } } async function query(ccName, func, args, transient) { - let cmd; + let cmd = `export PATH=${dir}/bin:$PATH && export FABRIC_CFG_PATH=${dir}/config/ && ` + + `export CORE_PEER_TLS_ENABLED=true && export CORE_PEER_LOCALMSPID="Org2MSP" && ` + + `export CORE_PEER_TLS_ROOTCERT_FILE=${dir}/test-network/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt && ` + + `export CORE_PEER_MSPCONFIGPATH=${dir}/test-network/organizations/peerOrganizations/org2.example.com/users/buyer@org2.example.com/msp && ` + + `export CORE_PEER_ADDRESS=localhost:9051 && `; if (transient) { - cmd = `docker exec org2_cli peer chaincode query ${getTLSArgs()} -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --transient '${transient}' 2>&1`; + cmd += `peer chaincode query ${getTLSArgs()} -C mychannel -n ${ccName} -c '${printArgs(func, args)}' --transient '${transient}' 2>&1`; } else { - cmd = `docker exec org2_cli peer chaincode query ${getTLSArgs()} -C mychannel -n ${ccName} -c '${printArgs(func, args)}' 2>&1`; + cmd += `peer chaincode query ${getTLSArgs()} -C mychannel -n ${ccName} -c '${printArgs(func, args)}' 2>&1`; } const {error, stdout, stderr} = await exec(cmd); if (error) { @@ -95,13 +114,18 @@ async function query(ccName, func, args, transient) { return stdout.trim().replace(/^"(.*)"$/, '$1').replace(/\\"/g, '"'); // remove surrounding quotes and unescape } -async function installAndInstantiate(ccName, instantiateFunc, instantiateArgs) { - await install(ccName); +async function installAndInstantiate(ccName, instantiateFunc, instantiateArgs, transient = false) { + await install(ccName, transient); return instantiate(ccName, instantiateFunc, instantiateArgs); } async function getLastBlock() { - const cmd = 'docker exec org1_cli bash -c "peer channel fetch newest -c mychannel /tmp/mychannel.block && configtxlator proto_decode --type common.Block --input=/tmp/mychannel.block"'; + const cmd = `export PATH=${dir}/bin:$PATH && export FABRIC_CFG_PATH=${dir}/config/ && ` + + `export CORE_PEER_TLS_ENABLED=true && export CORE_PEER_LOCALMSPID="Org2MSP" && ` + + `export CORE_PEER_TLS_ROOTCERT_FILE=${dir}/test-network/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt && ` + + `export CORE_PEER_MSPCONFIGPATH=${dir}/test-network/organizations/peerOrganizations/org2.example.com/users/buyer@org2.example.com/msp && ` + + `export CORE_PEER_ADDRESS=localhost:9051 && ` + + 'peer channel fetch newest -c mychannel /tmp/mychannel.block && configtxlator proto_decode --type common.Block --input=/tmp/mychannel.block --output=/tmp/output && cat /tmp/output'; const {error, stdout, stderr} = await exec(cmd); if (error) { throw new Error(error, stderr); @@ -118,4 +142,4 @@ const TIMEOUTS = { MED_INC : 10 * 1000 * multiplier, SHORT_INC: 5 * 1000 * multiplier }; -module.exports = {installAndInstantiate, invoke, query, getLastBlock, TIMEOUTS}; +module.exports = {installAndInstantiate, invoke, query, getLastBlock, TIMEOUTS, registerAndEnroll}; diff --git a/tools/azure-mocha-reporter/index.js b/tools/azure-mocha-reporter/index.js deleted file mode 100644 index 82d8c557..00000000 --- a/tools/azure-mocha-reporter/index.js +++ /dev/null @@ -1,31 +0,0 @@ -let mocha = require('mocha'); -let MochaJUnitReporter = require('mocha-junit-reporter'); - -/** - * Create a very simple multi reporter to split the results to both the standard - * 'Spec' reports but also the 'mocha-junit-reporter' for the Azure Pipeline - */ -class AzureFriendlyReporter{ - - constructor(runner,options){ - this.reports = []; - - //the name Spec is defined by mocha as one of the built in types - let reporterClass = mocha.reporters['Spec']; - this.reports.push(new reporterClass(runner,options)); - - // additional class - let junit = new MochaJUnitReporter(runner,options); - this.reports.push(junit); - - } - - epilogue() { - this.reports.forEach( (reportInstance)=> { - reportInstance.epilogue(); - }); - } -} - -module.exports = AzureFriendlyReporter; - diff --git a/tools/azure-mocha-reporter/package.json b/tools/azure-mocha-reporter/package.json deleted file mode 100644 index 2bf31268..00000000 --- a/tools/azure-mocha-reporter/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "azure-mocha-reporter", - "version": "1.0.0", - "description": "Very simple spliter for mocah to Spec (humans) and JUnit format (AzurePipelines)", - "main": "index.js", - "scripts": { - "build": "" - }, - "author": "", - "license": "Apache-2.0", - "dependencies": { - }, - "devDependencies": { - "mocha-junit-reporter": "1.23.1", - "mocha": "6.2.2" - } -} diff --git a/tools/getEdgeDocker.sh b/tools/getEdgeDocker.sh index faf20241..af944890 100755 --- a/tools/getEdgeDocker.sh +++ b/tools/getEdgeDocker.sh @@ -1,63 +1,22 @@ -#!/bin/bash -e -set -o pipefail - -echo "======== PULL DOCKER IMAGES ========" - -########################################################## -# Pull and Tag the fabric and fabric-ca images from Nexus -########################################################## -echo "Fetching images from Nexus" -NEXUS_URL=nexus3.hyperledger.org:10001 -ORG_NAME="hyperledger/fabric" - -VERSION=2.0.0 -ARCH="amd64" -: ${STABLE_VERSION:=$VERSION-stable} -STABLE_TAG=$ARCH-$STABLE_VERSION -MASTER_TAG=$ARCH-master - -echo "---------> STABLE_VERSION:" $STABLE_VERSION - -# Specifically not pulling down javaenv nodeenv -# javaenv not needed and we've just rebuilt the nodeenv - -dockerTag() { - for IMAGES in peer orderer ca ca orderer baseos ccenv tools; do - echo "Images: $IMAGES" - echo - docker pull $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG - if [ $? != 0 ]; then - echo "FAILED: Docker Pull Failed on $IMAGES" - exit 1 - fi - docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG $ORG_NAME-$IMAGES - docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG $ORG_NAME-$IMAGES:$MASTER_TAG - echo "$ORG_NAME-$IMAGES:$MASTER_TAG" - echo "Deleting Nexus docker images: $IMAGES" - docker rmi -f $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG - done -} - -dockerTag2() { - for IMAGES in baseos ccenv; do - echo "Images: $IMAGES" - echo - docker pull $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG - if [ $? != 0 ]; then - echo "FAILED: Docker Pull Failed on $IMAGES" - exit 1 - fi - docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG $ORG_NAME-$IMAGES - docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG $ORG_NAME-$IMAGES:$VERSION - echo "$ORG_NAME-$IMAGES:$VERSION" - echo "Deleting Nexus docker images: $IMAGES" - docker rmi -f $NEXUS_URL/$ORG_NAME-$IMAGES:$STABLE_TAG - done -} - -dockerTag -dockerTag2 - -echo -docker images | grep "hyperledger*" -echo \ No newline at end of file +#!/bin/bash +# +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +set -euo pipefail + +version=${FABRIC_VERSION:-2.2} +artifactory_url=hyperledger-fabric.jfrog.io + +for image in peer orderer ca baseos ccenv tools; do + artifactory_image="${artifactory_url}/fabric-${image}:amd64-${version}-stable" + docker pull -q "${artifactory_image}" + docker tag "${artifactory_image}" "hyperledger/fabric-${image}" + docker rmi -f "${artifactory_image}" >/dev/null +done + +docker pull -q couchdb:3.1 +docker pull -q hyperledger/fabric-ca:1.4 +docker tag hyperledger/fabric-ca:1.4 hyperledger/fabric-ca +docker rmi hyperledger/fabric-ca:1.4 >/dev/null \ No newline at end of file diff --git a/tools/scripts/changelog.sh b/tools/scripts/changelog.sh index 56968b25..a342d878 100755 --- a/tools/scripts/changelog.sh +++ b/tools/scripts/changelog.sh @@ -4,11 +4,17 @@ # # SPDX-License-Identifier: Apache-2.0 # - set -ev -echo "## $2\n$(date)" >> CHANGELOG.new + +PREVIOUS_TAG=$1 +NEW_VERSION=$2 + +: ${PREVIOUS_TAG:?} +: ${NEW_VERSION:?} + +echo "## ${NEW_VERSION}\n$(date)" >> CHANGELOG.new echo "" >> CHANGELOG.new -git log $1..HEAD --oneline | grep -v Merge | sed -e "s/\[\(FAB-[0-9]*\)\]/\[\1\](https:\/\/jira.hyperledger.org\/browse\/\1\)/" -e "s/ \(FAB-[0-9]*\)/ \[\1\](https:\/\/jira.hyperledger.org\/browse\/\1\)/" -e "s/\([0-9|a-z]*\)/* \[\1\](https:\/\/github.com\/hyperledger\/fabric-chaincode-node\/commit\/\1)/" >> CHANGELOG.new +git log ${PREVIOUS_TAG}..HEAD --oneline | grep -v Merge | sed -e "s/\[\{0,1\}\(FAB[^0-9]*-[0-9]*\)\]\{0,1\}/\[\1\](https:\/\/jira.hyperledger.org\/browse\/\1\)/" -e "s/\([0-9|a-z]*\)/* \[\1\](https:\/\/github.com\/hyperledger\/fabric-chaincode-node\/commit\/\1)/" >> CHANGELOG.new echo "" >> CHANGELOG.new cat CHANGELOG.md >> CHANGELOG.new mv -f CHANGELOG.new CHANGELOG.md diff --git a/tools/scripts/release.sh b/tools/scripts/release.sh deleted file mode 100755 index 9ce49507..00000000 --- a/tools/scripts/release.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash -# Release process for the Java chaincode is this -# -# > Work from the latest release-1.4 branch -# > Write a new release notes file along the lines of the the existing files -# > Run the script -# -# ./scripts/release.sh -# -# This will change the version to the correct release version and set the tag to mark the package -# as npm publishable by the merge builds -# > Submit this to gerrit with this push command -# -# git push origin HEAD:refs/for/release-1.4 -# -# > When the build has complete, git pull to update your branch -# > To tag in gerrit run -# -# ./scripts/gittag.sh -# -# > To update the version to a new snapshot leve run the -# -# NEW_SUFFIX=snapshot ./scripts/release.sh -# -# > Push these changes as per normal - - -# Exit on first error, print all commands. -set -e -set -o pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" - -function abort { - echo "!! Exiting shell script" - echo "!!" "$1" - exit -1 -} - -# need determine the release version -# Suffix can be added after the version eg rc or beta etc. -if [ -z ${NEW_SUFFIX+x} ]; then - echo Suffix is not specified using pure version number - NEW_VERSION=$(jq '.version' ${DIR}/package.json | sed -r "s/\"([0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]?[0-9])-.*/\1/") - NEW_TAG="latest" -elif [[ ${NEW_SUFFIX} == 'snapshot' ]]; then - echo new suffix is ${NEW_SUFFIX} - CURRENT_VERSION=$(jq '.version' ${DIR}/package.json | sed -r "s/\"([0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]?[0-9])(.)*/\1/") - NEW_VERSION=$( ${DIR}/node_modules/.bin/semver -i ${CURRENT_VERSION} )-snapshot - NEW_TAG="2.0.0-beta" -else # for beta, rc etc releases where the version doesn't change - echo new suffix is ${NEW_SUFFIX} - NEW_VERSION=$(jq '.version' ${DIR}/package.json | sed -r "s/\"([0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]?[0-9])(.)*/\1-${NEW_SUFFIX}/") - NEW_TAG="${NEW_SUFFIX}-2.0" -fi - -echo New version string will be "${NEW_VERSION}" - -# do the release notes and changelog for this new version exist if needed -if [[ ${NEW_TAG} == 'latest' ]]; then - if [[ -f "${DIR}/release_notes/v${NEW_VERSION}.txt" ]]; then - echo "Release notes exist, hope they make sense!" - else - abort "No releases notes under the file ${DIR}/release_notes/v${NEW_VERSION}.txt exist"; - fi - - OLD_VERSION=$(cat ./CHANGELOG.md | sed -n 1p | sed -n -e "s/.*v\(.*\)/\1/p") - echo Previous version is v${OLD_VERSION} - - echo "Writing change log..." - "${DIR}/scripts/changelog.sh" "v${OLD_VERSION}" "v${NEW_VERSION}" - echo "...done" -fi - -# need to modify the package.json versions now to represent the updates -for PACKAGE in fabric-shim-crypto fabric-shim fabric-contract-api -do - jq --arg VERSION "${NEW_VERSION}" --arg TAG "${NEW_TAG}" '.version = $VERSION | .tag = $TAG ' ${DIR}/${PACKAGE}/package.json > ".tmp" && mv ".tmp" ${DIR}/${PACKAGE}/package.json -done - -jq --arg VERSION "${NEW_VERSION}" '.version = $VERSION' ${DIR}/package.json > ".tmp" && mv ".tmp" ${DIR}/package.json -# This is a optional operation that can be done at any point to update the -# test to use a specific version of Fabric docker images etc -# - -if [[ ${NEW_TAG} == 'latest' ]]; then - echo "Please verify that all is well with the changes, add, comit and push to gerrit with" - echo "" - echo "git push origin HEAD:refs/for/release-1.4" - echo "" - echo "Wait for build to happen, which will push NPM modules, then run ./scripts/gittag.sh" -else - echo "Please verify that all is well with the changes, and, commit and push to gerrit as normal" -fi \ No newline at end of file diff --git a/tools/scripts/updateversions.sh b/tools/scripts/updateversions.sh new file mode 100755 index 00000000..a05b3773 --- /dev/null +++ b/tools/scripts/updateversions.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Note uses bash4.4 or later features, and sponge from GNU moreutils +set -eo pipefail + +if [ -z $1 ]; then + echo "Need to have the first arg set to the new package.json version " + exit 1 +fi + +NEW_VERSION=$1 +echo "Setting new version to '${NEW_VERSION}'" + +readarray -d '' PACKAGES < <(find . -name package.json -not -path '*/node_modules/*' -not -path '*/common/*') + +for PACKAGE in ${PACKAGES} +do + echo "Updating '${PACKAGE}'" + jq --arg VER "${NEW_VERSION}" '.version=$VER' "${PACKAGE}" | sponge "${PACKAGE}" +done diff --git a/tools/toolchain/fabric.js b/tools/toolchain/fabric.js index 9310e74f..78cb30a5 100644 --- a/tools/toolchain/fabric.js +++ b/tools/toolchain/fabric.js @@ -25,9 +25,11 @@ const tls = require('./utils').tls; const arch = process.arch; const release = require(path.join(__dirname, '../../package.json')).testFabricVersion; +const ca_release = require(path.join(__dirname, '../../package.json')).testFabricCAVersion; const thirdparty_release = require(path.join(__dirname, '../../package.json')).testFabricThirdParty; let dockerImageTag = ''; +let caImageTag = ''; let thirdpartyImageTag = ''; let docker_arch = ''; @@ -43,6 +45,9 @@ if (arch.indexOf('x64') === 0) { throw new Error('Unknown architecture: ' + arch); } +// always use specific published version of CA image +caImageTag = docker_arch + '-' + ca_release; + // release check, if master is specified then we are using a fabric that has been // built from source, otherwise we are using specific published versions. @@ -55,6 +60,7 @@ if (!/master/.test(release)) { } // these environment variables would be read at test/fixtures/docker-compose.yaml process.env.DOCKER_IMG_TAG = dockerImageTag; +process.env.CA_IMG_TAG = caImageTag; process.env.THIRDPARTY_IMG_TAG = thirdpartyImageTag; process.env.DOCKER_DEVMODE = process.env.DEVMODE ? process.env.DEVMODE : 'true'; @@ -72,9 +78,12 @@ const _docker_clean = async () => { // stop and remove chaincode docker instances 'docker kill $(docker ps | grep "dev-peer0.org[12].example.com" | awk \'{print $1}\') || echo ok', 'docker rm $(docker ps -a | grep "dev-peer0.org[12].example.com" | awk \'{print $1}\') || echo ok', + 'docker kill $(docker ps | grep "cc-server" | awk \'{print $1}\') || echo ok', + 'docker rm $(docker ps -a | grep "cc-server" | awk \'{print $1}\') || echo ok', // remove chaincode images so that they get rebuilt during test 'docker rmi $(docker images | grep "^dev-peer0.org[12].example.com" | awk \'{print $3}\') || echo ok', + 'docker rmi $(docker images | grep "^chaincode-e2e-server" | awk \'{print $3}\') || echo ok', // clean up all the containers created by docker-compose util.format('docker-compose -f %s down --volumes', fs.realpathSync(path.join(dockerComposeDir, 'docker-compose-cli.yaml'))), @@ -134,6 +143,10 @@ const _generate_config = async () => { 'docker exec cli cp /etc/hyperledger/fabric/core.yaml %s', dockerCfgPath ), + util.format( + 'docker exec cli sed -i \'s/externalBuilders: \\[\\]/externalBuilders: [{path: \\/opt\\/chaincode, name: test}]/\' %s/core.yaml', + dockerCfgPath + ), util.format( 'docker exec cli sh %s/rename_sk.sh', dockerCfgPath @@ -172,8 +185,8 @@ const dockerReady = series(generateConfig, _start_docker); async function _channel_init() { await runcmds([ // create channel, join peer0 to the channel - 'docker exec org1_cli /etc/hyperledger/fixtures/channel-init.sh', - 'docker exec org2_cli /etc/hyperledger/fixtures/channel-init.sh' + 'docker exec peer0.org1.example.com /etc/hyperledger/fixtures/channel-init.sh', + 'docker exec peer0.org2.example.com /etc/hyperledger/fixtures/channel-init.sh' ]); } @@ -181,7 +194,7 @@ async function _channel_create() { await delay(3000); await runcmds([ util.format( - 'docker exec org1_cli peer channel create -o orderer.example.com:7050 -c %s -f %s/channel.tx --outputBlock %s/mychannel.block %s', + 'docker exec peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c %s -f %s/channel.tx --outputBlock %s/mychannel.block %s', channelName, dockerCfgTxPath, dockerCfgTxPath, @@ -191,10 +204,18 @@ async function _channel_create() { ]); } +async function _peer_setup() { + // Install the 'jq' command in the peer containers to run external builder scripts. + await runcmds([ + 'docker exec peer0.org1.example.com apk add jq', + 'docker exec peer0.org2.example.com apk add jq', + ]); +} + const channelSetup = series(_channel_create, _channel_init); // -- -const startFabric = series(dockerReady, channelSetup); +const startFabric = series(dockerReady, _peer_setup, channelSetup); exports.default = startFabric; exports.stopFabric = series(_docker_clean); diff --git a/tools/toolchain/index.js b/tools/toolchain/index.js index fe8147dd..a5e56124 100644 --- a/tools/toolchain/index.js +++ b/tools/toolchain/index.js @@ -1,5 +1,7 @@ const {shell} = require('./shell/cmd'); -const getTLSArgs = require('./utils').getTLSArgs; +const {getTLSArgs, getPeerAddresses} = require('./utils'); + module.exports.shell = shell; -module.exports.getTLSArgs = getTLSArgs; \ No newline at end of file +module.exports.getTLSArgs = getTLSArgs; +module.exports.getPeerAddresses = getPeerAddresses; diff --git a/tools/toolchain/network/crypto-material/configtx.yaml b/tools/toolchain/network/crypto-material/configtx.yaml index 65477c63..20ddc67c 100644 --- a/tools/toolchain/network/crypto-material/configtx.yaml +++ b/tools/toolchain/network/crypto-material/configtx.yaml @@ -39,20 +39,20 @@ Capabilities: # Channel capabilities apply to both the orderers and the peers and must be # supported by both. Set the value of the capability to true to require it. Channel: &ChannelCapabilities - V1_1: true + V2_0: true # Orderer capabilities apply only to the orderers, and may be safely # manipulated without concern for upgrading peers. Set the value of the # capability to true to require it. Orderer: &OrdererCapabilities - V1_1: true + V2_0: true # Application capabilities apply only to the peer network, and may be # safely manipulated without concern for upgrading orderers. Set the value # of the capability to true to require it. Application: &ApplicationCapabilities - V1_2: true - V1_1: false + V2_0: true + ################################################################################ # # CHANNEL diff --git a/tools/toolchain/network/crypto-material/core.yaml b/tools/toolchain/network/crypto-material/core.yaml index 93c58307..a9087f16 100644 --- a/tools/toolchain/network/crypto-material/core.yaml +++ b/tools/toolchain/network/crypto-material/core.yaml @@ -50,7 +50,7 @@ peer: interval: 7200s # Timeout is the duration the server waits for a response # from the client after sending a ping before closing the connection - timeout: 20s + timeout: 120s # MinInterval is the minimum permitted time between client pings. # If clients send pings more frequently, the peer server will # disconnect them @@ -63,7 +63,7 @@ peer: interval: 60s # Timeout is the duration the client waits for a response from # peer nodes before closing the connection - timeout: 20s + timeout: 120s # DeliveryClient keepalive settings for communication with ordering # nodes. deliveryClient: diff --git a/tools/toolchain/network/docker-compose/docker-compose-base.yaml b/tools/toolchain/network/docker-compose/docker-compose-base.yaml index 435ce9d7..27228aa2 100644 --- a/tools/toolchain/network/docker-compose/docker-compose-base.yaml +++ b/tools/toolchain/network/docker-compose/docker-compose-base.yaml @@ -15,7 +15,7 @@ version: '2' services: ca0: - image: hyperledger/fabric-ca${DOCKER_IMG_TAG} + image: hyperledger/fabric-ca${CA_IMG_TAG} environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca-org1 @@ -29,7 +29,7 @@ services: container_name: ca_peerOrg1 ca1: - image: hyperledger/fabric-ca${DOCKER_IMG_TAG} + image: hyperledger/fabric-ca${CA_IMG_TAG} environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca-org2 @@ -92,13 +92,18 @@ services: # # bridge network as the peers # # https://docs.docker.com/compose/networking/ - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=node_default - - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.0.0-beta.1 + - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.2.4-unstable # Allow more time for chaincode container to build on install. - CORE_CHAINCODE_EXECUTETIMEOUT=300s + + - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin + - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw working_dir: /opt/gopath/src/github.com/hyperledger/fabric command: peer node start --peer-chaincodedev=${DOCKER_DEVMODE} volumes: - /var/run/:/host/var/run/ + - ../external:/opt/chaincode/bin:ro + - ../crypto-material/core.yaml:/etc/hyperledger/fabric/core.yaml:ro clibase: extends: @@ -127,4 +132,7 @@ services: couchdb: container_name: couchdb - image: hyperledger/fabric-couchdb${THIRDPARTY_IMG_TAG} \ No newline at end of file + image: couchdb:3.1 + environment: + - COUCHDB_USER=admin + - COUCHDB_PASSWORD=adminpw diff --git a/tools/toolchain/network/docker-compose/docker-compose-cli.yaml b/tools/toolchain/network/docker-compose/docker-compose-cli.yaml index 42255430..7e1d354b 100644 --- a/tools/toolchain/network/docker-compose/docker-compose-cli.yaml +++ b/tools/toolchain/network/docker-compose/docker-compose-cli.yaml @@ -30,4 +30,5 @@ services: command: /bin/bash volumes: - /var/run/:/host/var/run/ - - ../crypto-material:/etc/hyperledger/config/ \ No newline at end of file + - ../crypto-material:/etc/hyperledger/config/ + - ../../../../test/chaincodes/privateData/collection-config:/collection-config diff --git a/tools/toolchain/network/external/build b/tools/toolchain/network/external/build new file mode 100755 index 00000000..6773ec16 --- /dev/null +++ b/tools/toolchain/network/external/build @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +set -e + +SOURCE="$1" +OUTPUT="$3" + +if [ ! -f "${SOURCE}/connection.json" ]; then + echo "Error: ${SOURCE}/connection.json not found" 1>&2 + exit 1 +fi + +cp "${SOURCE}/connection.json" "${OUTPUT}/connection.json" + +if [ -d "${SOURCE}/metadata" ]; then + cp -a ${SOURCE}/metadata ${OUTPUT}/metadata +fi + +exit 0 diff --git a/tools/toolchain/network/external/detect b/tools/toolchain/network/external/detect new file mode 100755 index 00000000..6ef69b54 --- /dev/null +++ b/tools/toolchain/network/external/detect @@ -0,0 +1,15 @@ +#!/bin/sh +# +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +set -e + +METADIR="$2" + +if [ `jq -r .type "${METADIR}/metadata.json"` = "external" ]; then + exit 0 +fi + +exit 1 diff --git a/tools/toolchain/network/external/release b/tools/toolchain/network/external/release new file mode 100755 index 00000000..b4ea54c1 --- /dev/null +++ b/tools/toolchain/network/external/release @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Copyright Hitachi America, Ltd. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +set -e + +BUILD="$1" +RELEASE="$2" + +if [ -d "${BUILD}/metadata" ]; then + cp -a "${BUILD}/metadata/*" "${RELEASE}/" +fi + +if [ -f "${BUILD}/connection.json" ]; then + mkdir -p "${RELEASE}/chaincode/server" + cp "${BUILD}/connection.json" "${RELEASE}/chaincode/server" + + # TODO: TLS + + exit 0 +fi diff --git a/tools/toolchain/package.json b/tools/toolchain/package.json index 74ec537c..af264332 100644 --- a/tools/toolchain/package.json +++ b/tools/toolchain/package.json @@ -12,14 +12,16 @@ "license": "Apache-2.0", "dependencies": { "delay": "4.3.0", - "fs-extra": "8.1.0", + "fs-extra": "^9.0.1", "git-rev-sync": "1.12.0", "gulp-debug": "~4.0.0", "gulp-eslint": "~6.0.0", "gulp-rename": "~1.4.0", "gulp-shell": "~0.7.1", "merge-stream": "~2.0.0", - "npm-cli-login": "~0.1.1" + "npm-cli-login": "~0.1.1", + "ip":"1.1.5", + "gulp-cli":"2.3.0" }, "devDependencies": { "gulp": "^4.0.0" diff --git a/tools/toolchain/utils.js b/tools/toolchain/utils.js index f0e82c23..424457c6 100644 --- a/tools/toolchain/utils.js +++ b/tools/toolchain/utils.js @@ -1,13 +1,24 @@ -const ordererCA = '/etc/hyperledger/config/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem'; +const path = require('path'); + +const ordererCA = '/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem'; +const org1CA = '/etc/hyperledger/config/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem'; +const org2CA = '/etc/hyperledger/config/crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem'; +const dir = path.join(__dirname, '..', '..', 'fabric-samples'); const tls = process.env.TLS && process.env.TLS.toLowerCase() === 'true' ? true : false; exports.tls = tls; exports.getTLSArgs = () => { + return `--tls true --cafile ${dir}` + ordererCA; +}; + +exports.getPeerAddresses = () => { if (tls) { - return '--tls true --cafile ' + ordererCA; + return '--peerAddresses peer0.org1.example.com:7051 --tlsRootCertFile ' + org1CA + + ' --peerAddresses peer0.org2.example.com:8051 --tlsRootCertFile ' + org2CA; + } else { + return '--peerAddresses peer0.org1.example.com:7051' + + ' --peerAddresses peer0.org2.example.com:8051'; } - - return ''; }; diff --git a/tools/toolchain/verdaccio/index.js b/tools/toolchain/verdaccio/index.js index 2c5419b5..5a0d0db5 100644 --- a/tools/toolchain/verdaccio/index.js +++ b/tools/toolchain/verdaccio/index.js @@ -10,6 +10,7 @@ const gulp = require('gulp'); const { shell: runcmds } = require('../shell/cmd'); const util = require('util'); const path = require('path'); +const ip = require('ip'); // Install from the dirs for use within the development context const installDir = (commands) =>{ @@ -24,8 +25,8 @@ const installDir = (commands) =>{ const packageJSON = require(`../../../${npm_package.category}/${npm_package.name}/package.json`); const npm_tag = packageJSON.tag; const modulepath = path.resolve(`../../../${npm_package.category}/${npm_package.name}/`); - commands.push(util.format('npm publish --registry http://localhost:4873 %s --tag %s', modulepath, npm_tag)); - commands.push(util.format('npm view --registry http://localhost:4873 %s', npm_package.name)); + commands.push(util.format(`npm publish --registry http://${ip.address()}:4873 %s --tag %s`, modulepath, npm_tag)); + commands.push(util.format(`npm view --registry http://${ip.address()}:4873 %s`, npm_package.name)); } return commands; @@ -44,8 +45,8 @@ const installTGZ = (commands) =>{ const packageJSON = require(`../../../${npm_package.category}/${npm_package.name}/package.json`); const npm_tag = packageJSON.tag; const name = `${npm_package.name}-${packageJSON.version}.tgz`; - commands.push(util.format('npm publish --registry http://localhost:4873 ../../../build/%s --tag %s', name, npm_tag)); - commands.push(util.format('npm view --registry http://localhost:4873 %s', npm_package.name)); + commands.push(util.format(`npm publish --registry http://${ip.address()}:4873 ../../../build/%s --tag %s`, name, npm_tag)); + commands.push(util.format(`npm view --registry http://${ip.address()}:4873 %s`, npm_package.name)); } @@ -58,8 +59,8 @@ const verdaccioStart = async () => { 'docker rm -f verdaccio || true', util.format('docker run -d -p 4873:4873 -v %s/config.yaml:/verdaccio/conf/config.yaml --name verdaccio verdaccio/verdaccio', __dirname), 'sleep 5', // verdaccio takes a while to start - 'npm config delete //localhost:4873/:_authToken', - 'npm-cli-login -u testuser -p testpass -e testuser@example.org -r http://localhost:4873', + `npm config delete //${ip.address()}:4873/:_authToken`, + `npm-cli-login -u testuser -p testpass -e testuser@example.org -r http://${ip.address()}:4873`, 'sleep 5' // avoid "jwt not active" error ];