├── .eslintrc.json ├── .github └── workflows │ └── config.yml ├── .gitignore ├── .travis.yml ├── LICENSE.md ├── README.md ├── config.json ├── demo ├── lib │ ├── oracles-contract-ballot │ │ └── src │ │ │ └── BallotClass.sol │ ├── oracles-contract-key │ │ └── src │ │ │ └── KeyClass.sol │ └── oracles-contract-validator │ │ └── src │ │ └── ValidatorClass.sol └── src │ ├── BallotsManager.sol │ ├── KeysManager.sol │ ├── Oracles.sol │ ├── ValidatorsManager.sol │ └── owned.sol ├── helpers ├── change-relative-path-to-absolute.js ├── clean-path.js ├── constants.js ├── deduplicate-lines.js ├── find-all-import-paths.js ├── find-file.js ├── logger.js ├── replace-all-imports-in-current-layer.js ├── replace-all-imports-recursively.js ├── update-import-object-location-in-target.js └── variables.js ├── index.js ├── package-lock.json ├── package.json └── test ├── contracts ├── dep.sol ├── dep2.sol ├── test.sol └── testMock1.sol ├── helpers ├── change-relative-path-to-absolute.js └── clean-path.js └── index.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "amd": true, 6 | "node": true, 7 | "mocha": true 8 | }, 9 | "extends": "eslint:recommended", 10 | "parserOptions": { 11 | "ecmaVersion": 2018, 12 | "sourceType": "module" 13 | }, 14 | "rules": { 15 | "indent": [ 16 | "error", 17 | "tab" 18 | ], 19 | "linebreak-style": [ 20 | "error", 21 | "unix" 22 | ], 23 | "quotes": [ 24 | "error", 25 | "single" 26 | ], 27 | "semi": [ 28 | "error", 29 | "never" 30 | ], 31 | "no-trailing-spaces": [ 32 | "error" 33 | ] 34 | } 35 | } -------------------------------------------------------------------------------- /.github/workflows/config.yml: -------------------------------------------------------------------------------- 1 | name: Solidity flattener CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | node-version: [14, 16, 18] 18 | 19 | steps: 20 | - uses: actions/checkout@v1 21 | - name: Use Node.js ${{ matrix.node-version }} 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | - name: Install, test 26 | run: | 27 | npm install 28 | npm test 29 | env: 30 | CI: true 31 | 32 | checkCodestyle: 33 | runs-on: ubuntu-latest 34 | steps: 35 | - uses: actions/checkout@v1 36 | - name: Use Node.js ${{ matrix.node-version }} 37 | uses: actions/setup-node@v3 38 | with: 39 | node-version: '18.x' 40 | - name: Install and check codestyle 41 | run: | 42 | npm install 43 | npm run lint 44 | env: 45 | CI: true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /coverage 3 | .DS_Store 4 | /out -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 12 4 | cache: 5 | directories: 6 | - node_modules 7 | 8 | script: 9 | - npm run lint && npm run test && npm run coveralls -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2017 Oracles Network 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Solidity smart-contract flattened source file generation 2 | 3 | [![Build Status](https://travis-ci.org/poanetwork/solidity-flattener.svg?branch=master)](https://travis-ci.org/poanetwork/solidity-flattener) 4 | [![Known Vulnerabilities](https://snyk.io/test/github/poanetwork/solidity-flattener/badge.svg)](https://snyk.io/test/github/poanetwork/solidity-flattener) 5 | [![Coverage Status](https://coveralls.io/repos/github/poanetwork/solidity-flattener/badge.svg?branch=master)](https://coveralls.io/github/poanetwork/solidity-flattener?branch=master) 6 | 7 | ## Utility to combine all imports to one flatten .sol file 8 | 9 | ### Installation from npm 10 | 11 | `npm i @poanet/solidity-flattener` 12 | 13 | ### Usage 14 | 15 | `./node_modules/.bin/poa-solidity-flattener ./contracts/example.sol` 16 | 17 | It will save flattened source of Solidity smart-contract into `./out` directory 18 | 19 | ### Installation from source 20 | 21 | 22 | ``` 23 | git clone https://github.com/poanetwork/solidity-flattener 24 | cd solidity-flattener 25 | npm install 26 | ``` 27 | 28 | You can start script either 29 | 30 | ``` 31 | npm start "path_to_not_flat_contract_definition_file.sol" 32 | ``` 33 | 34 | or without paramaters (path to input file will be extracted from `./config.json`) 35 | 36 | ``` 37 | npm start 38 | ``` 39 | 40 | 41 | 42 | Expected result: 43 | 44 | ``` 45 | Success! Flat file ORIGINAL_FILE_NAME_flat.sol is generated to ./out directory 46 | ``` 47 | 48 | `./flatContract.sol` - flat .sol file is created in output directory (`./out/` by default) 49 | 50 | **Note:** *utility doesn't support aliases at import statements* 51 | 52 | ## Config 53 | 54 | path `./config.json` 55 | 56 | ``` 57 | { 58 | "inputFilePath": "./demo/src/Oracles.sol", 59 | "outputDir": "./out" 60 | } 61 | ``` 62 | 63 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "inputFilePath": "./demo/src/Oracles.sol", 3 | "outputDir": "./out" 4 | } -------------------------------------------------------------------------------- /demo/lib/oracles-contract-ballot/src/BallotClass.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | contract BallotClass { 4 | uint[] public ballots; 5 | uint public votingLowerLimit = 3; 6 | 7 | struct Ballot { 8 | address owner; 9 | address miningKey; 10 | address affectedKey; 11 | string memo; 12 | uint affectedKeyType; 13 | uint createdAt; 14 | uint votingStart; 15 | uint votingDeadline; 16 | int votesAmmount; 17 | int result; 18 | bool addAction; 19 | bool active; 20 | mapping (address => bool) voted; 21 | } 22 | 23 | mapping(uint => Ballot) public ballotsMapping; 24 | } -------------------------------------------------------------------------------- /demo/lib/oracles-contract-key/src/KeyClass.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | contract KeyClass { 4 | struct InitialKey { 5 | bool isNew; 6 | } 7 | 8 | struct MiningKey { 9 | bool isActive; 10 | } 11 | 12 | struct PayoutKey { 13 | bool isActive; 14 | } 15 | 16 | struct VotingKey { 17 | bool isActive; 18 | } 19 | 20 | mapping(address => MiningKey) public miningKeys; 21 | mapping(address => PayoutKey) public payoutKeys; 22 | mapping(address => VotingKey) public votingKeys; 23 | mapping(address => InitialKey) public initialKeys; 24 | mapping(address => address) public votingMiningKeysPair; 25 | mapping(address => address) public miningPayoutKeysPair; 26 | } -------------------------------------------------------------------------------- /demo/lib/oracles-contract-validator/src/ValidatorClass.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | contract ValidatorClass { 4 | address[] public validators; 5 | address[] public disabledValidators; 6 | 7 | struct Validator { 8 | string fullName; 9 | string streetName; 10 | string state; 11 | uint zip; 12 | uint licenseID; 13 | uint licenseExpiredAt; 14 | uint disablingDate; 15 | string disablingTX; 16 | } 17 | 18 | mapping(address => Validator) public validator; 19 | } -------------------------------------------------------------------------------- /demo/src/BallotsManager.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | import "./ValidatorsManager.sol"; 4 | 5 | contract BallotsManager is ValidatorsManager { 6 | /** 7 | @notice Adds new Ballot 8 | @param ballotID Ballot unique ID 9 | @param owner Voting key of notary, who creates ballot 10 | @param miningKey Mining key of notary, which is proposed to add or remove 11 | @param affectedKey Mining/payout/voting key of notary, which is proposed to add or remove 12 | @param affectedKeyType Type of affectedKey: 0 = mining key, 1 = voting key, 2 = payout key 13 | @param addAction Flag: adding is true, removing is false 14 | @param memo Ballot's memo 15 | */ 16 | function addBallot( 17 | uint ballotID, 18 | address owner, 19 | address miningKey, 20 | address affectedKey, 21 | uint affectedKeyType, 22 | bool addAction, 23 | string memo 24 | ) { 25 | if (!checkVotingKeyValidity(msg.sender)) throw; 26 | if (licensesIssued == licensesLimit && addAction) throw; 27 | if (ballotsMapping[ballotID].createdAt > 0) throw; 28 | if (affectedKeyType == 0) {//mining key 29 | bool validatorIsAdded = false; 30 | for (uint i = 0; i < validators.length; i++) { 31 | if (validators[i] == affectedKey && addAction) throw; //validator is already added before 32 | if (validators[i] == affectedKey) { 33 | validatorIsAdded = true; 34 | break; 35 | } 36 | } 37 | for (uint j = 0; j < disabledValidators.length; j++) { 38 | if (disabledValidators[j] == affectedKey) throw; //validator is already removed before 39 | } 40 | if (!validatorIsAdded && !addAction) throw; // no such validator in validators array to remove it 41 | } else if (affectedKeyType == 1) {//voting key 42 | if (checkVotingKeyValidity(affectedKey) && addAction) throw; //voting key is already added before 43 | if (!checkVotingKeyValidity(affectedKey) && !addAction) throw; //no such voting key to remove it 44 | } else if (affectedKeyType == 2) {//payout key 45 | if (checkPayoutKeyValidity(affectedKey) && addAction) throw; //payout key is already added before 46 | if (!checkPayoutKeyValidity(affectedKey) && !addAction) throw; //no such payout key to remove it 47 | } 48 | uint votingStart = now; 49 | ballotsMapping[ballotID] = Ballot({ 50 | owner: owner, 51 | miningKey: miningKey, 52 | affectedKey: affectedKey, 53 | memo: memo, 54 | affectedKeyType: affectedKeyType, 55 | createdAt: now, 56 | votingStart: votingStart, 57 | votingDeadline: votingStart + 48 * 60 minutes, 58 | votesAmmount: 0, 59 | result: 0, 60 | addAction: addAction, 61 | active: true 62 | }); 63 | ballots.push(ballotID); 64 | checkBallotsActivity(); 65 | } 66 | 67 | /** 68 | @notice Gets active ballots' ids 69 | @return { "value" : "Array of active ballots ids" } 70 | */ 71 | function getBallots() constant returns (uint[] value) { 72 | return ballots; 73 | } 74 | 75 | /** 76 | @notice Gets ballot's memo 77 | @param ballotID Ballot unique ID 78 | @return { "value" : "Ballot's memo" } 79 | */ 80 | function getBallotMemo(uint ballotID) constant returns (string value) { 81 | return ballotsMapping[ballotID].memo; 82 | } 83 | 84 | /** 85 | @notice Gets ballot's action 86 | @param ballotID Ballot unique ID 87 | @return { "value" : "Ballot's action: adding is true, removing is false" } 88 | */ 89 | function getBallotAction(uint ballotID) constant returns (bool value) { 90 | return ballotsMapping[ballotID].addAction; 91 | } 92 | 93 | /** 94 | @notice Gets mining key of notary 95 | @param ballotID Ballot unique ID 96 | @return { "value" : "Notary's mining key" } 97 | */ 98 | function getBallotMiningKey(uint ballotID) constant returns (address value) { 99 | return ballotsMapping[ballotID].miningKey; 100 | } 101 | 102 | /** 103 | @notice Gets affected key of ballot 104 | @param ballotID Ballot unique ID 105 | @return { "value" : "Ballot's affected key" } 106 | */ 107 | function getBallotAffectedKey(uint ballotID) constant returns (address value) { 108 | return ballotsMapping[ballotID].affectedKey; 109 | } 110 | 111 | /** 112 | @notice Gets affected key type of ballot 113 | @param ballotID Ballot unique ID 114 | @return { "value" : "Ballot's affected key type" } 115 | */ 116 | function getBallotAffectedKeyType(uint ballotID) constant returns (uint value) { 117 | return ballotsMapping[ballotID].affectedKeyType; 118 | } 119 | 120 | function toString(address x) internal returns (string) { 121 | bytes memory b = new bytes(20); 122 | for (uint i = 0; i < 20; i++) 123 | b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); 124 | return string(b); 125 | } 126 | 127 | /** 128 | @notice Gets ballot's owner full name 129 | @param ballotID Ballot unique ID 130 | @return { "value" : "Ballot's owner full name" } 131 | */ 132 | function getBallotOwner(uint ballotID) constant returns (string value) { 133 | address ballotOwnerVotingKey = ballotsMapping[ballotID].owner; 134 | address ballotOwnerMiningKey = votingMiningKeysPair[ballotOwnerVotingKey]; 135 | string validatorFullName = validator[ballotOwnerMiningKey].fullName; 136 | bytes memory ownerName = bytes(validatorFullName); 137 | if (ownerName.length == 0) 138 | return toString(ballotOwnerMiningKey); 139 | else 140 | return validatorFullName; 141 | } 142 | 143 | /** 144 | @notice Gets ballot's creation time 145 | @param ballotID Ballot unique ID 146 | @return { "value" : "Ballot's creation time" } 147 | */ 148 | function ballotCreatedAt(uint ballotID) constant returns (uint value) { 149 | return ballotsMapping[ballotID].createdAt; 150 | } 151 | 152 | /** 153 | @notice Gets ballot's voting start date 154 | @param ballotID Ballot unique ID 155 | @return { "value" : "Ballot's voting start date" } 156 | */ 157 | function getBallotVotingStart(uint ballotID) constant returns (uint value) { 158 | return ballotsMapping[ballotID].votingStart; 159 | } 160 | 161 | /** 162 | @notice Gets ballot's voting end date 163 | @param ballotID Ballot unique ID 164 | @return { "value" : "Ballot's voting end date" } 165 | */ 166 | function getBallotVotingEnd(uint ballotID) constant returns (uint value) { 167 | return ballotsMapping[ballotID].votingDeadline; 168 | } 169 | 170 | /** 171 | @notice Gets ballot's amount of votes for 172 | @param ballotID Ballot unique ID 173 | @return { "value" : "Ballot's amount of votes for" } 174 | */ 175 | function getVotesFor(uint ballotID) constant returns (int value) { 176 | return (ballotsMapping[ballotID].votesAmmount + ballotsMapping[ballotID].result)/2; 177 | } 178 | 179 | /** 180 | @notice Gets ballot's amount of votes against 181 | @param ballotID Ballot unique ID 182 | @return { "value" : "Ballot's amount of votes against" } 183 | */ 184 | function getVotesAgainst(uint ballotID) constant returns (int value) { 185 | return (ballotsMapping[ballotID].votesAmmount - ballotsMapping[ballotID].result)/2; 186 | } 187 | 188 | /** 189 | @notice Checks, if ballot is active 190 | @param ballotID Ballot unique ID 191 | @return { "value" : "Ballot's activity: active or not" } 192 | */ 193 | function ballotIsActive(uint ballotID) constant returns (bool value) { 194 | return ballotsMapping[ballotID].active; 195 | } 196 | 197 | /** 198 | @notice Checks, if ballot is already voted by signer of current transaction 199 | @param ballotID Ballot unique ID 200 | @return { "value" : "Ballot is already voted by signer of current transaction: yes or no" } 201 | */ 202 | function ballotIsVoted(uint ballotID) constant returns (bool value) { 203 | return ballotsMapping[ballotID].voted[msg.sender]; 204 | } 205 | 206 | /** 207 | @notice Votes 208 | @param ballotID Ballot unique ID 209 | @param accept Vote for is true, vote against is false 210 | */ 211 | function vote(uint ballotID, bool accept) { 212 | if (!checkVotingKeyValidity(msg.sender)) throw; 213 | Ballot v = ballotsMapping[ballotID]; 214 | if (v.votingDeadline < now) throw; 215 | if (v.voted[msg.sender] == true) throw; 216 | v.voted[msg.sender] = true; 217 | v.votesAmmount++; 218 | if (accept) v.result++; 219 | else v.result--; 220 | checkBallotsActivity(); 221 | } 222 | 223 | /** 224 | @notice Removes element by index from validators array and shift elements in array 225 | @param index Element's index to remove 226 | @return { "value" : "Updated validators array with removed element at index" } 227 | */ 228 | function removeValidator(uint index) internal returns(address[]) { 229 | if (index >= validators.length) return; 230 | 231 | for (uint i = index; i= int(votingLowerLimit)) && b.result > 0) { 247 | if (b.addAction) { //add key 248 | if (b.affectedKeyType == 0) {//mining key 249 | if (licensesIssued < licensesLimit) { 250 | licensesIssued++; 251 | validators.push(b.affectedKey); 252 | } 253 | } else if (b.affectedKeyType == 1) {//voting key 254 | votingKeys[b.affectedKey] = VotingKey({isActive: true}); 255 | votingMiningKeysPair[b.affectedKey] = b.miningKey; 256 | } else if (b.affectedKeyType == 2) {//payout key 257 | payoutKeys[b.affectedKey] = PayoutKey({isActive: true}); 258 | miningPayoutKeysPair[b.miningKey] = b.affectedKey; 259 | } 260 | } else { //invalidate key 261 | if (b.affectedKeyType == 0) {//mining key 262 | for (uint jj = 0; jj < validators.length; jj++) { 263 | if (validators[jj] == b.affectedKey) { 264 | removeValidator(jj); 265 | return; 266 | } 267 | } 268 | disabledValidators.push(b.affectedKey); 269 | validator[b.affectedKey].disablingDate = now; 270 | } else if (b.affectedKeyType == 1) {//voting key 271 | votingKeys[b.affectedKey] = VotingKey({isActive: false}); 272 | } else if (b.affectedKeyType == 2) {//payout key 273 | payoutKeys[b.affectedKey] = PayoutKey({isActive: false}); 274 | } 275 | } 276 | } 277 | b.active = false; 278 | } 279 | } 280 | } 281 | } -------------------------------------------------------------------------------- /demo/src/KeysManager.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | import "./owned.sol"; 4 | import "oracles-contract-key/src/KeyClass.sol"; 5 | import "oracles-contract-validator/src/ValidatorClass.sol"; 6 | import "oracles-contract-ballot/src/BallotClass.sol"; 7 | 8 | contract KeysManager is owned, KeyClass, ValidatorClass, BallotClass { 9 | int8 internal initialKeysIssued = 0; 10 | int8 internal initialKeysLimit = 12; 11 | int8 internal licensesIssued = 0; 12 | int8 internal licensesLimit = 52; 13 | 14 | /** 15 | @notice Adds initial key 16 | @param key Initial key 17 | */ 18 | function addInitialKey(address key) onlyOwner { 19 | if (initialKeysIssued >= initialKeysLimit) throw; 20 | initialKeysIssued++; 21 | initialKeys[key] = InitialKey({isNew: true}); 22 | } 23 | 24 | /** 25 | @notice Create production keys for notary 26 | @param miningAddr Mining key 27 | @param payoutAddr Payout key 28 | @param votingAddr Voting key 29 | */ 30 | function createKeys( 31 | address miningAddr, 32 | address payoutAddr, 33 | address votingAddr 34 | ) { 35 | if (!checkInitialKey(msg.sender)) throw; 36 | //invalidate initial key 37 | delete initialKeys[msg.sender]; 38 | miningKeys[miningAddr] = MiningKey({isActive: true}); 39 | payoutKeys[payoutAddr] = PayoutKey({isActive: true}); 40 | votingKeys[votingAddr] = VotingKey({isActive: true}); 41 | //add mining key to list of validators 42 | licensesIssued++; 43 | validators.push(miningAddr); 44 | votingMiningKeysPair[votingAddr] = miningAddr; 45 | miningPayoutKeysPair[miningAddr] = payoutAddr; 46 | } 47 | 48 | /** 49 | @notice Checks, if initial key is new or not 50 | @param key Initial key 51 | @return { "value" : "Is initial key new or not new" } 52 | */ 53 | function checkInitialKey(address key) constant returns (bool value) { 54 | if (msg.sender != key) throw; 55 | return initialKeys[key].isNew; 56 | } 57 | 58 | /** 59 | @notice Checks, if payout key is active or not 60 | @param addr Payout key 61 | @return { "value" : "Is payout key active or not active" } 62 | */ 63 | function checkPayoutKeyValidity(address addr) constant returns (bool value) { 64 | //if (msg.sender != addr) throw; 65 | return payoutKeys[addr].isActive; 66 | } 67 | 68 | /** 69 | @notice Checks, if voting key is active or not 70 | @param addr Voting key 71 | @return { "value" : "Is voting key active or not active" } 72 | */ 73 | function checkVotingKeyValidity(address addr) constant returns (bool value) { 74 | //if (msg.sender != addr) throw; 75 | return votingKeys[addr].isActive; 76 | } 77 | } -------------------------------------------------------------------------------- /demo/src/Oracles.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | import "./BallotsManager.sol"; 4 | 5 | /** 6 | @title Oracles Interface 7 | @author Oracles 8 | */ 9 | contract Oracles is BallotsManager { 10 | function Oracles() { 11 | validators.push(owner); 12 | } 13 | } -------------------------------------------------------------------------------- /demo/src/ValidatorsManager.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | import "oracles-contract-validator/src/ValidatorClass.sol"; 4 | import "./KeysManager.sol"; 5 | 6 | contract ValidatorsManager is ValidatorClass, KeysManager { 7 | 8 | /** 9 | @notice Adds new notary 10 | @param miningKey Notary's mining key 11 | @param zip Notary's zip code 12 | @param licenseID Notary's license ID 13 | @param licenseExpiredAt Notary's expiration date 14 | @param fullName Notary's full name 15 | @param streetName Notary's address 16 | @param state Notary's US state full name 17 | */ 18 | function addValidator( 19 | address miningKey, 20 | uint zip, 21 | uint licenseID, 22 | uint licenseExpiredAt, 23 | string fullName, 24 | string streetName, 25 | string state 26 | ) { 27 | if (!checkVotingKeyValidity(msg.sender) && !checkInitialKey(msg.sender)) throw; 28 | if (licensesIssued == licensesLimit) throw; 29 | validator[miningKey] = ValidatorClass.Validator({ 30 | fullName: fullName, 31 | streetName: streetName, 32 | state: state, 33 | zip: zip, 34 | licenseID: licenseID, 35 | licenseExpiredAt: licenseExpiredAt, 36 | disablingDate: 0, 37 | disablingTX: "" 38 | }); 39 | } 40 | 41 | /** 42 | @notice Gets active notaries mining keys 43 | @return { "value" : "Array of active notaries mining keys" } 44 | */ 45 | function getValidators() constant returns (address[] value) { 46 | return validators; 47 | } 48 | 49 | /** 50 | @notice Gets disabled notaries mining keys 51 | @return { "value" : "Array of disabled notaries mining keys" } 52 | */ 53 | function getDisabledValidators() constant returns (address[] value) { 54 | return disabledValidators; 55 | } 56 | 57 | /** 58 | @notice Gets notary's full name 59 | @param addr Notary's mining key 60 | @return { "value" : "Notary's full name" } 61 | */ 62 | function getValidatorFullName(address addr) constant returns (string value) { 63 | return validator[addr].fullName; 64 | } 65 | 66 | /** 67 | @notice Gets notary's address 68 | @param addr Notary's mining key 69 | @return { "value" : "Notary's address" } 70 | */ 71 | function getValidatorStreetName(address addr) constant returns (string value) { 72 | return validator[addr].streetName; 73 | } 74 | 75 | /** 76 | @notice Gets notary's state full name 77 | @param addr Notary's mining key 78 | @return { "value" : "Notary's state full name" } 79 | */ 80 | function getValidatorState(address addr) constant returns (string value) { 81 | return validator[addr].state; 82 | } 83 | 84 | /** 85 | @notice Gets notary's zip code 86 | @param addr Notary's mining key 87 | @return { "value" : "Notary's zip code" } 88 | */ 89 | function getValidatorZip(address addr) constant returns (uint value) { 90 | return validator[addr].zip; 91 | } 92 | 93 | /** 94 | @notice Gets notary's license ID 95 | @param addr Notary's mining key 96 | @return { "value" : "Notary's license ID" } 97 | */ 98 | function getValidatorLicenseID(address addr) constant returns (uint value) { 99 | return validator[addr].licenseID; 100 | } 101 | 102 | /** 103 | @notice Gets notary's license expiration date 104 | @param addr Notary's mining key 105 | @return { "value" : "Notary's license expiration date" } 106 | */ 107 | function getValidatorLicenseExpiredAt(address addr) constant returns (uint value) { 108 | return validator[addr].licenseExpiredAt; 109 | } 110 | 111 | /** 112 | @notice Gets notary's disabling date 113 | @param addr Notary's mining key 114 | @return { "value" : "Notary's disabling date" } 115 | */ 116 | function getValidatorDisablingDate(address addr) constant returns (uint value) { 117 | return validator[addr].disablingDate; 118 | } 119 | } -------------------------------------------------------------------------------- /demo/src/owned.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.11; 2 | 3 | contract owned { 4 | address public owner; 5 | 6 | function owned() { 7 | owner = 0xDd0BB0e2a1594240fED0c2f2c17C1E9AB4F87126; //msg.sender 8 | } 9 | 10 | modifier onlyOwner { 11 | if (msg.sender != owner) throw; 12 | _; 13 | } 14 | } -------------------------------------------------------------------------------- /helpers/change-relative-path-to-absolute.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const constants = require('./constants') 4 | const cleanPath = require('./clean-path') 5 | 6 | /* 7 | * Replaces relative paths to absolute path for imports 8 | */ 9 | const changeRelativePathToAbsolute = (filePath) => { 10 | const dir = path.dirname(filePath) 11 | const fileContent = fs.readFileSync(filePath, constants.UTF8) 12 | return new Promise(async (resolve) => { 13 | let fileContentNew = fileContent 14 | const findAllImportPaths = require('./find-all-import-paths') 15 | const importObjs = await findAllImportPaths(dir, fileContent) 16 | if (!importObjs || importObjs.length == 0) { 17 | resolve(fileContentNew) 18 | } 19 | importObjs.forEach((importObj) => { 20 | const { dependencyPath, fullImportStatement } = importObj 21 | const isAbsolutePath = !dependencyPath.startsWith(constants.DOT) 22 | if (!isAbsolutePath) { 23 | let dependencyPathNew = dir + constants.SLASH + dependencyPath 24 | dependencyPathNew = cleanPath(dependencyPathNew) 25 | let fullImportStatementNew = fullImportStatement.split(dependencyPath).join(dependencyPathNew) 26 | fileContentNew = fileContentNew.split(fullImportStatement).join(fullImportStatementNew) 27 | } 28 | }) 29 | 30 | resolve(fileContentNew) 31 | }) 32 | } 33 | 34 | module.exports = changeRelativePathToAbsolute -------------------------------------------------------------------------------- /helpers/clean-path.js: -------------------------------------------------------------------------------- 1 | const constants = require('./constants') 2 | 3 | function cleanPath(path) { 4 | let cleanedPath 5 | if (path.includes(constants.DIRTY_PATH)) { 6 | cleanedPath = path.split(constants.DIRTY_PATH).join(constants.SLASH) 7 | } else { 8 | cleanedPath = path 9 | } 10 | 11 | if (path.includes(constants.DIRTY_PATH_2)) { 12 | const pathPartBefore = path.substring(0, path.indexOf(constants.DIRTY_PATH_2)) 13 | const folderBack = pathPartBefore.split(constants.SLASH).slice(-1)[0] 14 | cleanedPath = path.split(folderBack + constants.DIRTY_PATH_2).join(constants.EMPTY) 15 | } 16 | 17 | if (cleanedPath.includes(constants.DIRTY_PATH || constants.DIRTY_PATH_2)) { 18 | return cleanPath(cleanedPath) 19 | } else { 20 | return cleanedPath 21 | } 22 | } 23 | 24 | module.exports = cleanPath -------------------------------------------------------------------------------- /helpers/constants.js: -------------------------------------------------------------------------------- 1 | const _UTF8 = 'utf8' 2 | const _EMPTY = '' 3 | const _AS = ' as ' 4 | const _SEMICOLON = ';' 5 | const _SLASH = '/' 6 | const _IS = ' is ' 7 | const _IMPORT = 'import ' 8 | const _CONTRACT = 'contract ' 9 | const _DOT = '.' 10 | const _DIRTY_PATH = '/./' 11 | const _DIRTY_PATH_2 = '/../' 12 | const _SOL = '/**/*.sol' 13 | const _LICENSE_PREFIX_1 = '// SPDX-License-Identifier' 14 | const _LICENSE_PREFIX_2 = '//SPDX-License-Identifier' 15 | const _SOL_VERSION_PREFIX = 'pragma solidity' 16 | const _SOL_EXP_HEADER_PREFIX = 'pragma experimental' 17 | 18 | module.exports = { 19 | UTF8: _UTF8, 20 | EMPTY: _EMPTY, 21 | AS: _AS, 22 | SEMICOLON: _SEMICOLON, 23 | SLASH: _SLASH, 24 | IS: _IS, 25 | IMPORT: _IMPORT, 26 | CONTRACT: _CONTRACT, 27 | DOT: _DOT, 28 | SOL: _SOL, 29 | DIRTY_PATH: _DIRTY_PATH, 30 | DIRTY_PATH_2: _DIRTY_PATH_2, 31 | LICENSE_PREFIX_1: _LICENSE_PREFIX_1, 32 | LICENSE_PREFIX_2: _LICENSE_PREFIX_2, 33 | SOL_VERSION_PREFIX: _SOL_VERSION_PREFIX, 34 | SOL_EXP_HEADER_PREFIX: _SOL_EXP_HEADER_PREFIX, 35 | } 36 | -------------------------------------------------------------------------------- /helpers/deduplicate-lines.js: -------------------------------------------------------------------------------- 1 | const os = require('os') 2 | const constants = require('./constants') 3 | 4 | function deduplicateSolidityVersoins(content) { 5 | return deduplicateLines(content, [constants.SOL_VERSION_PREFIX]) 6 | } 7 | 8 | function deduplicateSolidityExpHeaders(content) { 9 | return deduplicateLines(content, [constants.SOL_EXP_HEADER_PREFIX]) 10 | } 11 | 12 | function deduplicateLicenses(content) { 13 | return deduplicateLines(content, [constants.LICENSE_PREFIX_1, constants.LICENSE_PREFIX_2]) 14 | } 15 | 16 | function deduplicateLines(content, linePrefixes) { 17 | const isTargetLine = (line) => { 18 | const lineTrimed = line.trim() 19 | for(const linePrefix of linePrefixes) { 20 | if (lineTrimed.indexOf(linePrefix) >= 0) { 21 | return true 22 | } 23 | } 24 | return false 25 | } 26 | 27 | const cleanTargetLine = (line) => { 28 | for(const linePrefix of linePrefixes) { 29 | const idx = line.indexOf(linePrefix) 30 | if (idx >= 0) { 31 | return line.substr(0, idx) 32 | } 33 | } 34 | return line 35 | } 36 | 37 | const lines = content.split(os.EOL) 38 | let isFirst = true 39 | let newContent = '' 40 | for (const line of lines) { 41 | if (isTargetLine(line)) { 42 | if (isFirst) { 43 | newContent += line + os.EOL 44 | isFirst = false 45 | } else { 46 | newContent += cleanTargetLine(line) + os.EOL 47 | } 48 | } else { 49 | newContent += line + os.EOL 50 | } 51 | } 52 | 53 | return newContent 54 | } 55 | 56 | module.exports = { 57 | deduplicateLicenses, 58 | deduplicateSolidityVersoins, 59 | deduplicateSolidityExpHeaders 60 | } 61 | -------------------------------------------------------------------------------- /helpers/find-all-import-paths.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const decomment = require('decomment') 4 | const findFile = require('./find-file') 5 | const constants = require('./constants') 6 | 7 | /* 8 | * Finds all import paths 9 | */ 10 | function findAllImportPaths(dir, content) { 11 | return new Promise(async (resolve) => { 12 | content = decomment(content, {safe: true}) 13 | let allImports = [] 14 | const regex = new RegExp(constants.IMPORT,'gi') 15 | const importsCount = (content.match(regex) || []).length 16 | let importsIterator = 0 17 | let result 18 | while ( (result = regex.exec(content)) ) { 19 | const startImport = result.index 20 | const endImport = startImport + content.substr(startImport).indexOf(constants.SEMICOLON) + 1 21 | const fullImportStatement = content.substring(startImport, endImport) 22 | const fullImportParts = fullImportStatement.split('"') 23 | const fullImportPartsAlt = fullImportStatement.split('\'') 24 | const dependencyPath = fullImportParts.length > 1 ? fullImportParts[1] : fullImportPartsAlt[1] 25 | const fullImportPartsByAs = fullImportStatement.split(constants.AS) 26 | let alias = fullImportPartsByAs.length > 1 ? fullImportPartsByAs[1].split(constants.SEMICOLON)[0] : null 27 | 28 | let importObj = { 29 | startIndex: startImport, 30 | endIndex: endImport, 31 | dependencyPath, 32 | fullImportStatement, 33 | alias, 34 | } 35 | 36 | if (alias) { 37 | alias = alias.replace(/\s/g,constants.EMPTY) 38 | let fileExists = fs.existsSync(dependencyPath, fs.F_OK) 39 | let fileContent 40 | if (fileExists) { 41 | fileContent = fs.readFileSync(dependencyPath, constants.UTF8) 42 | } else { 43 | dir = dir.substring(0, dir.lastIndexOf(constants.SLASH)) 44 | fileContent = await findFile.byName(dir, path.basename(dependencyPath)) 45 | } 46 | if (fileContent.includes(constants.CONTRACT)) { 47 | importObj.contractName = getContractName(fileContent) 48 | } 49 | } 50 | 51 | importsIterator++ 52 | allImports.push(importObj) 53 | } 54 | if (importsIterator == importsCount) resolve(allImports) 55 | }) 56 | } 57 | 58 | function getContractName(fileContent) { 59 | return fileContent.substring((fileContent.indexOf(constants.CONTRACT) + constants.CONTRACT.length), fileContent.indexOf('{')).replace(/\s/g,constants.EMPTY) 60 | } 61 | 62 | module.exports = findAllImportPaths 63 | -------------------------------------------------------------------------------- /helpers/find-file.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const glob = require('glob-promise') 3 | const path = require('path') 4 | const variables = require('./variables') 5 | const constants = require('./constants') 6 | const changeRelativePathToAbsolute = require('./change-relative-path-to-absolute') 7 | 8 | function byName(dir, fileName) { 9 | return new Promise((resolve) => { 10 | return byNameInner(dir, fileName, resolve) 11 | }) 12 | } 13 | 14 | async function byNameInner(dir, fileName, resolve) { 15 | const srcFiles = await glob(dir + constants.SOL) 16 | for (let j = 0; j < srcFiles.length; j++) { 17 | if (path.basename(srcFiles[j]) == fileName) { 18 | let fileContent = fs.readFileSync(srcFiles[j], constants.UTF8) 19 | resolve(fileContent) 20 | break 21 | } 22 | } 23 | 24 | dir = dir.substring(0, dir.lastIndexOf(constants.SLASH)) 25 | byNameInner(dir, fileName, resolve) 26 | } 27 | 28 | async function byNameAndReplace(dir, dependencyPath, updatedFileContent, importStatement) { 29 | return new Promise((resolve, reject) => { 30 | return byNameAndReplaceInner(dir, dependencyPath, updatedFileContent, importStatement, resolve, reject) 31 | }) 32 | } 33 | 34 | async function byNameAndReplaceInner(dir, dependencyPath, updatedFileContent, importStatement, resolve, reject) { 35 | const srcFiles = await glob(dir + constants.SOL) 36 | let result = await byNameAndReplaceInnerRecursively(importStatement, updatedFileContent, dir, dependencyPath, srcFiles, 0) 37 | let { flattenFileContent, importIsReplacedBefore } = result 38 | if (importIsReplacedBefore) { 39 | flattenFileContent = flattenFileContent.replace(importStatement, constants.EMPTY) 40 | return resolve(flattenFileContent) 41 | } else { 42 | if (dir.includes(constants.SLASH)) { 43 | dir = dir.substring(0, dir.lastIndexOf(constants.SLASH)) 44 | byNameAndReplaceInner(dir, dependencyPath, flattenFileContent, importStatement, resolve, reject) 45 | } else { 46 | flattenFileContent = flattenFileContent.replace(importStatement, constants.EMPTY) 47 | return resolve(flattenFileContent) 48 | } 49 | } 50 | } 51 | 52 | async function byNameAndReplaceInnerRecursively(importStatement, updatedFileContent, dir, dependencyPath, srcFiles, j) { 53 | return new Promise((resolve, reject) => { 54 | byNameAndReplaceInnerRecursivelyInner(importStatement, updatedFileContent, dir, dependencyPath, srcFiles, j, resolve, reject) 55 | }) 56 | } 57 | 58 | async function byNameAndReplaceInnerRecursivelyInner(importStatement, updatedFileContent, dir, dependencyPath, srcFiles, j, resolve, reject, importIsReplacedBefore) { 59 | if (j >= srcFiles.length) return resolve({ flattenFileContent: updatedFileContent, importIsReplacedBefore }) 60 | 61 | let isAbsolutePath = !dependencyPath.startsWith(constants.DOT) 62 | const filePath = srcFiles[j] 63 | const { importedSrcFiles } = variables 64 | if (isAbsolutePath && filePath.includes(dependencyPath)) { 65 | let flattenFileContent = constants.EMPTY 66 | if (!importedSrcFiles.hasOwnProperty(path.basename(filePath)) || fs.existsSync(dependencyPath)) { 67 | let importFileContent 68 | if (fs.existsSync(dependencyPath)) { 69 | importFileContent = await changeRelativePathToAbsolute(dependencyPath) 70 | } else { 71 | importFileContent = await changeRelativePathToAbsolute(filePath) 72 | } 73 | 74 | if (importFileContent.includes(constants.IS)) { 75 | flattenFileContent = updatedFileContent.replace(importStatement, importFileContent) 76 | } else { 77 | flattenFileContent = importFileContent + updatedFileContent.replace(importStatement, constants.EMPTY) 78 | } 79 | importedSrcFiles[path.basename(filePath)] = importFileContent 80 | resolve({ flattenFileContent, importIsReplacedBefore: true }) 81 | } else { 82 | flattenFileContent = updatedFileContent.replace(importStatement, constants.EMPTY) 83 | //issue #2. 84 | const fileName = importedSrcFiles[path.basename(dir + dependencyPath)] 85 | if (flattenFileContent.includes(fileName) && flattenFileContent.includes(constants.IMPORT)) { 86 | let importFileContent = fs.readFileSync(filePath, constants.UTF8) 87 | flattenFileContent = importFileContent + flattenFileContent.replace(fileName, constants.EMPTY) 88 | } 89 | importIsReplacedBefore = true 90 | j++ 91 | byNameAndReplaceInnerRecursivelyInner(importStatement, flattenFileContent, dir, dependencyPath, srcFiles, j, resolve, reject, importIsReplacedBefore) 92 | } 93 | } else { 94 | j++ 95 | byNameAndReplaceInnerRecursivelyInner(importStatement, updatedFileContent, dir, dependencyPath, srcFiles, j, resolve, reject, importIsReplacedBefore) 96 | } 97 | } 98 | 99 | module.exports = { 100 | byName, 101 | byNameAndReplace 102 | } -------------------------------------------------------------------------------- /helpers/logger.js: -------------------------------------------------------------------------------- 1 | let bunyan = require('bunyan') 2 | let log = bunyan.createLogger({name: 'solidity-flattener'}) 3 | 4 | module.exports = log -------------------------------------------------------------------------------- /helpers/replace-all-imports-in-current-layer.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const variables = require('./variables') 4 | const constants = require('./constants') 5 | const findFile = require('./find-file') 6 | const updateImportObjectLocationInTarget = require('./update-import-object-location-in-target') 7 | const changeRelativePathToAbsolute = require('./change-relative-path-to-absolute') 8 | const cleanPath = require('./clean-path') 9 | const log = require('./logger') 10 | 11 | async function replaceAllImportsInCurrentLayer(i, importObjs, updatedFileContent, dir) { 12 | return new Promise(async (resolve) => { 13 | await replaceAllImportsInCurrentLayerInner(i, importObjs, updatedFileContent, dir, resolve) 14 | }) 15 | } 16 | 17 | async function replaceAllImportsInCurrentLayerInner(i, importObjs, updatedFileContent, dir, resolve) { 18 | if (i >= importObjs.length) { 19 | return resolve(updatedFileContent) 20 | } 21 | 22 | let importObj = importObjs[i] 23 | const { importedSrcFiles } = variables 24 | let _updatedFileContent 25 | 26 | //replace contracts aliases 27 | if (importObj.contractName) { 28 | _updatedFileContent = updatedFileContent.replace(importObj.alias + constants.DOT, importObj.contractName + constants.DOT) 29 | } else { 30 | _updatedFileContent = updatedFileContent 31 | } 32 | 33 | let { dependencyPath } = importObj 34 | dependencyPath = cleanPath(dependencyPath) 35 | let isAbsolutePath = !dependencyPath.startsWith(constants.DOT) 36 | let filePath = isAbsolutePath ? dependencyPath : (dir + dependencyPath) 37 | filePath = cleanPath(filePath) 38 | 39 | importObj = updateImportObjectLocationInTarget(importObj, _updatedFileContent) 40 | const importStatement = _updatedFileContent.substring(importObj.startIndex, importObj.endIndex) 41 | const fileBaseName = path.basename(filePath) 42 | const fileExists = fs.existsSync(filePath, fs.F_OK) 43 | if (fileExists) { 44 | log.info(`${filePath} SOURCE FILE WAS FOUND`) 45 | const importedFileContentUpdated = await changeRelativePathToAbsolute(filePath) 46 | if (!importedSrcFiles.hasOwnProperty(fileBaseName)) { 47 | importedSrcFiles[fileBaseName] = importedFileContentUpdated 48 | if (importedFileContentUpdated.includes(constants.IS)) { 49 | _updatedFileContent = _updatedFileContent.replace(importStatement, importedFileContentUpdated) 50 | } else { 51 | _updatedFileContent = importedFileContentUpdated + _updatedFileContent.replace(importStatement, constants.EMPTY) 52 | } 53 | } else { 54 | _updatedFileContent = _updatedFileContent.replace(importStatement, constants.EMPTY) 55 | //issue #1. 56 | if (_updatedFileContent.includes(importedSrcFiles[fileBaseName]) && _updatedFileContent.includes(constants.IMPORT)) { 57 | _updatedFileContent = importedFileContentUpdated + _updatedFileContent.replace(importedSrcFiles[fileBaseName], constants.EMPTY) 58 | } 59 | } 60 | } else { 61 | if (!importedSrcFiles.hasOwnProperty(fileBaseName)) { 62 | log.warn(`!!! ${filePath} SOURCE FILE WAS NOT FOUND. I'M TRYING TO FIND IT RECURSIVELY !!!`) 63 | const directorySeperator = process.platform === 'win32' ? '\\' : constants.SLASH 64 | const dirNew = dir.substring(0, dir.lastIndexOf(directorySeperator)) 65 | _updatedFileContent = await findFile.byNameAndReplace(dirNew, dependencyPath, _updatedFileContent, importStatement) 66 | log.info(`${filePath} SOURCE FILE WAS FOUND`) 67 | } else { 68 | _updatedFileContent = _updatedFileContent.replace(importStatement, constants.EMPTY) 69 | } 70 | } 71 | 72 | i++ 73 | replaceAllImportsInCurrentLayerInner(i, importObjs, _updatedFileContent, dir, resolve) 74 | } 75 | 76 | module.exports = replaceAllImportsInCurrentLayer 77 | -------------------------------------------------------------------------------- /helpers/replace-all-imports-recursively.js: -------------------------------------------------------------------------------- 1 | const findAllImportPaths = require('./find-all-import-paths') 2 | const replaceAllImportsInCurrentLayer = require('./replace-all-imports-in-current-layer') 3 | 4 | /* 5 | * Recursively replaces all imports 6 | */ 7 | async function replaceAllImportsRecursively(fileContent, dir) { 8 | return new Promise(async (resolve) => { 9 | await replaceAllImportsRecursivelyInner(fileContent, dir, resolve) 10 | }) 11 | } 12 | 13 | async function replaceAllImportsRecursivelyInner(fileContent, dir, resolve) { 14 | const importObjs = await findAllImportPaths(dir, fileContent) 15 | if (!importObjs || importObjs.length == 0) { 16 | return resolve(fileContent) 17 | } 18 | 19 | const updatedFileContent = await replaceAllImportsInCurrentLayer(0, importObjs, fileContent, dir) 20 | replaceAllImportsRecursivelyInner(updatedFileContent, dir, resolve) 21 | } 22 | 23 | module.exports = replaceAllImportsRecursively 24 | -------------------------------------------------------------------------------- /helpers/update-import-object-location-in-target.js: -------------------------------------------------------------------------------- 1 | function updateImportObjectLocationInTarget(importObj, content) { 2 | if (content.includes(importObj.fullImportStatement)) { 3 | const startIndexNew = content.indexOf(importObj.fullImportStatement) 4 | const endIndexNew = startIndexNew - importObj.startIndex + importObj.endIndex 5 | importObj.startIndex = startIndexNew 6 | importObj.endIndex = endIndexNew 7 | } else { 8 | importObj.startIndex = 0 9 | importObj.endIndex = 0 10 | } 11 | return importObj 12 | } 13 | 14 | module.exports = updateImportObjectLocationInTarget -------------------------------------------------------------------------------- /helpers/variables.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const fs = require('fs') 3 | const constants = require('./constants') 4 | 5 | const configPath = './config.json' 6 | let configExists = fs.existsSync(configPath, fs.F_OK) 7 | let config 8 | if (configExists) { 9 | config = JSON.parse(fs.readFileSync(configPath, constants.UTF8)) 10 | } 11 | 12 | //Input solidity file path 13 | let args = process.argv.slice(2) 14 | let inputFilePath = args.length > 0 ? args[0] : config ? config.inputFilePath : constants.EMPTY 15 | 16 | //Input solidity file dir name 17 | let inputFileDir = path.dirname(inputFilePath) 18 | 19 | //Input parent dir 20 | let parentDir = inputFileDir 21 | 22 | //Output directory to store flat combined solidity file 23 | let outDir = args.length > 1 ? args[1] : config ? config.outputDir : './out' 24 | let flatContractPrefix = args.length > 2 ? args[2] : path.basename(inputFilePath, '.sol') 25 | 26 | let allSrcFiles = [] 27 | let importedSrcFiles = {} 28 | 29 | 30 | module.exports = { 31 | args, 32 | inputFilePath, 33 | inputFileDir, 34 | parentDir, 35 | outDir, 36 | allSrcFiles, 37 | importedSrcFiles, 38 | flatContractPrefix 39 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | const fs = require('fs') 3 | const glob = require('glob-promise') 4 | const variables = require('./helpers/variables') 5 | const log = require('./helpers/logger') 6 | const constants = require('./helpers/constants') 7 | const cleanPath = require('./helpers/clean-path') 8 | const replaceAllImportsRecursively = require('./helpers/replace-all-imports-recursively') 9 | const { 10 | deduplicateSolidityVersoins, 11 | deduplicateSolidityExpHeaders, 12 | deduplicateLicenses 13 | } = require('./helpers/deduplicate-lines') 14 | 15 | flatten() 16 | 17 | async function flatten() { 18 | const inputFileContent = await fs.readFileSync(variables.inputFilePath, 'utf8') 19 | let dir = variables.parentDir + constants.SLASH 20 | const isAbsolutePath = !dir.startsWith(constants.DOT) 21 | if (!isAbsolutePath) { 22 | dir = __dirname + constants.SLASH + dir 23 | } 24 | dir = cleanPath(dir) 25 | const path = variables.parentDir + constants.SOL 26 | const srcFiles = await getSourceFiles(dir, path) 27 | variables.srcFiles = srcFiles 28 | await replaceImports(inputFileContent, dir) 29 | } 30 | 31 | async function getSourceFiles(dir, path) { 32 | return await glob(path) 33 | } 34 | 35 | async function replaceImports(inputFileContent, dir) { 36 | let outputFileContent = await replaceAllImportsRecursively(inputFileContent, dir) 37 | 38 | outputFileContent = deduplicateLicenses(outputFileContent) 39 | outputFileContent = deduplicateSolidityVersoins(outputFileContent) 40 | outputFileContent = deduplicateSolidityExpHeaders(outputFileContent) 41 | 42 | if (!fs.existsSync(variables.outDir)) fs.mkdirSync(variables.outDir) 43 | const fileName = `${variables.flatContractPrefix}_flat.sol` 44 | const filePath = `${variables.outDir}/${fileName}` 45 | fs.writeFileSync(filePath, outputFileContent) 46 | log.info(`Success! Flat file ${fileName} is generated to ${variables.outDir} directory`) 47 | } 48 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@poanet/solidity-flattener", 3 | "version": "3.0.9", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@poanet/solidity-flattener", 9 | "version": "3.0.9", 10 | "license": "MIT", 11 | "dependencies": { 12 | "bunyan": "^1.8.12", 13 | "decomment": "^0.9.1", 14 | "glob-promise": "^3.4.0", 15 | "path": "^0.12.7" 16 | }, 17 | "bin": { 18 | "poa-solidity-flattener": "index.js" 19 | }, 20 | "devDependencies": { 21 | "coveralls": "^3.0.2", 22 | "eslint": "^5.5.0", 23 | "istanbul": "^0.4.5", 24 | "mocha": "^10.2.0", 25 | "mocha-lcov-reporter": "^1.3.0" 26 | }, 27 | "engines": { 28 | "node": ">=16 <=18" 29 | } 30 | }, 31 | "node_modules/@babel/code-frame": { 32 | "version": "7.0.0", 33 | "dev": true, 34 | "license": "MIT", 35 | "dependencies": { 36 | "@babel/highlight": "^7.0.0" 37 | } 38 | }, 39 | "node_modules/@babel/highlight": { 40 | "version": "7.0.0", 41 | "dev": true, 42 | "license": "MIT", 43 | "dependencies": { 44 | "chalk": "^2.0.0", 45 | "esutils": "^2.0.2", 46 | "js-tokens": "^4.0.0" 47 | } 48 | }, 49 | "node_modules/@types/events": { 50 | "version": "1.2.0", 51 | "license": "MIT" 52 | }, 53 | "node_modules/@types/glob": { 54 | "version": "5.0.35", 55 | "license": "MIT", 56 | "dependencies": { 57 | "@types/events": "*", 58 | "@types/minimatch": "*", 59 | "@types/node": "*" 60 | } 61 | }, 62 | "node_modules/@types/minimatch": { 63 | "version": "3.0.3", 64 | "license": "MIT" 65 | }, 66 | "node_modules/@types/node": { 67 | "version": "10.9.4", 68 | "license": "MIT" 69 | }, 70 | "node_modules/abbrev": { 71 | "version": "1.0.9", 72 | "dev": true, 73 | "license": "ISC" 74 | }, 75 | "node_modules/acorn": { 76 | "version": "6.4.2", 77 | "dev": true, 78 | "license": "MIT", 79 | "bin": { 80 | "acorn": "bin/acorn" 81 | }, 82 | "engines": { 83 | "node": ">=0.4.0" 84 | } 85 | }, 86 | "node_modules/acorn-jsx": { 87 | "version": "5.3.2", 88 | "dev": true, 89 | "license": "MIT", 90 | "peerDependencies": { 91 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 92 | } 93 | }, 94 | "node_modules/ajv": { 95 | "version": "6.12.6", 96 | "dev": true, 97 | "license": "MIT", 98 | "dependencies": { 99 | "fast-deep-equal": "^3.1.1", 100 | "fast-json-stable-stringify": "^2.0.0", 101 | "json-schema-traverse": "^0.4.1", 102 | "uri-js": "^4.2.2" 103 | }, 104 | "funding": { 105 | "type": "github", 106 | "url": "https://github.com/sponsors/epoberezkin" 107 | } 108 | }, 109 | "node_modules/amdefine": { 110 | "version": "1.0.1", 111 | "dev": true, 112 | "license": "BSD-3-Clause OR MIT", 113 | "optional": true, 114 | "engines": { 115 | "node": ">=0.4.2" 116 | } 117 | }, 118 | "node_modules/ansi-colors": { 119 | "version": "4.1.1", 120 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 121 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 122 | "dev": true, 123 | "engines": { 124 | "node": ">=6" 125 | } 126 | }, 127 | "node_modules/ansi-escapes": { 128 | "version": "3.2.0", 129 | "dev": true, 130 | "license": "MIT", 131 | "engines": { 132 | "node": ">=4" 133 | } 134 | }, 135 | "node_modules/ansi-regex": { 136 | "version": "3.0.1", 137 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", 138 | "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", 139 | "dev": true, 140 | "engines": { 141 | "node": ">=4" 142 | } 143 | }, 144 | "node_modules/ansi-styles": { 145 | "version": "3.2.1", 146 | "dev": true, 147 | "license": "MIT", 148 | "dependencies": { 149 | "color-convert": "^1.9.0" 150 | }, 151 | "engines": { 152 | "node": ">=4" 153 | } 154 | }, 155 | "node_modules/anymatch": { 156 | "version": "3.1.3", 157 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 158 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 159 | "dev": true, 160 | "dependencies": { 161 | "normalize-path": "^3.0.0", 162 | "picomatch": "^2.0.4" 163 | }, 164 | "engines": { 165 | "node": ">= 8" 166 | } 167 | }, 168 | "node_modules/argparse": { 169 | "version": "1.0.10", 170 | "dev": true, 171 | "license": "MIT", 172 | "dependencies": { 173 | "sprintf-js": "~1.0.2" 174 | } 175 | }, 176 | "node_modules/asn1": { 177 | "version": "0.2.4", 178 | "dev": true, 179 | "license": "MIT", 180 | "dependencies": { 181 | "safer-buffer": "~2.1.0" 182 | } 183 | }, 184 | "node_modules/assert-plus": { 185 | "version": "1.0.0", 186 | "dev": true, 187 | "license": "MIT", 188 | "engines": { 189 | "node": ">=0.8" 190 | } 191 | }, 192 | "node_modules/astral-regex": { 193 | "version": "1.0.0", 194 | "dev": true, 195 | "license": "MIT", 196 | "engines": { 197 | "node": ">=4" 198 | } 199 | }, 200 | "node_modules/async": { 201 | "version": "1.5.2", 202 | "dev": true, 203 | "license": "MIT" 204 | }, 205 | "node_modules/asynckit": { 206 | "version": "0.4.0", 207 | "dev": true, 208 | "license": "MIT" 209 | }, 210 | "node_modules/aws-sign2": { 211 | "version": "0.7.0", 212 | "dev": true, 213 | "license": "Apache-2.0", 214 | "engines": { 215 | "node": "*" 216 | } 217 | }, 218 | "node_modules/aws4": { 219 | "version": "1.8.0", 220 | "dev": true, 221 | "license": "MIT" 222 | }, 223 | "node_modules/balanced-match": { 224 | "version": "1.0.0", 225 | "license": "MIT" 226 | }, 227 | "node_modules/bcrypt-pbkdf": { 228 | "version": "1.0.2", 229 | "dev": true, 230 | "license": "BSD-3-Clause", 231 | "optional": true, 232 | "dependencies": { 233 | "tweetnacl": "^0.14.3" 234 | } 235 | }, 236 | "node_modules/binary-extensions": { 237 | "version": "2.2.0", 238 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 239 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 240 | "dev": true, 241 | "engines": { 242 | "node": ">=8" 243 | } 244 | }, 245 | "node_modules/brace-expansion": { 246 | "version": "1.1.8", 247 | "license": "MIT", 248 | "dependencies": { 249 | "balanced-match": "^1.0.0", 250 | "concat-map": "0.0.1" 251 | } 252 | }, 253 | "node_modules/braces": { 254 | "version": "3.0.2", 255 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 256 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 257 | "dev": true, 258 | "dependencies": { 259 | "fill-range": "^7.0.1" 260 | }, 261 | "engines": { 262 | "node": ">=8" 263 | } 264 | }, 265 | "node_modules/browser-stdout": { 266 | "version": "1.3.1", 267 | "dev": true, 268 | "license": "ISC" 269 | }, 270 | "node_modules/bunyan": { 271 | "version": "1.8.12", 272 | "engines": [ 273 | "node >=0.10.0" 274 | ], 275 | "license": "MIT", 276 | "bin": { 277 | "bunyan": "bin/bunyan" 278 | }, 279 | "optionalDependencies": { 280 | "dtrace-provider": "~0.8", 281 | "moment": "^2.10.6", 282 | "mv": "~2", 283 | "safe-json-stringify": "~1" 284 | } 285 | }, 286 | "node_modules/callsites": { 287 | "version": "3.1.0", 288 | "dev": true, 289 | "license": "MIT", 290 | "engines": { 291 | "node": ">=6" 292 | } 293 | }, 294 | "node_modules/camelcase": { 295 | "version": "6.3.0", 296 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 297 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 298 | "dev": true, 299 | "engines": { 300 | "node": ">=10" 301 | }, 302 | "funding": { 303 | "url": "https://github.com/sponsors/sindresorhus" 304 | } 305 | }, 306 | "node_modules/caseless": { 307 | "version": "0.12.0", 308 | "dev": true, 309 | "license": "Apache-2.0" 310 | }, 311 | "node_modules/chalk": { 312 | "version": "2.4.2", 313 | "dev": true, 314 | "license": "MIT", 315 | "dependencies": { 316 | "ansi-styles": "^3.2.1", 317 | "escape-string-regexp": "^1.0.5", 318 | "supports-color": "^5.3.0" 319 | }, 320 | "engines": { 321 | "node": ">=4" 322 | } 323 | }, 324 | "node_modules/chardet": { 325 | "version": "0.7.0", 326 | "dev": true, 327 | "license": "MIT" 328 | }, 329 | "node_modules/chokidar": { 330 | "version": "3.5.3", 331 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 332 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 333 | "dev": true, 334 | "funding": [ 335 | { 336 | "type": "individual", 337 | "url": "https://paulmillr.com/funding/" 338 | } 339 | ], 340 | "dependencies": { 341 | "anymatch": "~3.1.2", 342 | "braces": "~3.0.2", 343 | "glob-parent": "~5.1.2", 344 | "is-binary-path": "~2.1.0", 345 | "is-glob": "~4.0.1", 346 | "normalize-path": "~3.0.0", 347 | "readdirp": "~3.6.0" 348 | }, 349 | "engines": { 350 | "node": ">= 8.10.0" 351 | }, 352 | "optionalDependencies": { 353 | "fsevents": "~2.3.2" 354 | } 355 | }, 356 | "node_modules/cli-cursor": { 357 | "version": "2.1.0", 358 | "dev": true, 359 | "license": "MIT", 360 | "dependencies": { 361 | "restore-cursor": "^2.0.0" 362 | }, 363 | "engines": { 364 | "node": ">=4" 365 | } 366 | }, 367 | "node_modules/cli-width": { 368 | "version": "2.2.1", 369 | "dev": true, 370 | "license": "ISC" 371 | }, 372 | "node_modules/cliui": { 373 | "version": "7.0.4", 374 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 375 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 376 | "dev": true, 377 | "dependencies": { 378 | "string-width": "^4.2.0", 379 | "strip-ansi": "^6.0.0", 380 | "wrap-ansi": "^7.0.0" 381 | } 382 | }, 383 | "node_modules/cliui/node_modules/ansi-regex": { 384 | "version": "5.0.1", 385 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 386 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 387 | "dev": true, 388 | "engines": { 389 | "node": ">=8" 390 | } 391 | }, 392 | "node_modules/cliui/node_modules/emoji-regex": { 393 | "version": "8.0.0", 394 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 395 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 396 | "dev": true 397 | }, 398 | "node_modules/cliui/node_modules/is-fullwidth-code-point": { 399 | "version": "3.0.0", 400 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 401 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 402 | "dev": true, 403 | "engines": { 404 | "node": ">=8" 405 | } 406 | }, 407 | "node_modules/cliui/node_modules/string-width": { 408 | "version": "4.2.3", 409 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 410 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 411 | "dev": true, 412 | "dependencies": { 413 | "emoji-regex": "^8.0.0", 414 | "is-fullwidth-code-point": "^3.0.0", 415 | "strip-ansi": "^6.0.1" 416 | }, 417 | "engines": { 418 | "node": ">=8" 419 | } 420 | }, 421 | "node_modules/cliui/node_modules/strip-ansi": { 422 | "version": "6.0.1", 423 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 424 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 425 | "dev": true, 426 | "dependencies": { 427 | "ansi-regex": "^5.0.1" 428 | }, 429 | "engines": { 430 | "node": ">=8" 431 | } 432 | }, 433 | "node_modules/color-convert": { 434 | "version": "1.9.3", 435 | "dev": true, 436 | "license": "MIT", 437 | "dependencies": { 438 | "color-name": "1.1.3" 439 | } 440 | }, 441 | "node_modules/color-name": { 442 | "version": "1.1.3", 443 | "dev": true, 444 | "license": "MIT" 445 | }, 446 | "node_modules/combined-stream": { 447 | "version": "1.0.6", 448 | "dev": true, 449 | "license": "MIT", 450 | "dependencies": { 451 | "delayed-stream": "~1.0.0" 452 | }, 453 | "engines": { 454 | "node": ">= 0.8" 455 | } 456 | }, 457 | "node_modules/concat-map": { 458 | "version": "0.0.1", 459 | "license": "MIT" 460 | }, 461 | "node_modules/core-util-is": { 462 | "version": "1.0.2", 463 | "dev": true, 464 | "license": "MIT" 465 | }, 466 | "node_modules/coveralls": { 467 | "version": "3.0.2", 468 | "dev": true, 469 | "license": "BSD-2-Clause", 470 | "dependencies": { 471 | "growl": "~> 1.10.0", 472 | "js-yaml": "^3.11.0", 473 | "lcov-parse": "^0.0.10", 474 | "log-driver": "^1.2.7", 475 | "minimist": "^1.2.0", 476 | "request": "^2.85.0" 477 | }, 478 | "bin": { 479 | "coveralls": "bin/coveralls.js" 480 | }, 481 | "engines": { 482 | "node": ">=4.0.0" 483 | } 484 | }, 485 | "node_modules/cross-spawn": { 486 | "version": "6.0.5", 487 | "dev": true, 488 | "license": "MIT", 489 | "dependencies": { 490 | "nice-try": "^1.0.4", 491 | "path-key": "^2.0.1", 492 | "semver": "^5.5.0", 493 | "shebang-command": "^1.2.0", 494 | "which": "^1.2.9" 495 | }, 496 | "engines": { 497 | "node": ">=4.8" 498 | } 499 | }, 500 | "node_modules/dashdash": { 501 | "version": "1.14.1", 502 | "dev": true, 503 | "license": "MIT", 504 | "dependencies": { 505 | "assert-plus": "^1.0.0" 506 | }, 507 | "engines": { 508 | "node": ">=0.10" 509 | } 510 | }, 511 | "node_modules/debug": { 512 | "version": "4.3.4", 513 | "dev": true, 514 | "license": "MIT", 515 | "dependencies": { 516 | "ms": "2.1.2" 517 | }, 518 | "engines": { 519 | "node": ">=6.0" 520 | }, 521 | "peerDependenciesMeta": { 522 | "supports-color": { 523 | "optional": true 524 | } 525 | } 526 | }, 527 | "node_modules/decamelize": { 528 | "version": "4.0.0", 529 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 530 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 531 | "dev": true, 532 | "engines": { 533 | "node": ">=10" 534 | }, 535 | "funding": { 536 | "url": "https://github.com/sponsors/sindresorhus" 537 | } 538 | }, 539 | "node_modules/decomment": { 540 | "version": "0.9.1", 541 | "license": "MIT", 542 | "dependencies": { 543 | "esprima": "~4.0.0" 544 | }, 545 | "engines": { 546 | "node": ">=4.0", 547 | "npm": ">=2.15" 548 | } 549 | }, 550 | "node_modules/deep-is": { 551 | "version": "0.1.3", 552 | "dev": true, 553 | "license": "MIT" 554 | }, 555 | "node_modules/delayed-stream": { 556 | "version": "1.0.0", 557 | "dev": true, 558 | "license": "MIT", 559 | "engines": { 560 | "node": ">=0.4.0" 561 | } 562 | }, 563 | "node_modules/diff": { 564 | "version": "5.0.0", 565 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 566 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 567 | "dev": true, 568 | "engines": { 569 | "node": ">=0.3.1" 570 | } 571 | }, 572 | "node_modules/doctrine": { 573 | "version": "3.0.0", 574 | "dev": true, 575 | "license": "Apache-2.0", 576 | "dependencies": { 577 | "esutils": "^2.0.2" 578 | }, 579 | "engines": { 580 | "node": ">=6.0.0" 581 | } 582 | }, 583 | "node_modules/dtrace-provider": { 584 | "version": "0.8.7", 585 | "hasInstallScript": true, 586 | "license": "BSD-2-Clause", 587 | "optional": true, 588 | "dependencies": { 589 | "nan": "^2.10.0" 590 | }, 591 | "engines": { 592 | "node": ">=0.10" 593 | } 594 | }, 595 | "node_modules/ecc-jsbn": { 596 | "version": "0.1.2", 597 | "dev": true, 598 | "license": "MIT", 599 | "optional": true, 600 | "dependencies": { 601 | "jsbn": "~0.1.0", 602 | "safer-buffer": "^2.1.0" 603 | } 604 | }, 605 | "node_modules/emoji-regex": { 606 | "version": "7.0.3", 607 | "dev": true, 608 | "license": "MIT" 609 | }, 610 | "node_modules/escalade": { 611 | "version": "3.1.1", 612 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 613 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 614 | "dev": true, 615 | "engines": { 616 | "node": ">=6" 617 | } 618 | }, 619 | "node_modules/escape-string-regexp": { 620 | "version": "1.0.5", 621 | "dev": true, 622 | "license": "MIT", 623 | "engines": { 624 | "node": ">=0.8.0" 625 | } 626 | }, 627 | "node_modules/escodegen": { 628 | "version": "1.8.1", 629 | "dev": true, 630 | "license": "BSD-2-Clause", 631 | "dependencies": { 632 | "esprima": "^2.7.1", 633 | "estraverse": "^1.9.1", 634 | "esutils": "^2.0.2", 635 | "optionator": "^0.8.1" 636 | }, 637 | "bin": { 638 | "escodegen": "bin/escodegen.js", 639 | "esgenerate": "bin/esgenerate.js" 640 | }, 641 | "engines": { 642 | "node": ">=0.12.0" 643 | }, 644 | "optionalDependencies": { 645 | "source-map": "~0.2.0" 646 | } 647 | }, 648 | "node_modules/escodegen/node_modules/esprima": { 649 | "version": "2.7.3", 650 | "dev": true, 651 | "license": "BSD-2-Clause", 652 | "bin": { 653 | "esparse": "bin/esparse.js", 654 | "esvalidate": "bin/esvalidate.js" 655 | }, 656 | "engines": { 657 | "node": ">=0.10.0" 658 | } 659 | }, 660 | "node_modules/escodegen/node_modules/estraverse": { 661 | "version": "1.9.3", 662 | "dev": true, 663 | "engines": { 664 | "node": ">=0.10.0" 665 | } 666 | }, 667 | "node_modules/eslint": { 668 | "version": "5.16.0", 669 | "dev": true, 670 | "license": "MIT", 671 | "dependencies": { 672 | "@babel/code-frame": "^7.0.0", 673 | "ajv": "^6.9.1", 674 | "chalk": "^2.1.0", 675 | "cross-spawn": "^6.0.5", 676 | "debug": "^4.0.1", 677 | "doctrine": "^3.0.0", 678 | "eslint-scope": "^4.0.3", 679 | "eslint-utils": "^1.3.1", 680 | "eslint-visitor-keys": "^1.0.0", 681 | "espree": "^5.0.1", 682 | "esquery": "^1.0.1", 683 | "esutils": "^2.0.2", 684 | "file-entry-cache": "^5.0.1", 685 | "functional-red-black-tree": "^1.0.1", 686 | "glob": "^7.1.2", 687 | "globals": "^11.7.0", 688 | "ignore": "^4.0.6", 689 | "import-fresh": "^3.0.0", 690 | "imurmurhash": "^0.1.4", 691 | "inquirer": "^6.2.2", 692 | "js-yaml": "^3.13.0", 693 | "json-stable-stringify-without-jsonify": "^1.0.1", 694 | "levn": "^0.3.0", 695 | "lodash": "^4.17.11", 696 | "minimatch": "^3.0.4", 697 | "mkdirp": "^0.5.1", 698 | "natural-compare": "^1.4.0", 699 | "optionator": "^0.8.2", 700 | "path-is-inside": "^1.0.2", 701 | "progress": "^2.0.0", 702 | "regexpp": "^2.0.1", 703 | "semver": "^5.5.1", 704 | "strip-ansi": "^4.0.0", 705 | "strip-json-comments": "^2.0.1", 706 | "table": "^5.2.3", 707 | "text-table": "^0.2.0" 708 | }, 709 | "bin": { 710 | "eslint": "bin/eslint.js" 711 | }, 712 | "engines": { 713 | "node": "^6.14.0 || ^8.10.0 || >=9.10.0" 714 | } 715 | }, 716 | "node_modules/eslint-scope": { 717 | "version": "4.0.3", 718 | "dev": true, 719 | "license": "BSD-2-Clause", 720 | "dependencies": { 721 | "esrecurse": "^4.1.0", 722 | "estraverse": "^4.1.1" 723 | }, 724 | "engines": { 725 | "node": ">=4.0.0" 726 | } 727 | }, 728 | "node_modules/eslint-utils": { 729 | "version": "1.4.3", 730 | "dev": true, 731 | "license": "MIT", 732 | "dependencies": { 733 | "eslint-visitor-keys": "^1.1.0" 734 | }, 735 | "engines": { 736 | "node": ">=6" 737 | } 738 | }, 739 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 740 | "version": "1.1.0", 741 | "dev": true, 742 | "license": "Apache-2.0", 743 | "engines": { 744 | "node": ">=4" 745 | } 746 | }, 747 | "node_modules/eslint-visitor-keys": { 748 | "version": "1.0.0", 749 | "dev": true, 750 | "license": "Apache-2.0", 751 | "engines": { 752 | "node": ">=4" 753 | } 754 | }, 755 | "node_modules/espree": { 756 | "version": "5.0.1", 757 | "dev": true, 758 | "license": "BSD-2-Clause", 759 | "dependencies": { 760 | "acorn": "^6.0.7", 761 | "acorn-jsx": "^5.0.0", 762 | "eslint-visitor-keys": "^1.0.0" 763 | }, 764 | "engines": { 765 | "node": ">=6.0.0" 766 | } 767 | }, 768 | "node_modules/esprima": { 769 | "version": "4.0.0", 770 | "license": "BSD-2-Clause", 771 | "bin": { 772 | "esparse": "bin/esparse.js", 773 | "esvalidate": "bin/esvalidate.js" 774 | }, 775 | "engines": { 776 | "node": ">=4" 777 | } 778 | }, 779 | "node_modules/esquery": { 780 | "version": "1.0.1", 781 | "dev": true, 782 | "license": "BSD-3-Clause", 783 | "dependencies": { 784 | "estraverse": "^4.0.0" 785 | }, 786 | "engines": { 787 | "node": ">=0.6" 788 | } 789 | }, 790 | "node_modules/esrecurse": { 791 | "version": "4.3.0", 792 | "dev": true, 793 | "license": "BSD-2-Clause", 794 | "dependencies": { 795 | "estraverse": "^5.2.0" 796 | }, 797 | "engines": { 798 | "node": ">=4.0" 799 | } 800 | }, 801 | "node_modules/esrecurse/node_modules/estraverse": { 802 | "version": "5.3.0", 803 | "dev": true, 804 | "license": "BSD-2-Clause", 805 | "engines": { 806 | "node": ">=4.0" 807 | } 808 | }, 809 | "node_modules/estraverse": { 810 | "version": "4.2.0", 811 | "dev": true, 812 | "license": "BSD-2-Clause", 813 | "engines": { 814 | "node": ">=0.10.0" 815 | } 816 | }, 817 | "node_modules/esutils": { 818 | "version": "2.0.2", 819 | "dev": true, 820 | "engines": { 821 | "node": ">=0.10.0" 822 | } 823 | }, 824 | "node_modules/extend": { 825 | "version": "3.0.2", 826 | "dev": true, 827 | "license": "MIT" 828 | }, 829 | "node_modules/external-editor": { 830 | "version": "3.1.0", 831 | "dev": true, 832 | "license": "MIT", 833 | "dependencies": { 834 | "chardet": "^0.7.0", 835 | "iconv-lite": "^0.4.24", 836 | "tmp": "^0.0.33" 837 | }, 838 | "engines": { 839 | "node": ">=4" 840 | } 841 | }, 842 | "node_modules/extsprintf": { 843 | "version": "1.3.0", 844 | "dev": true, 845 | "engines": [ 846 | "node >=0.6.0" 847 | ], 848 | "license": "MIT" 849 | }, 850 | "node_modules/fast-deep-equal": { 851 | "version": "3.1.3", 852 | "dev": true, 853 | "license": "MIT" 854 | }, 855 | "node_modules/fast-json-stable-stringify": { 856 | "version": "2.0.0", 857 | "dev": true, 858 | "license": "MIT" 859 | }, 860 | "node_modules/fast-levenshtein": { 861 | "version": "2.0.6", 862 | "dev": true, 863 | "license": "MIT" 864 | }, 865 | "node_modules/figures": { 866 | "version": "2.0.0", 867 | "dev": true, 868 | "license": "MIT", 869 | "dependencies": { 870 | "escape-string-regexp": "^1.0.5" 871 | }, 872 | "engines": { 873 | "node": ">=4" 874 | } 875 | }, 876 | "node_modules/file-entry-cache": { 877 | "version": "5.0.1", 878 | "dev": true, 879 | "license": "MIT", 880 | "dependencies": { 881 | "flat-cache": "^2.0.1" 882 | }, 883 | "engines": { 884 | "node": ">=4" 885 | } 886 | }, 887 | "node_modules/fill-range": { 888 | "version": "7.0.1", 889 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 890 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 891 | "dev": true, 892 | "dependencies": { 893 | "to-regex-range": "^5.0.1" 894 | }, 895 | "engines": { 896 | "node": ">=8" 897 | } 898 | }, 899 | "node_modules/find-up": { 900 | "version": "5.0.0", 901 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 902 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 903 | "dev": true, 904 | "dependencies": { 905 | "locate-path": "^6.0.0", 906 | "path-exists": "^4.0.0" 907 | }, 908 | "engines": { 909 | "node": ">=10" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/sindresorhus" 913 | } 914 | }, 915 | "node_modules/flat": { 916 | "version": "5.0.2", 917 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 918 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 919 | "dev": true, 920 | "bin": { 921 | "flat": "cli.js" 922 | } 923 | }, 924 | "node_modules/flat-cache": { 925 | "version": "2.0.1", 926 | "dev": true, 927 | "license": "MIT", 928 | "dependencies": { 929 | "flatted": "^2.0.0", 930 | "rimraf": "2.6.3", 931 | "write": "1.0.3" 932 | }, 933 | "engines": { 934 | "node": ">=4" 935 | } 936 | }, 937 | "node_modules/flatted": { 938 | "version": "2.0.2", 939 | "dev": true, 940 | "license": "ISC" 941 | }, 942 | "node_modules/forever-agent": { 943 | "version": "0.6.1", 944 | "dev": true, 945 | "license": "Apache-2.0", 946 | "engines": { 947 | "node": "*" 948 | } 949 | }, 950 | "node_modules/form-data": { 951 | "version": "2.3.2", 952 | "dev": true, 953 | "license": "MIT", 954 | "dependencies": { 955 | "asynckit": "^0.4.0", 956 | "combined-stream": "1.0.6", 957 | "mime-types": "^2.1.12" 958 | }, 959 | "engines": { 960 | "node": ">= 0.12" 961 | } 962 | }, 963 | "node_modules/fs.realpath": { 964 | "version": "1.0.0", 965 | "license": "ISC" 966 | }, 967 | "node_modules/fsevents": { 968 | "version": "2.3.2", 969 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 970 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 971 | "dev": true, 972 | "hasInstallScript": true, 973 | "optional": true, 974 | "os": [ 975 | "darwin" 976 | ], 977 | "engines": { 978 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 979 | } 980 | }, 981 | "node_modules/functional-red-black-tree": { 982 | "version": "1.0.1", 983 | "dev": true, 984 | "license": "MIT" 985 | }, 986 | "node_modules/get-caller-file": { 987 | "version": "2.0.5", 988 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 989 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 990 | "dev": true, 991 | "engines": { 992 | "node": "6.* || 8.* || >= 10.*" 993 | } 994 | }, 995 | "node_modules/getpass": { 996 | "version": "0.1.7", 997 | "dev": true, 998 | "license": "MIT", 999 | "dependencies": { 1000 | "assert-plus": "^1.0.0" 1001 | } 1002 | }, 1003 | "node_modules/glob": { 1004 | "version": "7.2.0", 1005 | "license": "ISC", 1006 | "dependencies": { 1007 | "fs.realpath": "^1.0.0", 1008 | "inflight": "^1.0.4", 1009 | "inherits": "2", 1010 | "minimatch": "^3.0.4", 1011 | "once": "^1.3.0", 1012 | "path-is-absolute": "^1.0.0" 1013 | }, 1014 | "engines": { 1015 | "node": "*" 1016 | }, 1017 | "funding": { 1018 | "url": "https://github.com/sponsors/isaacs" 1019 | } 1020 | }, 1021 | "node_modules/glob-parent": { 1022 | "version": "5.1.2", 1023 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1024 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "is-glob": "^4.0.1" 1028 | }, 1029 | "engines": { 1030 | "node": ">= 6" 1031 | } 1032 | }, 1033 | "node_modules/glob-promise": { 1034 | "version": "3.4.0", 1035 | "license": "ISC", 1036 | "dependencies": { 1037 | "@types/glob": "*" 1038 | }, 1039 | "engines": { 1040 | "node": ">=4" 1041 | }, 1042 | "peerDependencies": { 1043 | "glob": "*" 1044 | } 1045 | }, 1046 | "node_modules/globals": { 1047 | "version": "11.7.0", 1048 | "dev": true, 1049 | "license": "MIT", 1050 | "engines": { 1051 | "node": ">=4" 1052 | } 1053 | }, 1054 | "node_modules/growl": { 1055 | "version": "1.10.5", 1056 | "dev": true, 1057 | "license": "MIT", 1058 | "engines": { 1059 | "node": ">=4.x" 1060 | } 1061 | }, 1062 | "node_modules/handlebars": { 1063 | "version": "4.7.7", 1064 | "dev": true, 1065 | "license": "MIT", 1066 | "dependencies": { 1067 | "minimist": "^1.2.5", 1068 | "neo-async": "^2.6.0", 1069 | "source-map": "^0.6.1", 1070 | "wordwrap": "^1.0.0" 1071 | }, 1072 | "bin": { 1073 | "handlebars": "bin/handlebars" 1074 | }, 1075 | "engines": { 1076 | "node": ">=0.4.7" 1077 | }, 1078 | "optionalDependencies": { 1079 | "uglify-js": "^3.1.4" 1080 | } 1081 | }, 1082 | "node_modules/handlebars/node_modules/source-map": { 1083 | "version": "0.6.1", 1084 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1085 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1086 | "dev": true, 1087 | "engines": { 1088 | "node": ">=0.10.0" 1089 | } 1090 | }, 1091 | "node_modules/har-schema": { 1092 | "version": "2.0.0", 1093 | "dev": true, 1094 | "license": "ISC", 1095 | "engines": { 1096 | "node": ">=4" 1097 | } 1098 | }, 1099 | "node_modules/har-validator": { 1100 | "version": "5.1.5", 1101 | "dev": true, 1102 | "license": "MIT", 1103 | "dependencies": { 1104 | "ajv": "^6.12.3", 1105 | "har-schema": "^2.0.0" 1106 | }, 1107 | "engines": { 1108 | "node": ">=6" 1109 | } 1110 | }, 1111 | "node_modules/has-flag": { 1112 | "version": "3.0.0", 1113 | "dev": true, 1114 | "license": "MIT", 1115 | "engines": { 1116 | "node": ">=4" 1117 | } 1118 | }, 1119 | "node_modules/he": { 1120 | "version": "1.2.0", 1121 | "dev": true, 1122 | "license": "MIT", 1123 | "bin": { 1124 | "he": "bin/he" 1125 | } 1126 | }, 1127 | "node_modules/http-signature": { 1128 | "version": "1.2.0", 1129 | "dev": true, 1130 | "license": "MIT", 1131 | "dependencies": { 1132 | "assert-plus": "^1.0.0", 1133 | "jsprim": "^1.2.2", 1134 | "sshpk": "^1.7.0" 1135 | }, 1136 | "engines": { 1137 | "node": ">=0.8", 1138 | "npm": ">=1.3.7" 1139 | } 1140 | }, 1141 | "node_modules/iconv-lite": { 1142 | "version": "0.4.24", 1143 | "dev": true, 1144 | "license": "MIT", 1145 | "dependencies": { 1146 | "safer-buffer": ">= 2.1.2 < 3" 1147 | }, 1148 | "engines": { 1149 | "node": ">=0.10.0" 1150 | } 1151 | }, 1152 | "node_modules/ignore": { 1153 | "version": "4.0.6", 1154 | "dev": true, 1155 | "license": "MIT", 1156 | "engines": { 1157 | "node": ">= 4" 1158 | } 1159 | }, 1160 | "node_modules/import-fresh": { 1161 | "version": "3.3.0", 1162 | "dev": true, 1163 | "license": "MIT", 1164 | "dependencies": { 1165 | "parent-module": "^1.0.0", 1166 | "resolve-from": "^4.0.0" 1167 | }, 1168 | "engines": { 1169 | "node": ">=6" 1170 | }, 1171 | "funding": { 1172 | "url": "https://github.com/sponsors/sindresorhus" 1173 | } 1174 | }, 1175 | "node_modules/imurmurhash": { 1176 | "version": "0.1.4", 1177 | "dev": true, 1178 | "license": "MIT", 1179 | "engines": { 1180 | "node": ">=0.8.19" 1181 | } 1182 | }, 1183 | "node_modules/inflight": { 1184 | "version": "1.0.6", 1185 | "license": "ISC", 1186 | "dependencies": { 1187 | "once": "^1.3.0", 1188 | "wrappy": "1" 1189 | } 1190 | }, 1191 | "node_modules/inherits": { 1192 | "version": "2.0.3", 1193 | "license": "ISC" 1194 | }, 1195 | "node_modules/inquirer": { 1196 | "version": "6.5.2", 1197 | "dev": true, 1198 | "license": "MIT", 1199 | "dependencies": { 1200 | "ansi-escapes": "^3.2.0", 1201 | "chalk": "^2.4.2", 1202 | "cli-cursor": "^2.1.0", 1203 | "cli-width": "^2.0.0", 1204 | "external-editor": "^3.0.3", 1205 | "figures": "^2.0.0", 1206 | "lodash": "^4.17.12", 1207 | "mute-stream": "0.0.7", 1208 | "run-async": "^2.2.0", 1209 | "rxjs": "^6.4.0", 1210 | "string-width": "^2.1.0", 1211 | "strip-ansi": "^5.1.0", 1212 | "through": "^2.3.6" 1213 | }, 1214 | "engines": { 1215 | "node": ">=6.0.0" 1216 | } 1217 | }, 1218 | "node_modules/inquirer/node_modules/ansi-regex": { 1219 | "version": "4.1.1", 1220 | "dev": true, 1221 | "license": "MIT", 1222 | "engines": { 1223 | "node": ">=6" 1224 | } 1225 | }, 1226 | "node_modules/inquirer/node_modules/strip-ansi": { 1227 | "version": "5.2.0", 1228 | "dev": true, 1229 | "license": "MIT", 1230 | "dependencies": { 1231 | "ansi-regex": "^4.1.0" 1232 | }, 1233 | "engines": { 1234 | "node": ">=6" 1235 | } 1236 | }, 1237 | "node_modules/is-binary-path": { 1238 | "version": "2.1.0", 1239 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1240 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1241 | "dev": true, 1242 | "dependencies": { 1243 | "binary-extensions": "^2.0.0" 1244 | }, 1245 | "engines": { 1246 | "node": ">=8" 1247 | } 1248 | }, 1249 | "node_modules/is-extglob": { 1250 | "version": "2.1.1", 1251 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1252 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1253 | "dev": true, 1254 | "engines": { 1255 | "node": ">=0.10.0" 1256 | } 1257 | }, 1258 | "node_modules/is-fullwidth-code-point": { 1259 | "version": "2.0.0", 1260 | "dev": true, 1261 | "license": "MIT", 1262 | "engines": { 1263 | "node": ">=4" 1264 | } 1265 | }, 1266 | "node_modules/is-glob": { 1267 | "version": "4.0.3", 1268 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1269 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1270 | "dev": true, 1271 | "dependencies": { 1272 | "is-extglob": "^2.1.1" 1273 | }, 1274 | "engines": { 1275 | "node": ">=0.10.0" 1276 | } 1277 | }, 1278 | "node_modules/is-number": { 1279 | "version": "7.0.0", 1280 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1281 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1282 | "dev": true, 1283 | "engines": { 1284 | "node": ">=0.12.0" 1285 | } 1286 | }, 1287 | "node_modules/is-plain-obj": { 1288 | "version": "2.1.0", 1289 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1290 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1291 | "dev": true, 1292 | "engines": { 1293 | "node": ">=8" 1294 | } 1295 | }, 1296 | "node_modules/is-typedarray": { 1297 | "version": "1.0.0", 1298 | "dev": true, 1299 | "license": "MIT" 1300 | }, 1301 | "node_modules/is-unicode-supported": { 1302 | "version": "0.1.0", 1303 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1304 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1305 | "dev": true, 1306 | "engines": { 1307 | "node": ">=10" 1308 | }, 1309 | "funding": { 1310 | "url": "https://github.com/sponsors/sindresorhus" 1311 | } 1312 | }, 1313 | "node_modules/isexe": { 1314 | "version": "2.0.0", 1315 | "dev": true, 1316 | "license": "ISC" 1317 | }, 1318 | "node_modules/isstream": { 1319 | "version": "0.1.2", 1320 | "dev": true, 1321 | "license": "MIT" 1322 | }, 1323 | "node_modules/istanbul": { 1324 | "version": "0.4.5", 1325 | "dev": true, 1326 | "license": "BSD-3-Clause", 1327 | "dependencies": { 1328 | "abbrev": "1.0.x", 1329 | "async": "1.x", 1330 | "escodegen": "1.8.x", 1331 | "esprima": "2.7.x", 1332 | "glob": "^5.0.15", 1333 | "handlebars": "^4.0.1", 1334 | "js-yaml": "3.x", 1335 | "mkdirp": "0.5.x", 1336 | "nopt": "3.x", 1337 | "once": "1.x", 1338 | "resolve": "1.1.x", 1339 | "supports-color": "^3.1.0", 1340 | "which": "^1.1.1", 1341 | "wordwrap": "^1.0.0" 1342 | }, 1343 | "bin": { 1344 | "istanbul": "lib/cli.js" 1345 | } 1346 | }, 1347 | "node_modules/istanbul/node_modules/esprima": { 1348 | "version": "2.7.3", 1349 | "dev": true, 1350 | "license": "BSD-2-Clause", 1351 | "bin": { 1352 | "esparse": "bin/esparse.js", 1353 | "esvalidate": "bin/esvalidate.js" 1354 | }, 1355 | "engines": { 1356 | "node": ">=0.10.0" 1357 | } 1358 | }, 1359 | "node_modules/istanbul/node_modules/glob": { 1360 | "version": "5.0.15", 1361 | "dev": true, 1362 | "license": "ISC", 1363 | "dependencies": { 1364 | "inflight": "^1.0.4", 1365 | "inherits": "2", 1366 | "minimatch": "2 || 3", 1367 | "once": "^1.3.0", 1368 | "path-is-absolute": "^1.0.0" 1369 | }, 1370 | "engines": { 1371 | "node": "*" 1372 | } 1373 | }, 1374 | "node_modules/istanbul/node_modules/has-flag": { 1375 | "version": "1.0.0", 1376 | "dev": true, 1377 | "license": "MIT", 1378 | "engines": { 1379 | "node": ">=0.10.0" 1380 | } 1381 | }, 1382 | "node_modules/istanbul/node_modules/supports-color": { 1383 | "version": "3.2.3", 1384 | "dev": true, 1385 | "license": "MIT", 1386 | "dependencies": { 1387 | "has-flag": "^1.0.0" 1388 | }, 1389 | "engines": { 1390 | "node": ">=0.8.0" 1391 | } 1392 | }, 1393 | "node_modules/js-tokens": { 1394 | "version": "4.0.0", 1395 | "dev": true, 1396 | "license": "MIT" 1397 | }, 1398 | "node_modules/js-yaml": { 1399 | "version": "3.13.1", 1400 | "dev": true, 1401 | "license": "MIT", 1402 | "dependencies": { 1403 | "argparse": "^1.0.7", 1404 | "esprima": "^4.0.0" 1405 | }, 1406 | "bin": { 1407 | "js-yaml": "bin/js-yaml.js" 1408 | } 1409 | }, 1410 | "node_modules/jsbn": { 1411 | "version": "0.1.1", 1412 | "dev": true, 1413 | "license": "MIT", 1414 | "optional": true 1415 | }, 1416 | "node_modules/json-schema": { 1417 | "version": "0.4.0", 1418 | "dev": true, 1419 | "license": "(AFL-2.1 OR BSD-3-Clause)" 1420 | }, 1421 | "node_modules/json-schema-traverse": { 1422 | "version": "0.4.1", 1423 | "dev": true, 1424 | "license": "MIT" 1425 | }, 1426 | "node_modules/json-stable-stringify-without-jsonify": { 1427 | "version": "1.0.1", 1428 | "dev": true, 1429 | "license": "MIT" 1430 | }, 1431 | "node_modules/json-stringify-safe": { 1432 | "version": "5.0.1", 1433 | "dev": true, 1434 | "license": "ISC" 1435 | }, 1436 | "node_modules/jsprim": { 1437 | "version": "1.4.2", 1438 | "dev": true, 1439 | "license": "MIT", 1440 | "dependencies": { 1441 | "assert-plus": "1.0.0", 1442 | "extsprintf": "1.3.0", 1443 | "json-schema": "0.4.0", 1444 | "verror": "1.10.0" 1445 | }, 1446 | "engines": { 1447 | "node": ">=0.6.0" 1448 | } 1449 | }, 1450 | "node_modules/lcov-parse": { 1451 | "version": "0.0.10", 1452 | "dev": true, 1453 | "license": "BSD-3-Clause" 1454 | }, 1455 | "node_modules/levn": { 1456 | "version": "0.3.0", 1457 | "dev": true, 1458 | "license": "MIT", 1459 | "dependencies": { 1460 | "prelude-ls": "~1.1.2", 1461 | "type-check": "~0.3.2" 1462 | }, 1463 | "engines": { 1464 | "node": ">= 0.8.0" 1465 | } 1466 | }, 1467 | "node_modules/locate-path": { 1468 | "version": "6.0.0", 1469 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1470 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "p-locate": "^5.0.0" 1474 | }, 1475 | "engines": { 1476 | "node": ">=10" 1477 | }, 1478 | "funding": { 1479 | "url": "https://github.com/sponsors/sindresorhus" 1480 | } 1481 | }, 1482 | "node_modules/lodash": { 1483 | "version": "4.17.21", 1484 | "dev": true, 1485 | "license": "MIT" 1486 | }, 1487 | "node_modules/log-driver": { 1488 | "version": "1.2.7", 1489 | "dev": true, 1490 | "license": "ISC", 1491 | "engines": { 1492 | "node": ">=0.8.6" 1493 | } 1494 | }, 1495 | "node_modules/log-symbols": { 1496 | "version": "4.1.0", 1497 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1498 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1499 | "dev": true, 1500 | "dependencies": { 1501 | "chalk": "^4.1.0", 1502 | "is-unicode-supported": "^0.1.0" 1503 | }, 1504 | "engines": { 1505 | "node": ">=10" 1506 | }, 1507 | "funding": { 1508 | "url": "https://github.com/sponsors/sindresorhus" 1509 | } 1510 | }, 1511 | "node_modules/log-symbols/node_modules/ansi-styles": { 1512 | "version": "4.3.0", 1513 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1514 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1515 | "dev": true, 1516 | "dependencies": { 1517 | "color-convert": "^2.0.1" 1518 | }, 1519 | "engines": { 1520 | "node": ">=8" 1521 | }, 1522 | "funding": { 1523 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1524 | } 1525 | }, 1526 | "node_modules/log-symbols/node_modules/chalk": { 1527 | "version": "4.1.2", 1528 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1529 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "ansi-styles": "^4.1.0", 1533 | "supports-color": "^7.1.0" 1534 | }, 1535 | "engines": { 1536 | "node": ">=10" 1537 | }, 1538 | "funding": { 1539 | "url": "https://github.com/chalk/chalk?sponsor=1" 1540 | } 1541 | }, 1542 | "node_modules/log-symbols/node_modules/color-convert": { 1543 | "version": "2.0.1", 1544 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1545 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1546 | "dev": true, 1547 | "dependencies": { 1548 | "color-name": "~1.1.4" 1549 | }, 1550 | "engines": { 1551 | "node": ">=7.0.0" 1552 | } 1553 | }, 1554 | "node_modules/log-symbols/node_modules/color-name": { 1555 | "version": "1.1.4", 1556 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1557 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1558 | "dev": true 1559 | }, 1560 | "node_modules/log-symbols/node_modules/has-flag": { 1561 | "version": "4.0.0", 1562 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1563 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1564 | "dev": true, 1565 | "engines": { 1566 | "node": ">=8" 1567 | } 1568 | }, 1569 | "node_modules/log-symbols/node_modules/supports-color": { 1570 | "version": "7.2.0", 1571 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1572 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1573 | "dev": true, 1574 | "dependencies": { 1575 | "has-flag": "^4.0.0" 1576 | }, 1577 | "engines": { 1578 | "node": ">=8" 1579 | } 1580 | }, 1581 | "node_modules/mime-db": { 1582 | "version": "1.36.0", 1583 | "dev": true, 1584 | "license": "MIT", 1585 | "engines": { 1586 | "node": ">= 0.6" 1587 | } 1588 | }, 1589 | "node_modules/mime-types": { 1590 | "version": "2.1.20", 1591 | "dev": true, 1592 | "license": "MIT", 1593 | "dependencies": { 1594 | "mime-db": "~1.36.0" 1595 | }, 1596 | "engines": { 1597 | "node": ">= 0.6" 1598 | } 1599 | }, 1600 | "node_modules/mimic-fn": { 1601 | "version": "1.2.0", 1602 | "dev": true, 1603 | "license": "MIT", 1604 | "engines": { 1605 | "node": ">=4" 1606 | } 1607 | }, 1608 | "node_modules/minimatch": { 1609 | "version": "3.1.2", 1610 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1611 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1612 | "dependencies": { 1613 | "brace-expansion": "^1.1.7" 1614 | }, 1615 | "engines": { 1616 | "node": "*" 1617 | } 1618 | }, 1619 | "node_modules/minimist": { 1620 | "version": "1.2.6", 1621 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1622 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1623 | "devOptional": true 1624 | }, 1625 | "node_modules/mkdirp": { 1626 | "version": "0.5.5", 1627 | "devOptional": true, 1628 | "license": "MIT", 1629 | "dependencies": { 1630 | "minimist": "^1.2.5" 1631 | }, 1632 | "bin": { 1633 | "mkdirp": "bin/cmd.js" 1634 | } 1635 | }, 1636 | "node_modules/mocha": { 1637 | "version": "10.2.0", 1638 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1639 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1640 | "dev": true, 1641 | "dependencies": { 1642 | "ansi-colors": "4.1.1", 1643 | "browser-stdout": "1.3.1", 1644 | "chokidar": "3.5.3", 1645 | "debug": "4.3.4", 1646 | "diff": "5.0.0", 1647 | "escape-string-regexp": "4.0.0", 1648 | "find-up": "5.0.0", 1649 | "glob": "7.2.0", 1650 | "he": "1.2.0", 1651 | "js-yaml": "4.1.0", 1652 | "log-symbols": "4.1.0", 1653 | "minimatch": "5.0.1", 1654 | "ms": "2.1.3", 1655 | "nanoid": "3.3.3", 1656 | "serialize-javascript": "6.0.0", 1657 | "strip-json-comments": "3.1.1", 1658 | "supports-color": "8.1.1", 1659 | "workerpool": "6.2.1", 1660 | "yargs": "16.2.0", 1661 | "yargs-parser": "20.2.4", 1662 | "yargs-unparser": "2.0.0" 1663 | }, 1664 | "bin": { 1665 | "_mocha": "bin/_mocha", 1666 | "mocha": "bin/mocha.js" 1667 | }, 1668 | "engines": { 1669 | "node": ">= 14.0.0" 1670 | }, 1671 | "funding": { 1672 | "type": "opencollective", 1673 | "url": "https://opencollective.com/mochajs" 1674 | } 1675 | }, 1676 | "node_modules/mocha-lcov-reporter": { 1677 | "version": "1.3.0", 1678 | "dev": true, 1679 | "license": "BSD-2-Clause", 1680 | "engines": { 1681 | "node": ">= 0.6.0" 1682 | } 1683 | }, 1684 | "node_modules/mocha/node_modules/argparse": { 1685 | "version": "2.0.1", 1686 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1687 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1688 | "dev": true 1689 | }, 1690 | "node_modules/mocha/node_modules/brace-expansion": { 1691 | "version": "2.0.1", 1692 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1693 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1694 | "dev": true, 1695 | "dependencies": { 1696 | "balanced-match": "^1.0.0" 1697 | } 1698 | }, 1699 | "node_modules/mocha/node_modules/escape-string-regexp": { 1700 | "version": "4.0.0", 1701 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1702 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1703 | "dev": true, 1704 | "engines": { 1705 | "node": ">=10" 1706 | }, 1707 | "funding": { 1708 | "url": "https://github.com/sponsors/sindresorhus" 1709 | } 1710 | }, 1711 | "node_modules/mocha/node_modules/has-flag": { 1712 | "version": "4.0.0", 1713 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1714 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1715 | "dev": true, 1716 | "engines": { 1717 | "node": ">=8" 1718 | } 1719 | }, 1720 | "node_modules/mocha/node_modules/js-yaml": { 1721 | "version": "4.1.0", 1722 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1723 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1724 | "dev": true, 1725 | "dependencies": { 1726 | "argparse": "^2.0.1" 1727 | }, 1728 | "bin": { 1729 | "js-yaml": "bin/js-yaml.js" 1730 | } 1731 | }, 1732 | "node_modules/mocha/node_modules/minimatch": { 1733 | "version": "5.0.1", 1734 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1735 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1736 | "dev": true, 1737 | "dependencies": { 1738 | "brace-expansion": "^2.0.1" 1739 | }, 1740 | "engines": { 1741 | "node": ">=10" 1742 | } 1743 | }, 1744 | "node_modules/mocha/node_modules/ms": { 1745 | "version": "2.1.3", 1746 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1747 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1748 | "dev": true 1749 | }, 1750 | "node_modules/mocha/node_modules/strip-json-comments": { 1751 | "version": "3.1.1", 1752 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1753 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1754 | "dev": true, 1755 | "engines": { 1756 | "node": ">=8" 1757 | }, 1758 | "funding": { 1759 | "url": "https://github.com/sponsors/sindresorhus" 1760 | } 1761 | }, 1762 | "node_modules/mocha/node_modules/supports-color": { 1763 | "version": "8.1.1", 1764 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1765 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1766 | "dev": true, 1767 | "dependencies": { 1768 | "has-flag": "^4.0.0" 1769 | }, 1770 | "engines": { 1771 | "node": ">=10" 1772 | }, 1773 | "funding": { 1774 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1775 | } 1776 | }, 1777 | "node_modules/moment": { 1778 | "version": "2.29.4", 1779 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 1780 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 1781 | "optional": true, 1782 | "engines": { 1783 | "node": "*" 1784 | } 1785 | }, 1786 | "node_modules/ms": { 1787 | "version": "2.1.2", 1788 | "dev": true, 1789 | "license": "MIT" 1790 | }, 1791 | "node_modules/mute-stream": { 1792 | "version": "0.0.7", 1793 | "dev": true, 1794 | "license": "ISC" 1795 | }, 1796 | "node_modules/mv": { 1797 | "version": "2.1.1", 1798 | "license": "MIT", 1799 | "optional": true, 1800 | "dependencies": { 1801 | "mkdirp": "~0.5.1", 1802 | "ncp": "~2.0.0", 1803 | "rimraf": "~2.4.0" 1804 | }, 1805 | "engines": { 1806 | "node": ">=0.8.0" 1807 | } 1808 | }, 1809 | "node_modules/mv/node_modules/glob": { 1810 | "version": "6.0.4", 1811 | "license": "ISC", 1812 | "optional": true, 1813 | "dependencies": { 1814 | "inflight": "^1.0.4", 1815 | "inherits": "2", 1816 | "minimatch": "2 || 3", 1817 | "once": "^1.3.0", 1818 | "path-is-absolute": "^1.0.0" 1819 | }, 1820 | "engines": { 1821 | "node": "*" 1822 | } 1823 | }, 1824 | "node_modules/mv/node_modules/rimraf": { 1825 | "version": "2.4.5", 1826 | "license": "ISC", 1827 | "optional": true, 1828 | "dependencies": { 1829 | "glob": "^6.0.1" 1830 | }, 1831 | "bin": { 1832 | "rimraf": "bin.js" 1833 | } 1834 | }, 1835 | "node_modules/nan": { 1836 | "version": "2.11.0", 1837 | "license": "MIT", 1838 | "optional": true 1839 | }, 1840 | "node_modules/nanoid": { 1841 | "version": "3.3.3", 1842 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1843 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1844 | "dev": true, 1845 | "bin": { 1846 | "nanoid": "bin/nanoid.cjs" 1847 | }, 1848 | "engines": { 1849 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1850 | } 1851 | }, 1852 | "node_modules/natural-compare": { 1853 | "version": "1.4.0", 1854 | "dev": true, 1855 | "license": "MIT" 1856 | }, 1857 | "node_modules/ncp": { 1858 | "version": "2.0.0", 1859 | "license": "MIT", 1860 | "optional": true, 1861 | "bin": { 1862 | "ncp": "bin/ncp" 1863 | } 1864 | }, 1865 | "node_modules/neo-async": { 1866 | "version": "2.6.1", 1867 | "dev": true, 1868 | "license": "MIT" 1869 | }, 1870 | "node_modules/nice-try": { 1871 | "version": "1.0.5", 1872 | "dev": true, 1873 | "license": "MIT" 1874 | }, 1875 | "node_modules/nopt": { 1876 | "version": "3.0.6", 1877 | "dev": true, 1878 | "license": "ISC", 1879 | "dependencies": { 1880 | "abbrev": "1" 1881 | }, 1882 | "bin": { 1883 | "nopt": "bin/nopt.js" 1884 | } 1885 | }, 1886 | "node_modules/normalize-path": { 1887 | "version": "3.0.0", 1888 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1889 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1890 | "dev": true, 1891 | "engines": { 1892 | "node": ">=0.10.0" 1893 | } 1894 | }, 1895 | "node_modules/oauth-sign": { 1896 | "version": "0.9.0", 1897 | "dev": true, 1898 | "license": "Apache-2.0", 1899 | "engines": { 1900 | "node": "*" 1901 | } 1902 | }, 1903 | "node_modules/once": { 1904 | "version": "1.4.0", 1905 | "license": "ISC", 1906 | "dependencies": { 1907 | "wrappy": "1" 1908 | } 1909 | }, 1910 | "node_modules/onetime": { 1911 | "version": "2.0.1", 1912 | "dev": true, 1913 | "license": "MIT", 1914 | "dependencies": { 1915 | "mimic-fn": "^1.0.0" 1916 | }, 1917 | "engines": { 1918 | "node": ">=4" 1919 | } 1920 | }, 1921 | "node_modules/optionator": { 1922 | "version": "0.8.2", 1923 | "dev": true, 1924 | "license": "MIT", 1925 | "dependencies": { 1926 | "deep-is": "~0.1.3", 1927 | "fast-levenshtein": "~2.0.4", 1928 | "levn": "~0.3.0", 1929 | "prelude-ls": "~1.1.2", 1930 | "type-check": "~0.3.2", 1931 | "wordwrap": "~1.0.0" 1932 | }, 1933 | "engines": { 1934 | "node": ">= 0.8.0" 1935 | } 1936 | }, 1937 | "node_modules/os-tmpdir": { 1938 | "version": "1.0.2", 1939 | "dev": true, 1940 | "license": "MIT", 1941 | "engines": { 1942 | "node": ">=0.10.0" 1943 | } 1944 | }, 1945 | "node_modules/p-limit": { 1946 | "version": "3.1.0", 1947 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1948 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1949 | "dev": true, 1950 | "dependencies": { 1951 | "yocto-queue": "^0.1.0" 1952 | }, 1953 | "engines": { 1954 | "node": ">=10" 1955 | }, 1956 | "funding": { 1957 | "url": "https://github.com/sponsors/sindresorhus" 1958 | } 1959 | }, 1960 | "node_modules/p-locate": { 1961 | "version": "5.0.0", 1962 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1963 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1964 | "dev": true, 1965 | "dependencies": { 1966 | "p-limit": "^3.0.2" 1967 | }, 1968 | "engines": { 1969 | "node": ">=10" 1970 | }, 1971 | "funding": { 1972 | "url": "https://github.com/sponsors/sindresorhus" 1973 | } 1974 | }, 1975 | "node_modules/parent-module": { 1976 | "version": "1.0.1", 1977 | "dev": true, 1978 | "license": "MIT", 1979 | "dependencies": { 1980 | "callsites": "^3.0.0" 1981 | }, 1982 | "engines": { 1983 | "node": ">=6" 1984 | } 1985 | }, 1986 | "node_modules/path": { 1987 | "version": "0.12.7", 1988 | "license": "MIT", 1989 | "dependencies": { 1990 | "process": "^0.11.1", 1991 | "util": "^0.10.3" 1992 | } 1993 | }, 1994 | "node_modules/path-exists": { 1995 | "version": "4.0.0", 1996 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1997 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1998 | "dev": true, 1999 | "engines": { 2000 | "node": ">=8" 2001 | } 2002 | }, 2003 | "node_modules/path-is-absolute": { 2004 | "version": "1.0.1", 2005 | "license": "MIT", 2006 | "engines": { 2007 | "node": ">=0.10.0" 2008 | } 2009 | }, 2010 | "node_modules/path-is-inside": { 2011 | "version": "1.0.2", 2012 | "dev": true, 2013 | "license": "(WTFPL OR MIT)" 2014 | }, 2015 | "node_modules/path-key": { 2016 | "version": "2.0.1", 2017 | "dev": true, 2018 | "license": "MIT", 2019 | "engines": { 2020 | "node": ">=4" 2021 | } 2022 | }, 2023 | "node_modules/performance-now": { 2024 | "version": "2.1.0", 2025 | "dev": true, 2026 | "license": "MIT" 2027 | }, 2028 | "node_modules/picomatch": { 2029 | "version": "2.3.1", 2030 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2031 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2032 | "dev": true, 2033 | "engines": { 2034 | "node": ">=8.6" 2035 | }, 2036 | "funding": { 2037 | "url": "https://github.com/sponsors/jonschlinkert" 2038 | } 2039 | }, 2040 | "node_modules/prelude-ls": { 2041 | "version": "1.1.2", 2042 | "dev": true, 2043 | "engines": { 2044 | "node": ">= 0.8.0" 2045 | } 2046 | }, 2047 | "node_modules/process": { 2048 | "version": "0.11.10", 2049 | "license": "MIT", 2050 | "engines": { 2051 | "node": ">= 0.6.0" 2052 | } 2053 | }, 2054 | "node_modules/progress": { 2055 | "version": "2.0.0", 2056 | "dev": true, 2057 | "license": "MIT", 2058 | "engines": { 2059 | "node": ">=0.4.0" 2060 | } 2061 | }, 2062 | "node_modules/psl": { 2063 | "version": "1.1.29", 2064 | "dev": true, 2065 | "license": "MIT" 2066 | }, 2067 | "node_modules/punycode": { 2068 | "version": "2.1.1", 2069 | "dev": true, 2070 | "license": "MIT", 2071 | "engines": { 2072 | "node": ">=6" 2073 | } 2074 | }, 2075 | "node_modules/qs": { 2076 | "version": "6.5.3", 2077 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 2078 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 2079 | "dev": true, 2080 | "engines": { 2081 | "node": ">=0.6" 2082 | } 2083 | }, 2084 | "node_modules/randombytes": { 2085 | "version": "2.1.0", 2086 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2087 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2088 | "dev": true, 2089 | "dependencies": { 2090 | "safe-buffer": "^5.1.0" 2091 | } 2092 | }, 2093 | "node_modules/readdirp": { 2094 | "version": "3.6.0", 2095 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2096 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2097 | "dev": true, 2098 | "dependencies": { 2099 | "picomatch": "^2.2.1" 2100 | }, 2101 | "engines": { 2102 | "node": ">=8.10.0" 2103 | } 2104 | }, 2105 | "node_modules/regexpp": { 2106 | "version": "2.0.1", 2107 | "dev": true, 2108 | "license": "MIT", 2109 | "engines": { 2110 | "node": ">=6.5.0" 2111 | } 2112 | }, 2113 | "node_modules/request": { 2114 | "version": "2.88.0", 2115 | "dev": true, 2116 | "license": "Apache-2.0", 2117 | "dependencies": { 2118 | "aws-sign2": "~0.7.0", 2119 | "aws4": "^1.8.0", 2120 | "caseless": "~0.12.0", 2121 | "combined-stream": "~1.0.6", 2122 | "extend": "~3.0.2", 2123 | "forever-agent": "~0.6.1", 2124 | "form-data": "~2.3.2", 2125 | "har-validator": "~5.1.0", 2126 | "http-signature": "~1.2.0", 2127 | "is-typedarray": "~1.0.0", 2128 | "isstream": "~0.1.2", 2129 | "json-stringify-safe": "~5.0.1", 2130 | "mime-types": "~2.1.19", 2131 | "oauth-sign": "~0.9.0", 2132 | "performance-now": "^2.1.0", 2133 | "qs": "~6.5.2", 2134 | "safe-buffer": "^5.1.2", 2135 | "tough-cookie": "~2.4.3", 2136 | "tunnel-agent": "^0.6.0", 2137 | "uuid": "^3.3.2" 2138 | }, 2139 | "engines": { 2140 | "node": ">= 4" 2141 | } 2142 | }, 2143 | "node_modules/require-directory": { 2144 | "version": "2.1.1", 2145 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2146 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2147 | "dev": true, 2148 | "engines": { 2149 | "node": ">=0.10.0" 2150 | } 2151 | }, 2152 | "node_modules/resolve": { 2153 | "version": "1.1.7", 2154 | "dev": true, 2155 | "license": "MIT" 2156 | }, 2157 | "node_modules/resolve-from": { 2158 | "version": "4.0.0", 2159 | "dev": true, 2160 | "license": "MIT", 2161 | "engines": { 2162 | "node": ">=4" 2163 | } 2164 | }, 2165 | "node_modules/restore-cursor": { 2166 | "version": "2.0.0", 2167 | "dev": true, 2168 | "license": "MIT", 2169 | "dependencies": { 2170 | "onetime": "^2.0.0", 2171 | "signal-exit": "^3.0.2" 2172 | }, 2173 | "engines": { 2174 | "node": ">=4" 2175 | } 2176 | }, 2177 | "node_modules/rimraf": { 2178 | "version": "2.6.3", 2179 | "dev": true, 2180 | "license": "ISC", 2181 | "dependencies": { 2182 | "glob": "^7.1.3" 2183 | }, 2184 | "bin": { 2185 | "rimraf": "bin.js" 2186 | } 2187 | }, 2188 | "node_modules/run-async": { 2189 | "version": "2.4.1", 2190 | "dev": true, 2191 | "license": "MIT", 2192 | "engines": { 2193 | "node": ">=0.12.0" 2194 | } 2195 | }, 2196 | "node_modules/rxjs": { 2197 | "version": "6.6.7", 2198 | "dev": true, 2199 | "license": "Apache-2.0", 2200 | "dependencies": { 2201 | "tslib": "^1.9.0" 2202 | }, 2203 | "engines": { 2204 | "npm": ">=2.0.0" 2205 | } 2206 | }, 2207 | "node_modules/safe-buffer": { 2208 | "version": "5.1.2", 2209 | "dev": true, 2210 | "license": "MIT" 2211 | }, 2212 | "node_modules/safe-json-stringify": { 2213 | "version": "1.2.0", 2214 | "license": "MIT", 2215 | "optional": true 2216 | }, 2217 | "node_modules/safer-buffer": { 2218 | "version": "2.1.2", 2219 | "dev": true, 2220 | "license": "MIT" 2221 | }, 2222 | "node_modules/semver": { 2223 | "version": "5.5.1", 2224 | "dev": true, 2225 | "license": "ISC", 2226 | "bin": { 2227 | "semver": "bin/semver" 2228 | } 2229 | }, 2230 | "node_modules/serialize-javascript": { 2231 | "version": "6.0.0", 2232 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2233 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2234 | "dev": true, 2235 | "dependencies": { 2236 | "randombytes": "^2.1.0" 2237 | } 2238 | }, 2239 | "node_modules/shebang-command": { 2240 | "version": "1.2.0", 2241 | "dev": true, 2242 | "license": "MIT", 2243 | "dependencies": { 2244 | "shebang-regex": "^1.0.0" 2245 | }, 2246 | "engines": { 2247 | "node": ">=0.10.0" 2248 | } 2249 | }, 2250 | "node_modules/shebang-regex": { 2251 | "version": "1.0.0", 2252 | "dev": true, 2253 | "license": "MIT", 2254 | "engines": { 2255 | "node": ">=0.10.0" 2256 | } 2257 | }, 2258 | "node_modules/signal-exit": { 2259 | "version": "3.0.7", 2260 | "dev": true, 2261 | "license": "ISC" 2262 | }, 2263 | "node_modules/slice-ansi": { 2264 | "version": "2.1.0", 2265 | "dev": true, 2266 | "license": "MIT", 2267 | "dependencies": { 2268 | "ansi-styles": "^3.2.0", 2269 | "astral-regex": "^1.0.0", 2270 | "is-fullwidth-code-point": "^2.0.0" 2271 | }, 2272 | "engines": { 2273 | "node": ">=6" 2274 | } 2275 | }, 2276 | "node_modules/source-map": { 2277 | "version": "0.2.0", 2278 | "dev": true, 2279 | "optional": true, 2280 | "dependencies": { 2281 | "amdefine": ">=0.0.4" 2282 | }, 2283 | "engines": { 2284 | "node": ">=0.8.0" 2285 | } 2286 | }, 2287 | "node_modules/sprintf-js": { 2288 | "version": "1.0.3", 2289 | "dev": true, 2290 | "license": "BSD-3-Clause" 2291 | }, 2292 | "node_modules/sshpk": { 2293 | "version": "1.14.2", 2294 | "dev": true, 2295 | "license": "MIT", 2296 | "dependencies": { 2297 | "asn1": "~0.2.3", 2298 | "assert-plus": "^1.0.0", 2299 | "dashdash": "^1.12.0", 2300 | "getpass": "^0.1.1", 2301 | "safer-buffer": "^2.0.2" 2302 | }, 2303 | "bin": { 2304 | "sshpk-conv": "bin/sshpk-conv", 2305 | "sshpk-sign": "bin/sshpk-sign", 2306 | "sshpk-verify": "bin/sshpk-verify" 2307 | }, 2308 | "engines": { 2309 | "node": ">=0.10.0" 2310 | }, 2311 | "optionalDependencies": { 2312 | "bcrypt-pbkdf": "^1.0.0", 2313 | "ecc-jsbn": "~0.1.1", 2314 | "jsbn": "~0.1.0", 2315 | "tweetnacl": "~0.14.0" 2316 | } 2317 | }, 2318 | "node_modules/string-width": { 2319 | "version": "2.1.1", 2320 | "dev": true, 2321 | "license": "MIT", 2322 | "dependencies": { 2323 | "is-fullwidth-code-point": "^2.0.0", 2324 | "strip-ansi": "^4.0.0" 2325 | }, 2326 | "engines": { 2327 | "node": ">=4" 2328 | } 2329 | }, 2330 | "node_modules/strip-ansi": { 2331 | "version": "4.0.0", 2332 | "dev": true, 2333 | "license": "MIT", 2334 | "dependencies": { 2335 | "ansi-regex": "^3.0.0" 2336 | }, 2337 | "engines": { 2338 | "node": ">=4" 2339 | } 2340 | }, 2341 | "node_modules/strip-json-comments": { 2342 | "version": "2.0.1", 2343 | "dev": true, 2344 | "license": "MIT", 2345 | "engines": { 2346 | "node": ">=0.10.0" 2347 | } 2348 | }, 2349 | "node_modules/supports-color": { 2350 | "version": "5.5.0", 2351 | "dev": true, 2352 | "license": "MIT", 2353 | "dependencies": { 2354 | "has-flag": "^3.0.0" 2355 | }, 2356 | "engines": { 2357 | "node": ">=4" 2358 | } 2359 | }, 2360 | "node_modules/table": { 2361 | "version": "5.4.6", 2362 | "dev": true, 2363 | "license": "BSD-3-Clause", 2364 | "dependencies": { 2365 | "ajv": "^6.10.2", 2366 | "lodash": "^4.17.14", 2367 | "slice-ansi": "^2.1.0", 2368 | "string-width": "^3.0.0" 2369 | }, 2370 | "engines": { 2371 | "node": ">=6.0.0" 2372 | } 2373 | }, 2374 | "node_modules/table/node_modules/ansi-regex": { 2375 | "version": "4.1.1", 2376 | "dev": true, 2377 | "license": "MIT", 2378 | "engines": { 2379 | "node": ">=6" 2380 | } 2381 | }, 2382 | "node_modules/table/node_modules/string-width": { 2383 | "version": "3.1.0", 2384 | "dev": true, 2385 | "license": "MIT", 2386 | "dependencies": { 2387 | "emoji-regex": "^7.0.1", 2388 | "is-fullwidth-code-point": "^2.0.0", 2389 | "strip-ansi": "^5.1.0" 2390 | }, 2391 | "engines": { 2392 | "node": ">=6" 2393 | } 2394 | }, 2395 | "node_modules/table/node_modules/strip-ansi": { 2396 | "version": "5.2.0", 2397 | "dev": true, 2398 | "license": "MIT", 2399 | "dependencies": { 2400 | "ansi-regex": "^4.1.0" 2401 | }, 2402 | "engines": { 2403 | "node": ">=6" 2404 | } 2405 | }, 2406 | "node_modules/text-table": { 2407 | "version": "0.2.0", 2408 | "dev": true, 2409 | "license": "MIT" 2410 | }, 2411 | "node_modules/through": { 2412 | "version": "2.3.8", 2413 | "dev": true, 2414 | "license": "MIT" 2415 | }, 2416 | "node_modules/tmp": { 2417 | "version": "0.0.33", 2418 | "dev": true, 2419 | "license": "MIT", 2420 | "dependencies": { 2421 | "os-tmpdir": "~1.0.2" 2422 | }, 2423 | "engines": { 2424 | "node": ">=0.6.0" 2425 | } 2426 | }, 2427 | "node_modules/to-regex-range": { 2428 | "version": "5.0.1", 2429 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2430 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2431 | "dev": true, 2432 | "dependencies": { 2433 | "is-number": "^7.0.0" 2434 | }, 2435 | "engines": { 2436 | "node": ">=8.0" 2437 | } 2438 | }, 2439 | "node_modules/tough-cookie": { 2440 | "version": "2.4.3", 2441 | "dev": true, 2442 | "license": "BSD-3-Clause", 2443 | "dependencies": { 2444 | "psl": "^1.1.24", 2445 | "punycode": "^1.4.1" 2446 | }, 2447 | "engines": { 2448 | "node": ">=0.8" 2449 | } 2450 | }, 2451 | "node_modules/tough-cookie/node_modules/punycode": { 2452 | "version": "1.4.1", 2453 | "dev": true, 2454 | "license": "MIT" 2455 | }, 2456 | "node_modules/tslib": { 2457 | "version": "1.14.1", 2458 | "dev": true, 2459 | "license": "0BSD" 2460 | }, 2461 | "node_modules/tunnel-agent": { 2462 | "version": "0.6.0", 2463 | "dev": true, 2464 | "license": "Apache-2.0", 2465 | "dependencies": { 2466 | "safe-buffer": "^5.0.1" 2467 | }, 2468 | "engines": { 2469 | "node": "*" 2470 | } 2471 | }, 2472 | "node_modules/tweetnacl": { 2473 | "version": "0.14.5", 2474 | "dev": true, 2475 | "license": "Unlicense", 2476 | "optional": true 2477 | }, 2478 | "node_modules/type-check": { 2479 | "version": "0.3.2", 2480 | "dev": true, 2481 | "license": "MIT", 2482 | "dependencies": { 2483 | "prelude-ls": "~1.1.2" 2484 | }, 2485 | "engines": { 2486 | "node": ">= 0.8.0" 2487 | } 2488 | }, 2489 | "node_modules/uglify-js": { 2490 | "version": "3.4.9", 2491 | "dev": true, 2492 | "license": "BSD-2-Clause", 2493 | "optional": true, 2494 | "dependencies": { 2495 | "commander": "~2.17.1", 2496 | "source-map": "~0.6.1" 2497 | }, 2498 | "bin": { 2499 | "uglifyjs": "bin/uglifyjs" 2500 | }, 2501 | "engines": { 2502 | "node": ">=0.8.0" 2503 | } 2504 | }, 2505 | "node_modules/uglify-js/node_modules/commander": { 2506 | "version": "2.17.1", 2507 | "dev": true, 2508 | "license": "MIT", 2509 | "optional": true 2510 | }, 2511 | "node_modules/uglify-js/node_modules/source-map": { 2512 | "version": "0.6.1", 2513 | "dev": true, 2514 | "license": "BSD-3-Clause", 2515 | "optional": true, 2516 | "engines": { 2517 | "node": ">=0.10.0" 2518 | } 2519 | }, 2520 | "node_modules/uri-js": { 2521 | "version": "4.4.1", 2522 | "dev": true, 2523 | "license": "BSD-2-Clause", 2524 | "dependencies": { 2525 | "punycode": "^2.1.0" 2526 | } 2527 | }, 2528 | "node_modules/util": { 2529 | "version": "0.10.3", 2530 | "license": "MIT", 2531 | "dependencies": { 2532 | "inherits": "2.0.1" 2533 | } 2534 | }, 2535 | "node_modules/util/node_modules/inherits": { 2536 | "version": "2.0.1", 2537 | "license": "ISC" 2538 | }, 2539 | "node_modules/uuid": { 2540 | "version": "3.3.2", 2541 | "dev": true, 2542 | "license": "MIT", 2543 | "bin": { 2544 | "uuid": "bin/uuid" 2545 | } 2546 | }, 2547 | "node_modules/verror": { 2548 | "version": "1.10.0", 2549 | "dev": true, 2550 | "engines": [ 2551 | "node >=0.6.0" 2552 | ], 2553 | "license": "MIT", 2554 | "dependencies": { 2555 | "assert-plus": "^1.0.0", 2556 | "core-util-is": "1.0.2", 2557 | "extsprintf": "^1.2.0" 2558 | } 2559 | }, 2560 | "node_modules/which": { 2561 | "version": "1.3.1", 2562 | "dev": true, 2563 | "license": "ISC", 2564 | "dependencies": { 2565 | "isexe": "^2.0.0" 2566 | }, 2567 | "bin": { 2568 | "which": "bin/which" 2569 | } 2570 | }, 2571 | "node_modules/wordwrap": { 2572 | "version": "1.0.0", 2573 | "dev": true, 2574 | "license": "MIT" 2575 | }, 2576 | "node_modules/workerpool": { 2577 | "version": "6.2.1", 2578 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2579 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2580 | "dev": true 2581 | }, 2582 | "node_modules/wrap-ansi": { 2583 | "version": "7.0.0", 2584 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2585 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2586 | "dev": true, 2587 | "dependencies": { 2588 | "ansi-styles": "^4.0.0", 2589 | "string-width": "^4.1.0", 2590 | "strip-ansi": "^6.0.0" 2591 | }, 2592 | "engines": { 2593 | "node": ">=10" 2594 | }, 2595 | "funding": { 2596 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2597 | } 2598 | }, 2599 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 2600 | "version": "5.0.1", 2601 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2602 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2603 | "dev": true, 2604 | "engines": { 2605 | "node": ">=8" 2606 | } 2607 | }, 2608 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2609 | "version": "4.3.0", 2610 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2611 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2612 | "dev": true, 2613 | "dependencies": { 2614 | "color-convert": "^2.0.1" 2615 | }, 2616 | "engines": { 2617 | "node": ">=8" 2618 | }, 2619 | "funding": { 2620 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2621 | } 2622 | }, 2623 | "node_modules/wrap-ansi/node_modules/color-convert": { 2624 | "version": "2.0.1", 2625 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2626 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2627 | "dev": true, 2628 | "dependencies": { 2629 | "color-name": "~1.1.4" 2630 | }, 2631 | "engines": { 2632 | "node": ">=7.0.0" 2633 | } 2634 | }, 2635 | "node_modules/wrap-ansi/node_modules/color-name": { 2636 | "version": "1.1.4", 2637 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2638 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2639 | "dev": true 2640 | }, 2641 | "node_modules/wrap-ansi/node_modules/emoji-regex": { 2642 | "version": "8.0.0", 2643 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2644 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2645 | "dev": true 2646 | }, 2647 | "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { 2648 | "version": "3.0.0", 2649 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2650 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2651 | "dev": true, 2652 | "engines": { 2653 | "node": ">=8" 2654 | } 2655 | }, 2656 | "node_modules/wrap-ansi/node_modules/string-width": { 2657 | "version": "4.2.3", 2658 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2659 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2660 | "dev": true, 2661 | "dependencies": { 2662 | "emoji-regex": "^8.0.0", 2663 | "is-fullwidth-code-point": "^3.0.0", 2664 | "strip-ansi": "^6.0.1" 2665 | }, 2666 | "engines": { 2667 | "node": ">=8" 2668 | } 2669 | }, 2670 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 2671 | "version": "6.0.1", 2672 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2673 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2674 | "dev": true, 2675 | "dependencies": { 2676 | "ansi-regex": "^5.0.1" 2677 | }, 2678 | "engines": { 2679 | "node": ">=8" 2680 | } 2681 | }, 2682 | "node_modules/wrappy": { 2683 | "version": "1.0.2", 2684 | "license": "ISC" 2685 | }, 2686 | "node_modules/write": { 2687 | "version": "1.0.3", 2688 | "dev": true, 2689 | "license": "MIT", 2690 | "dependencies": { 2691 | "mkdirp": "^0.5.1" 2692 | }, 2693 | "engines": { 2694 | "node": ">=4" 2695 | } 2696 | }, 2697 | "node_modules/y18n": { 2698 | "version": "5.0.8", 2699 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2700 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2701 | "dev": true, 2702 | "engines": { 2703 | "node": ">=10" 2704 | } 2705 | }, 2706 | "node_modules/yargs": { 2707 | "version": "16.2.0", 2708 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2709 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2710 | "dev": true, 2711 | "dependencies": { 2712 | "cliui": "^7.0.2", 2713 | "escalade": "^3.1.1", 2714 | "get-caller-file": "^2.0.5", 2715 | "require-directory": "^2.1.1", 2716 | "string-width": "^4.2.0", 2717 | "y18n": "^5.0.5", 2718 | "yargs-parser": "^20.2.2" 2719 | }, 2720 | "engines": { 2721 | "node": ">=10" 2722 | } 2723 | }, 2724 | "node_modules/yargs-parser": { 2725 | "version": "20.2.4", 2726 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2727 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2728 | "dev": true, 2729 | "engines": { 2730 | "node": ">=10" 2731 | } 2732 | }, 2733 | "node_modules/yargs-unparser": { 2734 | "version": "2.0.0", 2735 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2736 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2737 | "dev": true, 2738 | "dependencies": { 2739 | "camelcase": "^6.0.0", 2740 | "decamelize": "^4.0.0", 2741 | "flat": "^5.0.2", 2742 | "is-plain-obj": "^2.1.0" 2743 | }, 2744 | "engines": { 2745 | "node": ">=10" 2746 | } 2747 | }, 2748 | "node_modules/yargs/node_modules/ansi-regex": { 2749 | "version": "5.0.1", 2750 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2751 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2752 | "dev": true, 2753 | "engines": { 2754 | "node": ">=8" 2755 | } 2756 | }, 2757 | "node_modules/yargs/node_modules/emoji-regex": { 2758 | "version": "8.0.0", 2759 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2760 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2761 | "dev": true 2762 | }, 2763 | "node_modules/yargs/node_modules/is-fullwidth-code-point": { 2764 | "version": "3.0.0", 2765 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2766 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2767 | "dev": true, 2768 | "engines": { 2769 | "node": ">=8" 2770 | } 2771 | }, 2772 | "node_modules/yargs/node_modules/string-width": { 2773 | "version": "4.2.3", 2774 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2775 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2776 | "dev": true, 2777 | "dependencies": { 2778 | "emoji-regex": "^8.0.0", 2779 | "is-fullwidth-code-point": "^3.0.0", 2780 | "strip-ansi": "^6.0.1" 2781 | }, 2782 | "engines": { 2783 | "node": ">=8" 2784 | } 2785 | }, 2786 | "node_modules/yargs/node_modules/strip-ansi": { 2787 | "version": "6.0.1", 2788 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2789 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2790 | "dev": true, 2791 | "dependencies": { 2792 | "ansi-regex": "^5.0.1" 2793 | }, 2794 | "engines": { 2795 | "node": ">=8" 2796 | } 2797 | }, 2798 | "node_modules/yocto-queue": { 2799 | "version": "0.1.0", 2800 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2801 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2802 | "dev": true, 2803 | "engines": { 2804 | "node": ">=10" 2805 | }, 2806 | "funding": { 2807 | "url": "https://github.com/sponsors/sindresorhus" 2808 | } 2809 | } 2810 | }, 2811 | "dependencies": { 2812 | "@babel/code-frame": { 2813 | "version": "7.0.0", 2814 | "dev": true, 2815 | "requires": { 2816 | "@babel/highlight": "^7.0.0" 2817 | } 2818 | }, 2819 | "@babel/highlight": { 2820 | "version": "7.0.0", 2821 | "dev": true, 2822 | "requires": { 2823 | "chalk": "^2.0.0", 2824 | "esutils": "^2.0.2", 2825 | "js-tokens": "^4.0.0" 2826 | } 2827 | }, 2828 | "@types/events": { 2829 | "version": "1.2.0" 2830 | }, 2831 | "@types/glob": { 2832 | "version": "5.0.35", 2833 | "requires": { 2834 | "@types/events": "*", 2835 | "@types/minimatch": "*", 2836 | "@types/node": "*" 2837 | } 2838 | }, 2839 | "@types/minimatch": { 2840 | "version": "3.0.3" 2841 | }, 2842 | "@types/node": { 2843 | "version": "10.9.4" 2844 | }, 2845 | "abbrev": { 2846 | "version": "1.0.9", 2847 | "dev": true 2848 | }, 2849 | "acorn": { 2850 | "version": "6.4.2", 2851 | "dev": true 2852 | }, 2853 | "acorn-jsx": { 2854 | "version": "5.3.2", 2855 | "dev": true, 2856 | "requires": {} 2857 | }, 2858 | "ajv": { 2859 | "version": "6.12.6", 2860 | "dev": true, 2861 | "requires": { 2862 | "fast-deep-equal": "^3.1.1", 2863 | "fast-json-stable-stringify": "^2.0.0", 2864 | "json-schema-traverse": "^0.4.1", 2865 | "uri-js": "^4.2.2" 2866 | } 2867 | }, 2868 | "amdefine": { 2869 | "version": "1.0.1", 2870 | "dev": true, 2871 | "optional": true 2872 | }, 2873 | "ansi-colors": { 2874 | "version": "4.1.1", 2875 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 2876 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 2877 | "dev": true 2878 | }, 2879 | "ansi-escapes": { 2880 | "version": "3.2.0", 2881 | "dev": true 2882 | }, 2883 | "ansi-regex": { 2884 | "version": "3.0.1", 2885 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", 2886 | "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", 2887 | "dev": true 2888 | }, 2889 | "ansi-styles": { 2890 | "version": "3.2.1", 2891 | "dev": true, 2892 | "requires": { 2893 | "color-convert": "^1.9.0" 2894 | } 2895 | }, 2896 | "anymatch": { 2897 | "version": "3.1.3", 2898 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 2899 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 2900 | "dev": true, 2901 | "requires": { 2902 | "normalize-path": "^3.0.0", 2903 | "picomatch": "^2.0.4" 2904 | } 2905 | }, 2906 | "argparse": { 2907 | "version": "1.0.10", 2908 | "dev": true, 2909 | "requires": { 2910 | "sprintf-js": "~1.0.2" 2911 | } 2912 | }, 2913 | "asn1": { 2914 | "version": "0.2.4", 2915 | "dev": true, 2916 | "requires": { 2917 | "safer-buffer": "~2.1.0" 2918 | } 2919 | }, 2920 | "assert-plus": { 2921 | "version": "1.0.0", 2922 | "dev": true 2923 | }, 2924 | "astral-regex": { 2925 | "version": "1.0.0", 2926 | "dev": true 2927 | }, 2928 | "async": { 2929 | "version": "1.5.2", 2930 | "dev": true 2931 | }, 2932 | "asynckit": { 2933 | "version": "0.4.0", 2934 | "dev": true 2935 | }, 2936 | "aws-sign2": { 2937 | "version": "0.7.0", 2938 | "dev": true 2939 | }, 2940 | "aws4": { 2941 | "version": "1.8.0", 2942 | "dev": true 2943 | }, 2944 | "balanced-match": { 2945 | "version": "1.0.0" 2946 | }, 2947 | "bcrypt-pbkdf": { 2948 | "version": "1.0.2", 2949 | "dev": true, 2950 | "optional": true, 2951 | "requires": { 2952 | "tweetnacl": "^0.14.3" 2953 | } 2954 | }, 2955 | "binary-extensions": { 2956 | "version": "2.2.0", 2957 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2958 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2959 | "dev": true 2960 | }, 2961 | "brace-expansion": { 2962 | "version": "1.1.8", 2963 | "requires": { 2964 | "balanced-match": "^1.0.0", 2965 | "concat-map": "0.0.1" 2966 | } 2967 | }, 2968 | "braces": { 2969 | "version": "3.0.2", 2970 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2971 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2972 | "dev": true, 2973 | "requires": { 2974 | "fill-range": "^7.0.1" 2975 | } 2976 | }, 2977 | "browser-stdout": { 2978 | "version": "1.3.1", 2979 | "dev": true 2980 | }, 2981 | "bunyan": { 2982 | "version": "1.8.12", 2983 | "requires": { 2984 | "dtrace-provider": "~0.8", 2985 | "moment": "^2.10.6", 2986 | "mv": "~2", 2987 | "safe-json-stringify": "~1" 2988 | } 2989 | }, 2990 | "callsites": { 2991 | "version": "3.1.0", 2992 | "dev": true 2993 | }, 2994 | "camelcase": { 2995 | "version": "6.3.0", 2996 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2997 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2998 | "dev": true 2999 | }, 3000 | "caseless": { 3001 | "version": "0.12.0", 3002 | "dev": true 3003 | }, 3004 | "chalk": { 3005 | "version": "2.4.2", 3006 | "dev": true, 3007 | "requires": { 3008 | "ansi-styles": "^3.2.1", 3009 | "escape-string-regexp": "^1.0.5", 3010 | "supports-color": "^5.3.0" 3011 | } 3012 | }, 3013 | "chardet": { 3014 | "version": "0.7.0", 3015 | "dev": true 3016 | }, 3017 | "chokidar": { 3018 | "version": "3.5.3", 3019 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 3020 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 3021 | "dev": true, 3022 | "requires": { 3023 | "anymatch": "~3.1.2", 3024 | "braces": "~3.0.2", 3025 | "fsevents": "~2.3.2", 3026 | "glob-parent": "~5.1.2", 3027 | "is-binary-path": "~2.1.0", 3028 | "is-glob": "~4.0.1", 3029 | "normalize-path": "~3.0.0", 3030 | "readdirp": "~3.6.0" 3031 | } 3032 | }, 3033 | "cli-cursor": { 3034 | "version": "2.1.0", 3035 | "dev": true, 3036 | "requires": { 3037 | "restore-cursor": "^2.0.0" 3038 | } 3039 | }, 3040 | "cli-width": { 3041 | "version": "2.2.1", 3042 | "dev": true 3043 | }, 3044 | "cliui": { 3045 | "version": "7.0.4", 3046 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 3047 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 3048 | "dev": true, 3049 | "requires": { 3050 | "string-width": "^4.2.0", 3051 | "strip-ansi": "^6.0.0", 3052 | "wrap-ansi": "^7.0.0" 3053 | }, 3054 | "dependencies": { 3055 | "ansi-regex": { 3056 | "version": "5.0.1", 3057 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3058 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3059 | "dev": true 3060 | }, 3061 | "emoji-regex": { 3062 | "version": "8.0.0", 3063 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3064 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3065 | "dev": true 3066 | }, 3067 | "is-fullwidth-code-point": { 3068 | "version": "3.0.0", 3069 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 3070 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 3071 | "dev": true 3072 | }, 3073 | "string-width": { 3074 | "version": "4.2.3", 3075 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3076 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3077 | "dev": true, 3078 | "requires": { 3079 | "emoji-regex": "^8.0.0", 3080 | "is-fullwidth-code-point": "^3.0.0", 3081 | "strip-ansi": "^6.0.1" 3082 | } 3083 | }, 3084 | "strip-ansi": { 3085 | "version": "6.0.1", 3086 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3087 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3088 | "dev": true, 3089 | "requires": { 3090 | "ansi-regex": "^5.0.1" 3091 | } 3092 | } 3093 | } 3094 | }, 3095 | "color-convert": { 3096 | "version": "1.9.3", 3097 | "dev": true, 3098 | "requires": { 3099 | "color-name": "1.1.3" 3100 | } 3101 | }, 3102 | "color-name": { 3103 | "version": "1.1.3", 3104 | "dev": true 3105 | }, 3106 | "combined-stream": { 3107 | "version": "1.0.6", 3108 | "dev": true, 3109 | "requires": { 3110 | "delayed-stream": "~1.0.0" 3111 | } 3112 | }, 3113 | "concat-map": { 3114 | "version": "0.0.1" 3115 | }, 3116 | "core-util-is": { 3117 | "version": "1.0.2", 3118 | "dev": true 3119 | }, 3120 | "coveralls": { 3121 | "version": "3.0.2", 3122 | "dev": true, 3123 | "requires": { 3124 | "growl": "~> 1.10.0", 3125 | "js-yaml": "^3.11.0", 3126 | "lcov-parse": "^0.0.10", 3127 | "log-driver": "^1.2.7", 3128 | "minimist": "^1.2.0", 3129 | "request": "^2.85.0" 3130 | } 3131 | }, 3132 | "cross-spawn": { 3133 | "version": "6.0.5", 3134 | "dev": true, 3135 | "requires": { 3136 | "nice-try": "^1.0.4", 3137 | "path-key": "^2.0.1", 3138 | "semver": "^5.5.0", 3139 | "shebang-command": "^1.2.0", 3140 | "which": "^1.2.9" 3141 | } 3142 | }, 3143 | "dashdash": { 3144 | "version": "1.14.1", 3145 | "dev": true, 3146 | "requires": { 3147 | "assert-plus": "^1.0.0" 3148 | } 3149 | }, 3150 | "debug": { 3151 | "version": "4.3.4", 3152 | "dev": true, 3153 | "requires": { 3154 | "ms": "2.1.2" 3155 | } 3156 | }, 3157 | "decamelize": { 3158 | "version": "4.0.0", 3159 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 3160 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 3161 | "dev": true 3162 | }, 3163 | "decomment": { 3164 | "version": "0.9.1", 3165 | "requires": { 3166 | "esprima": "~4.0.0" 3167 | } 3168 | }, 3169 | "deep-is": { 3170 | "version": "0.1.3", 3171 | "dev": true 3172 | }, 3173 | "delayed-stream": { 3174 | "version": "1.0.0", 3175 | "dev": true 3176 | }, 3177 | "diff": { 3178 | "version": "5.0.0", 3179 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 3180 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 3181 | "dev": true 3182 | }, 3183 | "doctrine": { 3184 | "version": "3.0.0", 3185 | "dev": true, 3186 | "requires": { 3187 | "esutils": "^2.0.2" 3188 | } 3189 | }, 3190 | "dtrace-provider": { 3191 | "version": "0.8.7", 3192 | "optional": true, 3193 | "requires": { 3194 | "nan": "^2.10.0" 3195 | } 3196 | }, 3197 | "ecc-jsbn": { 3198 | "version": "0.1.2", 3199 | "dev": true, 3200 | "optional": true, 3201 | "requires": { 3202 | "jsbn": "~0.1.0", 3203 | "safer-buffer": "^2.1.0" 3204 | } 3205 | }, 3206 | "emoji-regex": { 3207 | "version": "7.0.3", 3208 | "dev": true 3209 | }, 3210 | "escalade": { 3211 | "version": "3.1.1", 3212 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 3213 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 3214 | "dev": true 3215 | }, 3216 | "escape-string-regexp": { 3217 | "version": "1.0.5", 3218 | "dev": true 3219 | }, 3220 | "escodegen": { 3221 | "version": "1.8.1", 3222 | "dev": true, 3223 | "requires": { 3224 | "esprima": "^2.7.1", 3225 | "estraverse": "^1.9.1", 3226 | "esutils": "^2.0.2", 3227 | "optionator": "^0.8.1", 3228 | "source-map": "~0.2.0" 3229 | }, 3230 | "dependencies": { 3231 | "esprima": { 3232 | "version": "2.7.3", 3233 | "dev": true 3234 | }, 3235 | "estraverse": { 3236 | "version": "1.9.3", 3237 | "dev": true 3238 | } 3239 | } 3240 | }, 3241 | "eslint": { 3242 | "version": "5.16.0", 3243 | "dev": true, 3244 | "requires": { 3245 | "@babel/code-frame": "^7.0.0", 3246 | "ajv": "^6.9.1", 3247 | "chalk": "^2.1.0", 3248 | "cross-spawn": "^6.0.5", 3249 | "debug": "^4.0.1", 3250 | "doctrine": "^3.0.0", 3251 | "eslint-scope": "^4.0.3", 3252 | "eslint-utils": "^1.3.1", 3253 | "eslint-visitor-keys": "^1.0.0", 3254 | "espree": "^5.0.1", 3255 | "esquery": "^1.0.1", 3256 | "esutils": "^2.0.2", 3257 | "file-entry-cache": "^5.0.1", 3258 | "functional-red-black-tree": "^1.0.1", 3259 | "glob": "^7.1.2", 3260 | "globals": "^11.7.0", 3261 | "ignore": "^4.0.6", 3262 | "import-fresh": "^3.0.0", 3263 | "imurmurhash": "^0.1.4", 3264 | "inquirer": "^6.2.2", 3265 | "js-yaml": "^3.13.0", 3266 | "json-stable-stringify-without-jsonify": "^1.0.1", 3267 | "levn": "^0.3.0", 3268 | "lodash": "^4.17.11", 3269 | "minimatch": "^3.0.4", 3270 | "mkdirp": "^0.5.1", 3271 | "natural-compare": "^1.4.0", 3272 | "optionator": "^0.8.2", 3273 | "path-is-inside": "^1.0.2", 3274 | "progress": "^2.0.0", 3275 | "regexpp": "^2.0.1", 3276 | "semver": "^5.5.1", 3277 | "strip-ansi": "^4.0.0", 3278 | "strip-json-comments": "^2.0.1", 3279 | "table": "^5.2.3", 3280 | "text-table": "^0.2.0" 3281 | } 3282 | }, 3283 | "eslint-scope": { 3284 | "version": "4.0.3", 3285 | "dev": true, 3286 | "requires": { 3287 | "esrecurse": "^4.1.0", 3288 | "estraverse": "^4.1.1" 3289 | } 3290 | }, 3291 | "eslint-utils": { 3292 | "version": "1.4.3", 3293 | "dev": true, 3294 | "requires": { 3295 | "eslint-visitor-keys": "^1.1.0" 3296 | }, 3297 | "dependencies": { 3298 | "eslint-visitor-keys": { 3299 | "version": "1.1.0", 3300 | "dev": true 3301 | } 3302 | } 3303 | }, 3304 | "eslint-visitor-keys": { 3305 | "version": "1.0.0", 3306 | "dev": true 3307 | }, 3308 | "espree": { 3309 | "version": "5.0.1", 3310 | "dev": true, 3311 | "requires": { 3312 | "acorn": "^6.0.7", 3313 | "acorn-jsx": "^5.0.0", 3314 | "eslint-visitor-keys": "^1.0.0" 3315 | } 3316 | }, 3317 | "esprima": { 3318 | "version": "4.0.0" 3319 | }, 3320 | "esquery": { 3321 | "version": "1.0.1", 3322 | "dev": true, 3323 | "requires": { 3324 | "estraverse": "^4.0.0" 3325 | } 3326 | }, 3327 | "esrecurse": { 3328 | "version": "4.3.0", 3329 | "dev": true, 3330 | "requires": { 3331 | "estraverse": "^5.2.0" 3332 | }, 3333 | "dependencies": { 3334 | "estraverse": { 3335 | "version": "5.3.0", 3336 | "dev": true 3337 | } 3338 | } 3339 | }, 3340 | "estraverse": { 3341 | "version": "4.2.0", 3342 | "dev": true 3343 | }, 3344 | "esutils": { 3345 | "version": "2.0.2", 3346 | "dev": true 3347 | }, 3348 | "extend": { 3349 | "version": "3.0.2", 3350 | "dev": true 3351 | }, 3352 | "external-editor": { 3353 | "version": "3.1.0", 3354 | "dev": true, 3355 | "requires": { 3356 | "chardet": "^0.7.0", 3357 | "iconv-lite": "^0.4.24", 3358 | "tmp": "^0.0.33" 3359 | } 3360 | }, 3361 | "extsprintf": { 3362 | "version": "1.3.0", 3363 | "dev": true 3364 | }, 3365 | "fast-deep-equal": { 3366 | "version": "3.1.3", 3367 | "dev": true 3368 | }, 3369 | "fast-json-stable-stringify": { 3370 | "version": "2.0.0", 3371 | "dev": true 3372 | }, 3373 | "fast-levenshtein": { 3374 | "version": "2.0.6", 3375 | "dev": true 3376 | }, 3377 | "figures": { 3378 | "version": "2.0.0", 3379 | "dev": true, 3380 | "requires": { 3381 | "escape-string-regexp": "^1.0.5" 3382 | } 3383 | }, 3384 | "file-entry-cache": { 3385 | "version": "5.0.1", 3386 | "dev": true, 3387 | "requires": { 3388 | "flat-cache": "^2.0.1" 3389 | } 3390 | }, 3391 | "fill-range": { 3392 | "version": "7.0.1", 3393 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 3394 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 3395 | "dev": true, 3396 | "requires": { 3397 | "to-regex-range": "^5.0.1" 3398 | } 3399 | }, 3400 | "find-up": { 3401 | "version": "5.0.0", 3402 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 3403 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 3404 | "dev": true, 3405 | "requires": { 3406 | "locate-path": "^6.0.0", 3407 | "path-exists": "^4.0.0" 3408 | } 3409 | }, 3410 | "flat": { 3411 | "version": "5.0.2", 3412 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 3413 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 3414 | "dev": true 3415 | }, 3416 | "flat-cache": { 3417 | "version": "2.0.1", 3418 | "dev": true, 3419 | "requires": { 3420 | "flatted": "^2.0.0", 3421 | "rimraf": "2.6.3", 3422 | "write": "1.0.3" 3423 | } 3424 | }, 3425 | "flatted": { 3426 | "version": "2.0.2", 3427 | "dev": true 3428 | }, 3429 | "forever-agent": { 3430 | "version": "0.6.1", 3431 | "dev": true 3432 | }, 3433 | "form-data": { 3434 | "version": "2.3.2", 3435 | "dev": true, 3436 | "requires": { 3437 | "asynckit": "^0.4.0", 3438 | "combined-stream": "1.0.6", 3439 | "mime-types": "^2.1.12" 3440 | } 3441 | }, 3442 | "fs.realpath": { 3443 | "version": "1.0.0" 3444 | }, 3445 | "fsevents": { 3446 | "version": "2.3.2", 3447 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 3448 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 3449 | "dev": true, 3450 | "optional": true 3451 | }, 3452 | "functional-red-black-tree": { 3453 | "version": "1.0.1", 3454 | "dev": true 3455 | }, 3456 | "get-caller-file": { 3457 | "version": "2.0.5", 3458 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 3459 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 3460 | "dev": true 3461 | }, 3462 | "getpass": { 3463 | "version": "0.1.7", 3464 | "dev": true, 3465 | "requires": { 3466 | "assert-plus": "^1.0.0" 3467 | } 3468 | }, 3469 | "glob": { 3470 | "version": "7.2.0", 3471 | "requires": { 3472 | "fs.realpath": "^1.0.0", 3473 | "inflight": "^1.0.4", 3474 | "inherits": "2", 3475 | "minimatch": "^3.0.4", 3476 | "once": "^1.3.0", 3477 | "path-is-absolute": "^1.0.0" 3478 | } 3479 | }, 3480 | "glob-parent": { 3481 | "version": "5.1.2", 3482 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 3483 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 3484 | "dev": true, 3485 | "requires": { 3486 | "is-glob": "^4.0.1" 3487 | } 3488 | }, 3489 | "glob-promise": { 3490 | "version": "3.4.0", 3491 | "requires": { 3492 | "@types/glob": "*" 3493 | } 3494 | }, 3495 | "globals": { 3496 | "version": "11.7.0", 3497 | "dev": true 3498 | }, 3499 | "growl": { 3500 | "version": "1.10.5", 3501 | "dev": true 3502 | }, 3503 | "handlebars": { 3504 | "version": "4.7.7", 3505 | "dev": true, 3506 | "requires": { 3507 | "minimist": "^1.2.5", 3508 | "neo-async": "^2.6.0", 3509 | "source-map": "^0.6.1", 3510 | "uglify-js": "^3.1.4", 3511 | "wordwrap": "^1.0.0" 3512 | }, 3513 | "dependencies": { 3514 | "source-map": { 3515 | "version": "0.6.1", 3516 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3517 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3518 | "dev": true 3519 | } 3520 | } 3521 | }, 3522 | "har-schema": { 3523 | "version": "2.0.0", 3524 | "dev": true 3525 | }, 3526 | "har-validator": { 3527 | "version": "5.1.5", 3528 | "dev": true, 3529 | "requires": { 3530 | "ajv": "^6.12.3", 3531 | "har-schema": "^2.0.0" 3532 | } 3533 | }, 3534 | "has-flag": { 3535 | "version": "3.0.0", 3536 | "dev": true 3537 | }, 3538 | "he": { 3539 | "version": "1.2.0", 3540 | "dev": true 3541 | }, 3542 | "http-signature": { 3543 | "version": "1.2.0", 3544 | "dev": true, 3545 | "requires": { 3546 | "assert-plus": "^1.0.0", 3547 | "jsprim": "^1.2.2", 3548 | "sshpk": "^1.7.0" 3549 | } 3550 | }, 3551 | "iconv-lite": { 3552 | "version": "0.4.24", 3553 | "dev": true, 3554 | "requires": { 3555 | "safer-buffer": ">= 2.1.2 < 3" 3556 | } 3557 | }, 3558 | "ignore": { 3559 | "version": "4.0.6", 3560 | "dev": true 3561 | }, 3562 | "import-fresh": { 3563 | "version": "3.3.0", 3564 | "dev": true, 3565 | "requires": { 3566 | "parent-module": "^1.0.0", 3567 | "resolve-from": "^4.0.0" 3568 | } 3569 | }, 3570 | "imurmurhash": { 3571 | "version": "0.1.4", 3572 | "dev": true 3573 | }, 3574 | "inflight": { 3575 | "version": "1.0.6", 3576 | "requires": { 3577 | "once": "^1.3.0", 3578 | "wrappy": "1" 3579 | } 3580 | }, 3581 | "inherits": { 3582 | "version": "2.0.3" 3583 | }, 3584 | "inquirer": { 3585 | "version": "6.5.2", 3586 | "dev": true, 3587 | "requires": { 3588 | "ansi-escapes": "^3.2.0", 3589 | "chalk": "^2.4.2", 3590 | "cli-cursor": "^2.1.0", 3591 | "cli-width": "^2.0.0", 3592 | "external-editor": "^3.0.3", 3593 | "figures": "^2.0.0", 3594 | "lodash": "^4.17.12", 3595 | "mute-stream": "0.0.7", 3596 | "run-async": "^2.2.0", 3597 | "rxjs": "^6.4.0", 3598 | "string-width": "^2.1.0", 3599 | "strip-ansi": "^5.1.0", 3600 | "through": "^2.3.6" 3601 | }, 3602 | "dependencies": { 3603 | "ansi-regex": { 3604 | "version": "4.1.1", 3605 | "dev": true 3606 | }, 3607 | "strip-ansi": { 3608 | "version": "5.2.0", 3609 | "dev": true, 3610 | "requires": { 3611 | "ansi-regex": "^4.1.0" 3612 | } 3613 | } 3614 | } 3615 | }, 3616 | "is-binary-path": { 3617 | "version": "2.1.0", 3618 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 3619 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 3620 | "dev": true, 3621 | "requires": { 3622 | "binary-extensions": "^2.0.0" 3623 | } 3624 | }, 3625 | "is-extglob": { 3626 | "version": "2.1.1", 3627 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3628 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3629 | "dev": true 3630 | }, 3631 | "is-fullwidth-code-point": { 3632 | "version": "2.0.0", 3633 | "dev": true 3634 | }, 3635 | "is-glob": { 3636 | "version": "4.0.3", 3637 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3638 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3639 | "dev": true, 3640 | "requires": { 3641 | "is-extglob": "^2.1.1" 3642 | } 3643 | }, 3644 | "is-number": { 3645 | "version": "7.0.0", 3646 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 3647 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 3648 | "dev": true 3649 | }, 3650 | "is-plain-obj": { 3651 | "version": "2.1.0", 3652 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 3653 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 3654 | "dev": true 3655 | }, 3656 | "is-typedarray": { 3657 | "version": "1.0.0", 3658 | "dev": true 3659 | }, 3660 | "is-unicode-supported": { 3661 | "version": "0.1.0", 3662 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 3663 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 3664 | "dev": true 3665 | }, 3666 | "isexe": { 3667 | "version": "2.0.0", 3668 | "dev": true 3669 | }, 3670 | "isstream": { 3671 | "version": "0.1.2", 3672 | "dev": true 3673 | }, 3674 | "istanbul": { 3675 | "version": "0.4.5", 3676 | "dev": true, 3677 | "requires": { 3678 | "abbrev": "1.0.x", 3679 | "async": "1.x", 3680 | "escodegen": "1.8.x", 3681 | "esprima": "2.7.x", 3682 | "glob": "^5.0.15", 3683 | "handlebars": "^4.0.1", 3684 | "js-yaml": "3.x", 3685 | "mkdirp": "0.5.x", 3686 | "nopt": "3.x", 3687 | "once": "1.x", 3688 | "resolve": "1.1.x", 3689 | "supports-color": "^3.1.0", 3690 | "which": "^1.1.1", 3691 | "wordwrap": "^1.0.0" 3692 | }, 3693 | "dependencies": { 3694 | "esprima": { 3695 | "version": "2.7.3", 3696 | "dev": true 3697 | }, 3698 | "glob": { 3699 | "version": "5.0.15", 3700 | "dev": true, 3701 | "requires": { 3702 | "inflight": "^1.0.4", 3703 | "inherits": "2", 3704 | "minimatch": "2 || 3", 3705 | "once": "^1.3.0", 3706 | "path-is-absolute": "^1.0.0" 3707 | } 3708 | }, 3709 | "has-flag": { 3710 | "version": "1.0.0", 3711 | "dev": true 3712 | }, 3713 | "supports-color": { 3714 | "version": "3.2.3", 3715 | "dev": true, 3716 | "requires": { 3717 | "has-flag": "^1.0.0" 3718 | } 3719 | } 3720 | } 3721 | }, 3722 | "js-tokens": { 3723 | "version": "4.0.0", 3724 | "dev": true 3725 | }, 3726 | "js-yaml": { 3727 | "version": "3.13.1", 3728 | "dev": true, 3729 | "requires": { 3730 | "argparse": "^1.0.7", 3731 | "esprima": "^4.0.0" 3732 | } 3733 | }, 3734 | "jsbn": { 3735 | "version": "0.1.1", 3736 | "dev": true, 3737 | "optional": true 3738 | }, 3739 | "json-schema": { 3740 | "version": "0.4.0", 3741 | "dev": true 3742 | }, 3743 | "json-schema-traverse": { 3744 | "version": "0.4.1", 3745 | "dev": true 3746 | }, 3747 | "json-stable-stringify-without-jsonify": { 3748 | "version": "1.0.1", 3749 | "dev": true 3750 | }, 3751 | "json-stringify-safe": { 3752 | "version": "5.0.1", 3753 | "dev": true 3754 | }, 3755 | "jsprim": { 3756 | "version": "1.4.2", 3757 | "dev": true, 3758 | "requires": { 3759 | "assert-plus": "1.0.0", 3760 | "extsprintf": "1.3.0", 3761 | "json-schema": "0.4.0", 3762 | "verror": "1.10.0" 3763 | } 3764 | }, 3765 | "lcov-parse": { 3766 | "version": "0.0.10", 3767 | "dev": true 3768 | }, 3769 | "levn": { 3770 | "version": "0.3.0", 3771 | "dev": true, 3772 | "requires": { 3773 | "prelude-ls": "~1.1.2", 3774 | "type-check": "~0.3.2" 3775 | } 3776 | }, 3777 | "locate-path": { 3778 | "version": "6.0.0", 3779 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 3780 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 3781 | "dev": true, 3782 | "requires": { 3783 | "p-locate": "^5.0.0" 3784 | } 3785 | }, 3786 | "lodash": { 3787 | "version": "4.17.21", 3788 | "dev": true 3789 | }, 3790 | "log-driver": { 3791 | "version": "1.2.7", 3792 | "dev": true 3793 | }, 3794 | "log-symbols": { 3795 | "version": "4.1.0", 3796 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 3797 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 3798 | "dev": true, 3799 | "requires": { 3800 | "chalk": "^4.1.0", 3801 | "is-unicode-supported": "^0.1.0" 3802 | }, 3803 | "dependencies": { 3804 | "ansi-styles": { 3805 | "version": "4.3.0", 3806 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3807 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3808 | "dev": true, 3809 | "requires": { 3810 | "color-convert": "^2.0.1" 3811 | } 3812 | }, 3813 | "chalk": { 3814 | "version": "4.1.2", 3815 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 3816 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 3817 | "dev": true, 3818 | "requires": { 3819 | "ansi-styles": "^4.1.0", 3820 | "supports-color": "^7.1.0" 3821 | } 3822 | }, 3823 | "color-convert": { 3824 | "version": "2.0.1", 3825 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3826 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3827 | "dev": true, 3828 | "requires": { 3829 | "color-name": "~1.1.4" 3830 | } 3831 | }, 3832 | "color-name": { 3833 | "version": "1.1.4", 3834 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3835 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3836 | "dev": true 3837 | }, 3838 | "has-flag": { 3839 | "version": "4.0.0", 3840 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3841 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3842 | "dev": true 3843 | }, 3844 | "supports-color": { 3845 | "version": "7.2.0", 3846 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3847 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3848 | "dev": true, 3849 | "requires": { 3850 | "has-flag": "^4.0.0" 3851 | } 3852 | } 3853 | } 3854 | }, 3855 | "mime-db": { 3856 | "version": "1.36.0", 3857 | "dev": true 3858 | }, 3859 | "mime-types": { 3860 | "version": "2.1.20", 3861 | "dev": true, 3862 | "requires": { 3863 | "mime-db": "~1.36.0" 3864 | } 3865 | }, 3866 | "mimic-fn": { 3867 | "version": "1.2.0", 3868 | "dev": true 3869 | }, 3870 | "minimatch": { 3871 | "version": "3.1.2", 3872 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3873 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3874 | "requires": { 3875 | "brace-expansion": "^1.1.7" 3876 | } 3877 | }, 3878 | "minimist": { 3879 | "version": "1.2.6", 3880 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 3881 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 3882 | "devOptional": true 3883 | }, 3884 | "mkdirp": { 3885 | "version": "0.5.5", 3886 | "devOptional": true, 3887 | "requires": { 3888 | "minimist": "^1.2.5" 3889 | } 3890 | }, 3891 | "mocha": { 3892 | "version": "10.2.0", 3893 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 3894 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 3895 | "dev": true, 3896 | "requires": { 3897 | "ansi-colors": "4.1.1", 3898 | "browser-stdout": "1.3.1", 3899 | "chokidar": "3.5.3", 3900 | "debug": "4.3.4", 3901 | "diff": "5.0.0", 3902 | "escape-string-regexp": "4.0.0", 3903 | "find-up": "5.0.0", 3904 | "glob": "7.2.0", 3905 | "he": "1.2.0", 3906 | "js-yaml": "4.1.0", 3907 | "log-symbols": "4.1.0", 3908 | "minimatch": "5.0.1", 3909 | "ms": "2.1.3", 3910 | "nanoid": "3.3.3", 3911 | "serialize-javascript": "6.0.0", 3912 | "strip-json-comments": "3.1.1", 3913 | "supports-color": "8.1.1", 3914 | "workerpool": "6.2.1", 3915 | "yargs": "16.2.0", 3916 | "yargs-parser": "20.2.4", 3917 | "yargs-unparser": "2.0.0" 3918 | }, 3919 | "dependencies": { 3920 | "argparse": { 3921 | "version": "2.0.1", 3922 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 3923 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 3924 | "dev": true 3925 | }, 3926 | "brace-expansion": { 3927 | "version": "2.0.1", 3928 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 3929 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 3930 | "dev": true, 3931 | "requires": { 3932 | "balanced-match": "^1.0.0" 3933 | } 3934 | }, 3935 | "escape-string-regexp": { 3936 | "version": "4.0.0", 3937 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 3938 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 3939 | "dev": true 3940 | }, 3941 | "has-flag": { 3942 | "version": "4.0.0", 3943 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3944 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3945 | "dev": true 3946 | }, 3947 | "js-yaml": { 3948 | "version": "4.1.0", 3949 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 3950 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 3951 | "dev": true, 3952 | "requires": { 3953 | "argparse": "^2.0.1" 3954 | } 3955 | }, 3956 | "minimatch": { 3957 | "version": "5.0.1", 3958 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 3959 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 3960 | "dev": true, 3961 | "requires": { 3962 | "brace-expansion": "^2.0.1" 3963 | } 3964 | }, 3965 | "ms": { 3966 | "version": "2.1.3", 3967 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3968 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 3969 | "dev": true 3970 | }, 3971 | "strip-json-comments": { 3972 | "version": "3.1.1", 3973 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3974 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3975 | "dev": true 3976 | }, 3977 | "supports-color": { 3978 | "version": "8.1.1", 3979 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 3980 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 3981 | "dev": true, 3982 | "requires": { 3983 | "has-flag": "^4.0.0" 3984 | } 3985 | } 3986 | } 3987 | }, 3988 | "mocha-lcov-reporter": { 3989 | "version": "1.3.0", 3990 | "dev": true 3991 | }, 3992 | "moment": { 3993 | "version": "2.29.4", 3994 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 3995 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 3996 | "optional": true 3997 | }, 3998 | "ms": { 3999 | "version": "2.1.2", 4000 | "dev": true 4001 | }, 4002 | "mute-stream": { 4003 | "version": "0.0.7", 4004 | "dev": true 4005 | }, 4006 | "mv": { 4007 | "version": "2.1.1", 4008 | "optional": true, 4009 | "requires": { 4010 | "mkdirp": "~0.5.1", 4011 | "ncp": "~2.0.0", 4012 | "rimraf": "~2.4.0" 4013 | }, 4014 | "dependencies": { 4015 | "glob": { 4016 | "version": "6.0.4", 4017 | "optional": true, 4018 | "requires": { 4019 | "inflight": "^1.0.4", 4020 | "inherits": "2", 4021 | "minimatch": "2 || 3", 4022 | "once": "^1.3.0", 4023 | "path-is-absolute": "^1.0.0" 4024 | } 4025 | }, 4026 | "rimraf": { 4027 | "version": "2.4.5", 4028 | "optional": true, 4029 | "requires": { 4030 | "glob": "^6.0.1" 4031 | } 4032 | } 4033 | } 4034 | }, 4035 | "nan": { 4036 | "version": "2.11.0", 4037 | "optional": true 4038 | }, 4039 | "nanoid": { 4040 | "version": "3.3.3", 4041 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 4042 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 4043 | "dev": true 4044 | }, 4045 | "natural-compare": { 4046 | "version": "1.4.0", 4047 | "dev": true 4048 | }, 4049 | "ncp": { 4050 | "version": "2.0.0", 4051 | "optional": true 4052 | }, 4053 | "neo-async": { 4054 | "version": "2.6.1", 4055 | "dev": true 4056 | }, 4057 | "nice-try": { 4058 | "version": "1.0.5", 4059 | "dev": true 4060 | }, 4061 | "nopt": { 4062 | "version": "3.0.6", 4063 | "dev": true, 4064 | "requires": { 4065 | "abbrev": "1" 4066 | } 4067 | }, 4068 | "normalize-path": { 4069 | "version": "3.0.0", 4070 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 4071 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 4072 | "dev": true 4073 | }, 4074 | "oauth-sign": { 4075 | "version": "0.9.0", 4076 | "dev": true 4077 | }, 4078 | "once": { 4079 | "version": "1.4.0", 4080 | "requires": { 4081 | "wrappy": "1" 4082 | } 4083 | }, 4084 | "onetime": { 4085 | "version": "2.0.1", 4086 | "dev": true, 4087 | "requires": { 4088 | "mimic-fn": "^1.0.0" 4089 | } 4090 | }, 4091 | "optionator": { 4092 | "version": "0.8.2", 4093 | "dev": true, 4094 | "requires": { 4095 | "deep-is": "~0.1.3", 4096 | "fast-levenshtein": "~2.0.4", 4097 | "levn": "~0.3.0", 4098 | "prelude-ls": "~1.1.2", 4099 | "type-check": "~0.3.2", 4100 | "wordwrap": "~1.0.0" 4101 | } 4102 | }, 4103 | "os-tmpdir": { 4104 | "version": "1.0.2", 4105 | "dev": true 4106 | }, 4107 | "p-limit": { 4108 | "version": "3.1.0", 4109 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 4110 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 4111 | "dev": true, 4112 | "requires": { 4113 | "yocto-queue": "^0.1.0" 4114 | } 4115 | }, 4116 | "p-locate": { 4117 | "version": "5.0.0", 4118 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 4119 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 4120 | "dev": true, 4121 | "requires": { 4122 | "p-limit": "^3.0.2" 4123 | } 4124 | }, 4125 | "parent-module": { 4126 | "version": "1.0.1", 4127 | "dev": true, 4128 | "requires": { 4129 | "callsites": "^3.0.0" 4130 | } 4131 | }, 4132 | "path": { 4133 | "version": "0.12.7", 4134 | "requires": { 4135 | "process": "^0.11.1", 4136 | "util": "^0.10.3" 4137 | } 4138 | }, 4139 | "path-exists": { 4140 | "version": "4.0.0", 4141 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 4142 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 4143 | "dev": true 4144 | }, 4145 | "path-is-absolute": { 4146 | "version": "1.0.1" 4147 | }, 4148 | "path-is-inside": { 4149 | "version": "1.0.2", 4150 | "dev": true 4151 | }, 4152 | "path-key": { 4153 | "version": "2.0.1", 4154 | "dev": true 4155 | }, 4156 | "performance-now": { 4157 | "version": "2.1.0", 4158 | "dev": true 4159 | }, 4160 | "picomatch": { 4161 | "version": "2.3.1", 4162 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 4163 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 4164 | "dev": true 4165 | }, 4166 | "prelude-ls": { 4167 | "version": "1.1.2", 4168 | "dev": true 4169 | }, 4170 | "process": { 4171 | "version": "0.11.10" 4172 | }, 4173 | "progress": { 4174 | "version": "2.0.0", 4175 | "dev": true 4176 | }, 4177 | "psl": { 4178 | "version": "1.1.29", 4179 | "dev": true 4180 | }, 4181 | "punycode": { 4182 | "version": "2.1.1", 4183 | "dev": true 4184 | }, 4185 | "qs": { 4186 | "version": "6.5.3", 4187 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 4188 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 4189 | "dev": true 4190 | }, 4191 | "randombytes": { 4192 | "version": "2.1.0", 4193 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 4194 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 4195 | "dev": true, 4196 | "requires": { 4197 | "safe-buffer": "^5.1.0" 4198 | } 4199 | }, 4200 | "readdirp": { 4201 | "version": "3.6.0", 4202 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 4203 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 4204 | "dev": true, 4205 | "requires": { 4206 | "picomatch": "^2.2.1" 4207 | } 4208 | }, 4209 | "regexpp": { 4210 | "version": "2.0.1", 4211 | "dev": true 4212 | }, 4213 | "request": { 4214 | "version": "2.88.0", 4215 | "dev": true, 4216 | "requires": { 4217 | "aws-sign2": "~0.7.0", 4218 | "aws4": "^1.8.0", 4219 | "caseless": "~0.12.0", 4220 | "combined-stream": "~1.0.6", 4221 | "extend": "~3.0.2", 4222 | "forever-agent": "~0.6.1", 4223 | "form-data": "~2.3.2", 4224 | "har-validator": "~5.1.0", 4225 | "http-signature": "~1.2.0", 4226 | "is-typedarray": "~1.0.0", 4227 | "isstream": "~0.1.2", 4228 | "json-stringify-safe": "~5.0.1", 4229 | "mime-types": "~2.1.19", 4230 | "oauth-sign": "~0.9.0", 4231 | "performance-now": "^2.1.0", 4232 | "qs": "~6.5.2", 4233 | "safe-buffer": "^5.1.2", 4234 | "tough-cookie": "~2.4.3", 4235 | "tunnel-agent": "^0.6.0", 4236 | "uuid": "^3.3.2" 4237 | } 4238 | }, 4239 | "require-directory": { 4240 | "version": "2.1.1", 4241 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 4242 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 4243 | "dev": true 4244 | }, 4245 | "resolve": { 4246 | "version": "1.1.7", 4247 | "dev": true 4248 | }, 4249 | "resolve-from": { 4250 | "version": "4.0.0", 4251 | "dev": true 4252 | }, 4253 | "restore-cursor": { 4254 | "version": "2.0.0", 4255 | "dev": true, 4256 | "requires": { 4257 | "onetime": "^2.0.0", 4258 | "signal-exit": "^3.0.2" 4259 | } 4260 | }, 4261 | "rimraf": { 4262 | "version": "2.6.3", 4263 | "dev": true, 4264 | "requires": { 4265 | "glob": "^7.1.3" 4266 | } 4267 | }, 4268 | "run-async": { 4269 | "version": "2.4.1", 4270 | "dev": true 4271 | }, 4272 | "rxjs": { 4273 | "version": "6.6.7", 4274 | "dev": true, 4275 | "requires": { 4276 | "tslib": "^1.9.0" 4277 | } 4278 | }, 4279 | "safe-buffer": { 4280 | "version": "5.1.2", 4281 | "dev": true 4282 | }, 4283 | "safe-json-stringify": { 4284 | "version": "1.2.0", 4285 | "optional": true 4286 | }, 4287 | "safer-buffer": { 4288 | "version": "2.1.2", 4289 | "dev": true 4290 | }, 4291 | "semver": { 4292 | "version": "5.5.1", 4293 | "dev": true 4294 | }, 4295 | "serialize-javascript": { 4296 | "version": "6.0.0", 4297 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 4298 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 4299 | "dev": true, 4300 | "requires": { 4301 | "randombytes": "^2.1.0" 4302 | } 4303 | }, 4304 | "shebang-command": { 4305 | "version": "1.2.0", 4306 | "dev": true, 4307 | "requires": { 4308 | "shebang-regex": "^1.0.0" 4309 | } 4310 | }, 4311 | "shebang-regex": { 4312 | "version": "1.0.0", 4313 | "dev": true 4314 | }, 4315 | "signal-exit": { 4316 | "version": "3.0.7", 4317 | "dev": true 4318 | }, 4319 | "slice-ansi": { 4320 | "version": "2.1.0", 4321 | "dev": true, 4322 | "requires": { 4323 | "ansi-styles": "^3.2.0", 4324 | "astral-regex": "^1.0.0", 4325 | "is-fullwidth-code-point": "^2.0.0" 4326 | } 4327 | }, 4328 | "source-map": { 4329 | "version": "0.2.0", 4330 | "dev": true, 4331 | "optional": true, 4332 | "requires": { 4333 | "amdefine": ">=0.0.4" 4334 | } 4335 | }, 4336 | "sprintf-js": { 4337 | "version": "1.0.3", 4338 | "dev": true 4339 | }, 4340 | "sshpk": { 4341 | "version": "1.14.2", 4342 | "dev": true, 4343 | "requires": { 4344 | "asn1": "~0.2.3", 4345 | "assert-plus": "^1.0.0", 4346 | "bcrypt-pbkdf": "^1.0.0", 4347 | "dashdash": "^1.12.0", 4348 | "ecc-jsbn": "~0.1.1", 4349 | "getpass": "^0.1.1", 4350 | "jsbn": "~0.1.0", 4351 | "safer-buffer": "^2.0.2", 4352 | "tweetnacl": "~0.14.0" 4353 | } 4354 | }, 4355 | "string-width": { 4356 | "version": "2.1.1", 4357 | "dev": true, 4358 | "requires": { 4359 | "is-fullwidth-code-point": "^2.0.0", 4360 | "strip-ansi": "^4.0.0" 4361 | } 4362 | }, 4363 | "strip-ansi": { 4364 | "version": "4.0.0", 4365 | "dev": true, 4366 | "requires": { 4367 | "ansi-regex": "^3.0.0" 4368 | } 4369 | }, 4370 | "strip-json-comments": { 4371 | "version": "2.0.1", 4372 | "dev": true 4373 | }, 4374 | "supports-color": { 4375 | "version": "5.5.0", 4376 | "dev": true, 4377 | "requires": { 4378 | "has-flag": "^3.0.0" 4379 | } 4380 | }, 4381 | "table": { 4382 | "version": "5.4.6", 4383 | "dev": true, 4384 | "requires": { 4385 | "ajv": "^6.10.2", 4386 | "lodash": "^4.17.14", 4387 | "slice-ansi": "^2.1.0", 4388 | "string-width": "^3.0.0" 4389 | }, 4390 | "dependencies": { 4391 | "ansi-regex": { 4392 | "version": "4.1.1", 4393 | "dev": true 4394 | }, 4395 | "string-width": { 4396 | "version": "3.1.0", 4397 | "dev": true, 4398 | "requires": { 4399 | "emoji-regex": "^7.0.1", 4400 | "is-fullwidth-code-point": "^2.0.0", 4401 | "strip-ansi": "^5.1.0" 4402 | } 4403 | }, 4404 | "strip-ansi": { 4405 | "version": "5.2.0", 4406 | "dev": true, 4407 | "requires": { 4408 | "ansi-regex": "^4.1.0" 4409 | } 4410 | } 4411 | } 4412 | }, 4413 | "text-table": { 4414 | "version": "0.2.0", 4415 | "dev": true 4416 | }, 4417 | "through": { 4418 | "version": "2.3.8", 4419 | "dev": true 4420 | }, 4421 | "tmp": { 4422 | "version": "0.0.33", 4423 | "dev": true, 4424 | "requires": { 4425 | "os-tmpdir": "~1.0.2" 4426 | } 4427 | }, 4428 | "to-regex-range": { 4429 | "version": "5.0.1", 4430 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 4431 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 4432 | "dev": true, 4433 | "requires": { 4434 | "is-number": "^7.0.0" 4435 | } 4436 | }, 4437 | "tough-cookie": { 4438 | "version": "2.4.3", 4439 | "dev": true, 4440 | "requires": { 4441 | "psl": "^1.1.24", 4442 | "punycode": "^1.4.1" 4443 | }, 4444 | "dependencies": { 4445 | "punycode": { 4446 | "version": "1.4.1", 4447 | "dev": true 4448 | } 4449 | } 4450 | }, 4451 | "tslib": { 4452 | "version": "1.14.1", 4453 | "dev": true 4454 | }, 4455 | "tunnel-agent": { 4456 | "version": "0.6.0", 4457 | "dev": true, 4458 | "requires": { 4459 | "safe-buffer": "^5.0.1" 4460 | } 4461 | }, 4462 | "tweetnacl": { 4463 | "version": "0.14.5", 4464 | "dev": true, 4465 | "optional": true 4466 | }, 4467 | "type-check": { 4468 | "version": "0.3.2", 4469 | "dev": true, 4470 | "requires": { 4471 | "prelude-ls": "~1.1.2" 4472 | } 4473 | }, 4474 | "uglify-js": { 4475 | "version": "3.4.9", 4476 | "dev": true, 4477 | "optional": true, 4478 | "requires": { 4479 | "commander": "~2.17.1", 4480 | "source-map": "~0.6.1" 4481 | }, 4482 | "dependencies": { 4483 | "commander": { 4484 | "version": "2.17.1", 4485 | "dev": true, 4486 | "optional": true 4487 | }, 4488 | "source-map": { 4489 | "version": "0.6.1", 4490 | "dev": true, 4491 | "optional": true 4492 | } 4493 | } 4494 | }, 4495 | "uri-js": { 4496 | "version": "4.4.1", 4497 | "dev": true, 4498 | "requires": { 4499 | "punycode": "^2.1.0" 4500 | } 4501 | }, 4502 | "util": { 4503 | "version": "0.10.3", 4504 | "requires": { 4505 | "inherits": "2.0.1" 4506 | }, 4507 | "dependencies": { 4508 | "inherits": { 4509 | "version": "2.0.1" 4510 | } 4511 | } 4512 | }, 4513 | "uuid": { 4514 | "version": "3.3.2", 4515 | "dev": true 4516 | }, 4517 | "verror": { 4518 | "version": "1.10.0", 4519 | "dev": true, 4520 | "requires": { 4521 | "assert-plus": "^1.0.0", 4522 | "core-util-is": "1.0.2", 4523 | "extsprintf": "^1.2.0" 4524 | } 4525 | }, 4526 | "which": { 4527 | "version": "1.3.1", 4528 | "dev": true, 4529 | "requires": { 4530 | "isexe": "^2.0.0" 4531 | } 4532 | }, 4533 | "wordwrap": { 4534 | "version": "1.0.0", 4535 | "dev": true 4536 | }, 4537 | "workerpool": { 4538 | "version": "6.2.1", 4539 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 4540 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 4541 | "dev": true 4542 | }, 4543 | "wrap-ansi": { 4544 | "version": "7.0.0", 4545 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 4546 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 4547 | "dev": true, 4548 | "requires": { 4549 | "ansi-styles": "^4.0.0", 4550 | "string-width": "^4.1.0", 4551 | "strip-ansi": "^6.0.0" 4552 | }, 4553 | "dependencies": { 4554 | "ansi-regex": { 4555 | "version": "5.0.1", 4556 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4557 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4558 | "dev": true 4559 | }, 4560 | "ansi-styles": { 4561 | "version": "4.3.0", 4562 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 4563 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 4564 | "dev": true, 4565 | "requires": { 4566 | "color-convert": "^2.0.1" 4567 | } 4568 | }, 4569 | "color-convert": { 4570 | "version": "2.0.1", 4571 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 4572 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 4573 | "dev": true, 4574 | "requires": { 4575 | "color-name": "~1.1.4" 4576 | } 4577 | }, 4578 | "color-name": { 4579 | "version": "1.1.4", 4580 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 4581 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 4582 | "dev": true 4583 | }, 4584 | "emoji-regex": { 4585 | "version": "8.0.0", 4586 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4587 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4588 | "dev": true 4589 | }, 4590 | "is-fullwidth-code-point": { 4591 | "version": "3.0.0", 4592 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 4593 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 4594 | "dev": true 4595 | }, 4596 | "string-width": { 4597 | "version": "4.2.3", 4598 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 4599 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 4600 | "dev": true, 4601 | "requires": { 4602 | "emoji-regex": "^8.0.0", 4603 | "is-fullwidth-code-point": "^3.0.0", 4604 | "strip-ansi": "^6.0.1" 4605 | } 4606 | }, 4607 | "strip-ansi": { 4608 | "version": "6.0.1", 4609 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 4610 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 4611 | "dev": true, 4612 | "requires": { 4613 | "ansi-regex": "^5.0.1" 4614 | } 4615 | } 4616 | } 4617 | }, 4618 | "wrappy": { 4619 | "version": "1.0.2" 4620 | }, 4621 | "write": { 4622 | "version": "1.0.3", 4623 | "dev": true, 4624 | "requires": { 4625 | "mkdirp": "^0.5.1" 4626 | } 4627 | }, 4628 | "y18n": { 4629 | "version": "5.0.8", 4630 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 4631 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 4632 | "dev": true 4633 | }, 4634 | "yargs": { 4635 | "version": "16.2.0", 4636 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 4637 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 4638 | "dev": true, 4639 | "requires": { 4640 | "cliui": "^7.0.2", 4641 | "escalade": "^3.1.1", 4642 | "get-caller-file": "^2.0.5", 4643 | "require-directory": "^2.1.1", 4644 | "string-width": "^4.2.0", 4645 | "y18n": "^5.0.5", 4646 | "yargs-parser": "^20.2.2" 4647 | }, 4648 | "dependencies": { 4649 | "ansi-regex": { 4650 | "version": "5.0.1", 4651 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4652 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4653 | "dev": true 4654 | }, 4655 | "emoji-regex": { 4656 | "version": "8.0.0", 4657 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4658 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4659 | "dev": true 4660 | }, 4661 | "is-fullwidth-code-point": { 4662 | "version": "3.0.0", 4663 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 4664 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 4665 | "dev": true 4666 | }, 4667 | "string-width": { 4668 | "version": "4.2.3", 4669 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 4670 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 4671 | "dev": true, 4672 | "requires": { 4673 | "emoji-regex": "^8.0.0", 4674 | "is-fullwidth-code-point": "^3.0.0", 4675 | "strip-ansi": "^6.0.1" 4676 | } 4677 | }, 4678 | "strip-ansi": { 4679 | "version": "6.0.1", 4680 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 4681 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 4682 | "dev": true, 4683 | "requires": { 4684 | "ansi-regex": "^5.0.1" 4685 | } 4686 | } 4687 | } 4688 | }, 4689 | "yargs-parser": { 4690 | "version": "20.2.4", 4691 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 4692 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 4693 | "dev": true 4694 | }, 4695 | "yargs-unparser": { 4696 | "version": "2.0.0", 4697 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 4698 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 4699 | "dev": true, 4700 | "requires": { 4701 | "camelcase": "^6.0.0", 4702 | "decamelize": "^4.0.0", 4703 | "flat": "^5.0.2", 4704 | "is-plain-obj": "^2.1.0" 4705 | } 4706 | }, 4707 | "yocto-queue": { 4708 | "version": "0.1.0", 4709 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 4710 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 4711 | "dev": true 4712 | } 4713 | } 4714 | } 4715 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@poanet/solidity-flattener", 3 | "version": "3.0.9", 4 | "description": "Combine solidity files to one flat file", 5 | "scripts": { 6 | "start": "node index.js", 7 | "lint": "./node_modules/.bin/eslint .", 8 | "test": "mocha", 9 | "coveralls": "./node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage" 10 | }, 11 | "bin": { 12 | "poa-solidity-flattener": "index.js" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/poanetwork/solidity-flattener" 17 | }, 18 | "keywords": [], 19 | "author": "POA Network", 20 | "license": "MIT", 21 | "homepage": "https://poa.network/", 22 | "dependencies": { 23 | "bunyan": "^1.8.12", 24 | "decomment": "^0.9.1", 25 | "glob-promise": "^3.4.0", 26 | "path": "^0.12.7" 27 | }, 28 | "engines": { 29 | "node": ">=16 <=18" 30 | }, 31 | "bugs": { 32 | "url": "https://github.com/poanetwork/solidity-flattener/issues" 33 | }, 34 | "main": "index.js", 35 | "devDependencies": { 36 | "coveralls": "^3.0.2", 37 | "eslint": "^5.5.0", 38 | "istanbul": "^0.4.5", 39 | "mocha": "^10.2.0", 40 | "mocha-lcov-reporter": "^1.3.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /test/contracts/dep.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | 4 | contract Dep { 5 | 6 | } -------------------------------------------------------------------------------- /test/contracts/dep2.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | 4 | contract Dep2 { 5 | 6 | } -------------------------------------------------------------------------------- /test/contracts/test.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import './dep.sol'; 4 | import './dep2.sol'; 5 | 6 | contract Test is Dep { 7 | 8 | } 9 | 10 | contract Test2 is Dep2 { 11 | 12 | } -------------------------------------------------------------------------------- /test/contracts/testMock1.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import './test/contracts/dep.sol'; 4 | import './test/contracts/dep2.sol'; 5 | 6 | contract Test is Dep { 7 | 8 | } 9 | 10 | contract Test2 is Dep2 { 11 | 12 | } -------------------------------------------------------------------------------- /test/helpers/change-relative-path-to-absolute.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const assert = require('assert') 3 | const constants = require('../../helpers/constants') 4 | const changeRelativePathToAbsolute = require('../../helpers/change-relative-path-to-absolute.js') 5 | 6 | const dir = './test/contracts' 7 | const filePath = dir + '/test.sol' 8 | const editedFilePath = dir + '/testMock1.sol' 9 | const expectedFileContentNew = fs.readFileSync(editedFilePath, constants.UTF8) 10 | 11 | describe('changeRelativePathToAbsolute', () => { 12 | it('should change relative path to absolute one for imports', async () => { 13 | const fileContentNew = await changeRelativePathToAbsolute(filePath) 14 | assert.equal(fileContentNew, expectedFileContentNew) 15 | }) 16 | }) -------------------------------------------------------------------------------- /test/helpers/clean-path.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert') 2 | const cleanPath = require('../../helpers/clean-path.js') 3 | 4 | const path = './././abc/./def/./././ghi/./jk/test.js' 5 | const expectedCleanedPath = './abc/def/ghi/jk/test.js' 6 | 7 | const path2 = '../abc/../def' 8 | const expectedCleanedPath2 = '../def' 9 | 10 | const path3 = './abc/def/ghijk/test.js' 11 | 12 | describe('cleanPath', () => { 13 | it('should clean path to file from all occurrences of /./', async () => { 14 | assert.equal(cleanPath(path), expectedCleanedPath) 15 | }) 16 | 17 | it('should not clean relative path f/../', async () => { 18 | assert.equal(cleanPath(path2), expectedCleanedPath2) 19 | }) 20 | 21 | it('should not clean already cleaned path', async () => { 22 | assert.equal(cleanPath(path3), path3) 23 | }) 24 | 25 | it('should handle a empty string', async () => { 26 | assert.equal(cleanPath(''), '') 27 | }) 28 | }) -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | const changeRelativePathToAbsoluteTest = require('./helpers/change-relative-path-to-absolute') 3 | // eslint-disable-next-line no-unused-vars 4 | const cleantPath = require('./helpers/clean-path') --------------------------------------------------------------------------------