├── .ci ├── tag-version └── version ├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── remnux-cli.js └── renovate.json /.ci/tag-version: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | TAG=${1} 4 | VALID_TAG=false 5 | 6 | if [ "x${TAG}" == "x" ]; then 7 | echo "You must specify a tag" 8 | exit 10 9 | fi 10 | 11 | if [ ! -f "package.json" ]; then 12 | echo "This script should be run from the root of the directory" 13 | exit 11 14 | fi 15 | 16 | BRANCH=$(git symbolic-ref HEAD 2> /dev/null) 17 | BRANCH=${BRANCH##refs/heads/} 18 | 19 | if [ "${BRANCH}" != "master" ]; then 20 | echo "You must only be on the master branch" 21 | exit 12 22 | fi 23 | 24 | if [ $(echo ${TAG} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+$") ]; then 25 | VALID_TAG=true 26 | fi 27 | 28 | if [ $(echo ${TAG} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+-rc\.[0-9]+$") ]; then 29 | VALID_TAG=true 30 | fi 31 | 32 | if [ $(echo ${TAG} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$") ]; then 33 | VALID_TAG=true 34 | fi 35 | 36 | if [ "${VALID_TAG}" == "false" ]; then 37 | echo "The tag specified was invalid." 38 | exit 10 39 | fi 40 | 41 | VTAG="v${TAG}" 42 | MSG="version ${TAG}" 43 | 44 | npm --no-git-tag-version version $TAG 45 | 46 | git commit -a -m "${MSG}" 47 | git tag -m "${MSG}" ${VTAG} 48 | git push origin master 49 | git push origin --tags 50 | -------------------------------------------------------------------------------- /.ci/version: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -x 4 | 5 | version=$(jq -r '.version' package.json || echo dev | sed -e 's/^v//g') 6 | exact_tag=$(git describe --exact-match 2>/dev/null | sed -e 's/^v//g' || echo "") 7 | 8 | last_tag=$(git describe --tags --abbrev=0) 9 | commits=$(git log --oneline ${last_tag}..HEAD | wc -l | tr -d '[:space:]') 10 | revision=$(git rev-parse --short HEAD || echo unknown) 11 | 12 | if [ $(echo ${exact_tag} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+$") ]; then 13 | echo $exact_tag 14 | exit 0 15 | fi 16 | 17 | if [ $(echo ${exact_tag} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+-rc\.[0-9]+$") ]; then 18 | echo $exact_tag 19 | exit 0 20 | fi 21 | 22 | if [ $(echo ${exact_tag} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$") ]; then 23 | echo $exact_tag 24 | exit 0 25 | fi 26 | 27 | echo "${version}.${commits}.g${revision}" 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | release 3 | config.json 4 | .*rc 5 | extras 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Harbingers LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # REMnux Installer 2 | 3 | This repository contains the source code for the REMnux installer, which is the command-line tool for installing and upgrading the [REMnux](https://REMnux.org) distro. 4 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remnux-cli", 3 | "version": "1.4.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "remnux-cli", 9 | "version": "1.3.9", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@octokit/rest": "^18.0.3", 13 | "bluebird": "^3.7.2", 14 | "docopt": "0.6.2", 15 | "github": "14.0.0", 16 | "js-yaml": "3.14.0", 17 | "mkdirp": "1.0.4", 18 | "openpgp": "^4.10.11", 19 | "request": "2.88.2", 20 | "semver": "^7.6.3", 21 | "split": "1.0.1", 22 | "username": "5.1.0" 23 | }, 24 | "bin": { 25 | "remnux-cli": "remnux-cli.js" 26 | }, 27 | "devDependencies": { 28 | "pkg": "4.4.9" 29 | } 30 | }, 31 | "node_modules/@babel/parser": { 32 | "version": "7.10.5", 33 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", 34 | "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", 35 | "dev": true, 36 | "bin": { 37 | "parser": "bin/babel-parser.js" 38 | }, 39 | "engines": { 40 | "node": ">=6.0.0" 41 | } 42 | }, 43 | "node_modules/@babel/runtime": { 44 | "version": "7.10.5", 45 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", 46 | "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", 47 | "dev": true, 48 | "dependencies": { 49 | "regenerator-runtime": "^0.13.4" 50 | } 51 | }, 52 | "node_modules/@nodelib/fs.scandir": { 53 | "version": "2.1.3", 54 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", 55 | "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", 56 | "dev": true, 57 | "dependencies": { 58 | "@nodelib/fs.stat": "2.0.3", 59 | "run-parallel": "^1.1.9" 60 | }, 61 | "engines": { 62 | "node": ">= 8" 63 | } 64 | }, 65 | "node_modules/@nodelib/fs.stat": { 66 | "version": "2.0.3", 67 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", 68 | "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", 69 | "dev": true, 70 | "engines": { 71 | "node": ">= 8" 72 | } 73 | }, 74 | "node_modules/@nodelib/fs.walk": { 75 | "version": "1.2.4", 76 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", 77 | "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", 78 | "dev": true, 79 | "dependencies": { 80 | "@nodelib/fs.scandir": "2.1.3", 81 | "fastq": "^1.6.0" 82 | }, 83 | "engines": { 84 | "node": ">= 8" 85 | } 86 | }, 87 | "node_modules/@octokit/auth-token": { 88 | "version": "2.4.2", 89 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz", 90 | "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==", 91 | "dependencies": { 92 | "@octokit/types": "^5.0.0" 93 | } 94 | }, 95 | "node_modules/@octokit/core": { 96 | "version": "3.1.1", 97 | "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.1.1.tgz", 98 | "integrity": "sha512-cQ2HGrtyNJ1IBxpTP1U5m/FkMAJvgw7d2j1q3c9P0XUuYilEgF6e4naTpsgm4iVcQeOnccZlw7XHRIUBy0ymcg==", 99 | "dependencies": { 100 | "@octokit/auth-token": "^2.4.0", 101 | "@octokit/graphql": "^4.3.1", 102 | "@octokit/request": "^5.4.0", 103 | "@octokit/types": "^5.0.0", 104 | "before-after-hook": "^2.1.0", 105 | "universal-user-agent": "^6.0.0" 106 | } 107 | }, 108 | "node_modules/@octokit/endpoint": { 109 | "version": "6.0.5", 110 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.5.tgz", 111 | "integrity": "sha512-70K5u6zd45ItOny6aHQAsea8HHQjlQq85yqOMe+Aj8dkhN2qSJ9T+Q3YjUjEYfPRBcuUWNgMn62DQnP/4LAIiQ==", 112 | "dependencies": { 113 | "@octokit/types": "^5.0.0", 114 | "is-plain-object": "^4.0.0", 115 | "universal-user-agent": "^6.0.0" 116 | } 117 | }, 118 | "node_modules/@octokit/graphql": { 119 | "version": "4.5.3", 120 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.3.tgz", 121 | "integrity": "sha512-JyYvi3j2tOb5ofASEpcg1Advs07H+Ag+I+ez7buuZfNVAmh1IYcDTuxd4gnYH8S2PSGu+f5IdDGxMmkK+5zsdA==", 122 | "dependencies": { 123 | "@octokit/request": "^5.3.0", 124 | "@octokit/types": "^5.0.0", 125 | "universal-user-agent": "^6.0.0" 126 | } 127 | }, 128 | "node_modules/@octokit/plugin-paginate-rest": { 129 | "version": "2.3.0", 130 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.0.tgz", 131 | "integrity": "sha512-Ye2ZJreP0ZlqJQz8fz+hXvrEAEYK4ay7br1eDpWzr6j76VXs/gKqxFcH8qRzkB3fo/2xh4Vy9VtGii4ZDc9qlA==", 132 | "dependencies": { 133 | "@octokit/types": "^5.2.0" 134 | } 135 | }, 136 | "node_modules/@octokit/plugin-request-log": { 137 | "version": "1.0.0", 138 | "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", 139 | "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==" 140 | }, 141 | "node_modules/@octokit/plugin-rest-endpoint-methods": { 142 | "version": "4.1.2", 143 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.1.2.tgz", 144 | "integrity": "sha512-PTI7wpbGEZ2IR87TVh+TNWaLcgX/RsZQalFbQCq8XxYUrQ36RHyERrHSNXFy5gkWpspUAOYRSV707JJv6BhqJA==", 145 | "dependencies": { 146 | "@octokit/types": "^5.1.1", 147 | "deprecation": "^2.3.1" 148 | } 149 | }, 150 | "node_modules/@octokit/request": { 151 | "version": "5.4.7", 152 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.7.tgz", 153 | "integrity": "sha512-FN22xUDP0i0uF38YMbOfx6TotpcENP5W8yJM1e/LieGXn6IoRxDMnBf7tx5RKSW4xuUZ/1P04NFZy5iY3Rax1A==", 154 | "dependencies": { 155 | "@octokit/endpoint": "^6.0.1", 156 | "@octokit/request-error": "^2.0.0", 157 | "@octokit/types": "^5.0.0", 158 | "deprecation": "^2.0.0", 159 | "is-plain-object": "^4.0.0", 160 | "node-fetch": "^2.3.0", 161 | "once": "^1.4.0", 162 | "universal-user-agent": "^6.0.0" 163 | } 164 | }, 165 | "node_modules/@octokit/request-error": { 166 | "version": "2.0.2", 167 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz", 168 | "integrity": "sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==", 169 | "dependencies": { 170 | "@octokit/types": "^5.0.1", 171 | "deprecation": "^2.0.0", 172 | "once": "^1.4.0" 173 | } 174 | }, 175 | "node_modules/@octokit/rest": { 176 | "version": "18.0.3", 177 | "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.3.tgz", 178 | "integrity": "sha512-GubgemnLvUJlkhouTM2BtX+g/voYT/Mqh0SASGwTnLvSkW1irjt14N911/ABb6m1Hru0TwScOgFgMFggp3igfQ==", 179 | "dependencies": { 180 | "@octokit/core": "^3.0.0", 181 | "@octokit/plugin-paginate-rest": "^2.2.0", 182 | "@octokit/plugin-request-log": "^1.0.0", 183 | "@octokit/plugin-rest-endpoint-methods": "4.1.2" 184 | } 185 | }, 186 | "node_modules/@octokit/types": { 187 | "version": "5.2.0", 188 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.2.0.tgz", 189 | "integrity": "sha512-XjOk9y4m8xTLIKPe1NFxNWBdzA2/z3PFFA/bwf4EoH6oS8hM0Y46mEa4Cb+KCyj/tFDznJFahzQ0Aj3o1FYq4A==", 190 | "dependencies": { 191 | "@types/node": ">= 8" 192 | } 193 | }, 194 | "node_modules/@types/color-name": { 195 | "version": "1.1.1", 196 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 197 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 198 | "dev": true 199 | }, 200 | "node_modules/@types/node": { 201 | "version": "14.0.27", 202 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", 203 | "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" 204 | }, 205 | "node_modules/ajv": { 206 | "version": "6.12.3", 207 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", 208 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", 209 | "dependencies": { 210 | "fast-deep-equal": "^3.1.1", 211 | "fast-json-stable-stringify": "^2.0.0", 212 | "json-schema-traverse": "^0.4.1", 213 | "uri-js": "^4.2.2" 214 | }, 215 | "funding": { 216 | "type": "github", 217 | "url": "https://github.com/sponsors/epoberezkin" 218 | } 219 | }, 220 | "node_modules/ansi-styles": { 221 | "version": "4.2.1", 222 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 223 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 224 | "dev": true, 225 | "dependencies": { 226 | "@types/color-name": "^1.1.1", 227 | "color-convert": "^2.0.1" 228 | }, 229 | "engines": { 230 | "node": ">=8" 231 | }, 232 | "funding": { 233 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 234 | } 235 | }, 236 | "node_modules/argparse": { 237 | "version": "1.0.10", 238 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 239 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 240 | "dependencies": { 241 | "sprintf-js": "~1.0.2" 242 | } 243 | }, 244 | "node_modules/array-union": { 245 | "version": "2.1.0", 246 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 247 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 248 | "dev": true, 249 | "engines": { 250 | "node": ">=8" 251 | } 252 | }, 253 | "node_modules/asn1": { 254 | "version": "0.2.4", 255 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 256 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 257 | "dependencies": { 258 | "safer-buffer": "~2.1.0" 259 | } 260 | }, 261 | "node_modules/asn1.js": { 262 | "version": "5.4.1", 263 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 264 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 265 | "dependencies": { 266 | "bn.js": "^4.0.0", 267 | "inherits": "^2.0.1", 268 | "minimalistic-assert": "^1.0.0", 269 | "safer-buffer": "^2.1.0" 270 | } 271 | }, 272 | "node_modules/assert-plus": { 273 | "version": "1.0.0", 274 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 275 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 276 | "engines": { 277 | "node": ">=0.8" 278 | } 279 | }, 280 | "node_modules/asynckit": { 281 | "version": "0.4.0", 282 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 283 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 284 | }, 285 | "node_modules/aws-sign2": { 286 | "version": "0.7.0", 287 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 288 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 289 | "engines": { 290 | "node": "*" 291 | } 292 | }, 293 | "node_modules/aws4": { 294 | "version": "1.10.0", 295 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", 296 | "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" 297 | }, 298 | "node_modules/bcrypt-pbkdf": { 299 | "version": "1.0.2", 300 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 301 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 302 | "dependencies": { 303 | "tweetnacl": "^0.14.3" 304 | } 305 | }, 306 | "node_modules/before-after-hook": { 307 | "version": "2.1.0", 308 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", 309 | "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" 310 | }, 311 | "node_modules/bluebird": { 312 | "version": "3.7.2", 313 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 314 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 315 | "license": "MIT" 316 | }, 317 | "node_modules/bn.js": { 318 | "version": "4.11.9", 319 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 320 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" 321 | }, 322 | "node_modules/braces": { 323 | "version": "3.0.3", 324 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 325 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 326 | "dev": true, 327 | "license": "MIT", 328 | "dependencies": { 329 | "fill-range": "^7.1.1" 330 | }, 331 | "engines": { 332 | "node": ">=8" 333 | } 334 | }, 335 | "node_modules/byline": { 336 | "version": "5.0.0", 337 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", 338 | "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", 339 | "dev": true, 340 | "engines": { 341 | "node": ">=0.10.0" 342 | } 343 | }, 344 | "node_modules/caseless": { 345 | "version": "0.12.0", 346 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 347 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 348 | }, 349 | "node_modules/chalk": { 350 | "version": "3.0.0", 351 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 352 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 353 | "dev": true, 354 | "dependencies": { 355 | "ansi-styles": "^4.1.0", 356 | "supports-color": "^7.1.0" 357 | }, 358 | "engines": { 359 | "node": ">=8" 360 | } 361 | }, 362 | "node_modules/color-convert": { 363 | "version": "2.0.1", 364 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 365 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 366 | "dev": true, 367 | "dependencies": { 368 | "color-name": "~1.1.4" 369 | }, 370 | "engines": { 371 | "node": ">=7.0.0" 372 | } 373 | }, 374 | "node_modules/color-name": { 375 | "version": "1.1.4", 376 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 377 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 378 | "dev": true 379 | }, 380 | "node_modules/combined-stream": { 381 | "version": "1.0.8", 382 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 383 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 384 | "dependencies": { 385 | "delayed-stream": "~1.0.0" 386 | }, 387 | "engines": { 388 | "node": ">= 0.8" 389 | } 390 | }, 391 | "node_modules/core-util-is": { 392 | "version": "1.0.2", 393 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 394 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 395 | }, 396 | "node_modules/cross-spawn": { 397 | "version": "6.0.5", 398 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 399 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 400 | "dependencies": { 401 | "nice-try": "^1.0.4", 402 | "path-key": "^2.0.1", 403 | "semver": "^5.5.0", 404 | "shebang-command": "^1.2.0", 405 | "which": "^1.2.9" 406 | }, 407 | "engines": { 408 | "node": ">=4.8" 409 | } 410 | }, 411 | "node_modules/cross-spawn/node_modules/semver": { 412 | "version": "5.7.2", 413 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 414 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 415 | "license": "ISC", 416 | "bin": { 417 | "semver": "bin/semver" 418 | } 419 | }, 420 | "node_modules/dashdash": { 421 | "version": "1.14.1", 422 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 423 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 424 | "dependencies": { 425 | "assert-plus": "^1.0.0" 426 | }, 427 | "engines": { 428 | "node": ">=0.10" 429 | } 430 | }, 431 | "node_modules/deep-is": { 432 | "version": "0.1.3", 433 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 434 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 435 | "dev": true 436 | }, 437 | "node_modules/delayed-stream": { 438 | "version": "1.0.0", 439 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 440 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 441 | "engines": { 442 | "node": ">=0.4.0" 443 | } 444 | }, 445 | "node_modules/deprecation": { 446 | "version": "2.3.1", 447 | "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", 448 | "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" 449 | }, 450 | "node_modules/dir-glob": { 451 | "version": "3.0.1", 452 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 453 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 454 | "dev": true, 455 | "dependencies": { 456 | "path-type": "^4.0.0" 457 | }, 458 | "engines": { 459 | "node": ">=8" 460 | } 461 | }, 462 | "node_modules/docopt": { 463 | "version": "0.6.2", 464 | "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", 465 | "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", 466 | "engines": { 467 | "node": ">=0.10.0" 468 | } 469 | }, 470 | "node_modules/ecc-jsbn": { 471 | "version": "0.1.2", 472 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 473 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 474 | "dependencies": { 475 | "jsbn": "~0.1.0", 476 | "safer-buffer": "^2.1.0" 477 | } 478 | }, 479 | "node_modules/end-of-stream": { 480 | "version": "1.4.4", 481 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 482 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 483 | "dependencies": { 484 | "once": "^1.4.0" 485 | } 486 | }, 487 | "node_modules/escodegen": { 488 | "version": "1.14.3", 489 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", 490 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", 491 | "dev": true, 492 | "dependencies": { 493 | "esprima": "^4.0.1", 494 | "estraverse": "^4.2.0", 495 | "esutils": "^2.0.2", 496 | "optionator": "^0.8.1" 497 | }, 498 | "bin": { 499 | "escodegen": "bin/escodegen.js", 500 | "esgenerate": "bin/esgenerate.js" 501 | }, 502 | "engines": { 503 | "node": ">=4.0" 504 | }, 505 | "optionalDependencies": { 506 | "source-map": "~0.6.1" 507 | } 508 | }, 509 | "node_modules/esprima": { 510 | "version": "4.0.1", 511 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 512 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 513 | "bin": { 514 | "esparse": "bin/esparse.js", 515 | "esvalidate": "bin/esvalidate.js" 516 | }, 517 | "engines": { 518 | "node": ">=4" 519 | } 520 | }, 521 | "node_modules/estraverse": { 522 | "version": "4.3.0", 523 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 524 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 525 | "dev": true, 526 | "engines": { 527 | "node": ">=4.0" 528 | } 529 | }, 530 | "node_modules/esutils": { 531 | "version": "2.0.3", 532 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 533 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 534 | "dev": true, 535 | "engines": { 536 | "node": ">=0.10.0" 537 | } 538 | }, 539 | "node_modules/execa": { 540 | "version": "1.0.0", 541 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 542 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 543 | "dependencies": { 544 | "cross-spawn": "^6.0.0", 545 | "get-stream": "^4.0.0", 546 | "is-stream": "^1.1.0", 547 | "npm-run-path": "^2.0.0", 548 | "p-finally": "^1.0.0", 549 | "signal-exit": "^3.0.0", 550 | "strip-eof": "^1.0.0" 551 | }, 552 | "engines": { 553 | "node": ">=6" 554 | } 555 | }, 556 | "node_modules/expand-template": { 557 | "version": "2.0.3", 558 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 559 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 560 | "dev": true, 561 | "engines": { 562 | "node": ">=6" 563 | } 564 | }, 565 | "node_modules/extend": { 566 | "version": "3.0.2", 567 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 568 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 569 | }, 570 | "node_modules/extsprintf": { 571 | "version": "1.3.0", 572 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 573 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 574 | "engines": [ 575 | "node >=0.6.0" 576 | ] 577 | }, 578 | "node_modules/fast-deep-equal": { 579 | "version": "3.1.3", 580 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 581 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 582 | }, 583 | "node_modules/fast-glob": { 584 | "version": "3.2.4", 585 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", 586 | "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", 587 | "dev": true, 588 | "dependencies": { 589 | "@nodelib/fs.stat": "^2.0.2", 590 | "@nodelib/fs.walk": "^1.2.3", 591 | "glob-parent": "^5.1.0", 592 | "merge2": "^1.3.0", 593 | "micromatch": "^4.0.2", 594 | "picomatch": "^2.2.1" 595 | }, 596 | "engines": { 597 | "node": ">=8" 598 | } 599 | }, 600 | "node_modules/fast-json-stable-stringify": { 601 | "version": "2.1.0", 602 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 603 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 604 | }, 605 | "node_modules/fast-levenshtein": { 606 | "version": "2.0.6", 607 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 608 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 609 | "dev": true 610 | }, 611 | "node_modules/fastq": { 612 | "version": "1.8.0", 613 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", 614 | "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", 615 | "dev": true, 616 | "dependencies": { 617 | "reusify": "^1.0.4" 618 | } 619 | }, 620 | "node_modules/fill-range": { 621 | "version": "7.1.1", 622 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 623 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 624 | "dev": true, 625 | "license": "MIT", 626 | "dependencies": { 627 | "to-regex-range": "^5.0.1" 628 | }, 629 | "engines": { 630 | "node": ">=8" 631 | } 632 | }, 633 | "node_modules/forever-agent": { 634 | "version": "0.6.1", 635 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 636 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 637 | "engines": { 638 | "node": "*" 639 | } 640 | }, 641 | "node_modules/form-data": { 642 | "version": "2.3.3", 643 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 644 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 645 | "dependencies": { 646 | "asynckit": "^0.4.0", 647 | "combined-stream": "^1.0.6", 648 | "mime-types": "^2.1.12" 649 | }, 650 | "engines": { 651 | "node": ">= 0.12" 652 | } 653 | }, 654 | "node_modules/from2": { 655 | "version": "2.3.0", 656 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 657 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 658 | "dev": true, 659 | "dependencies": { 660 | "inherits": "^2.0.1", 661 | "readable-stream": "^2.0.0" 662 | } 663 | }, 664 | "node_modules/fs-extra": { 665 | "version": "8.1.0", 666 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 667 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 668 | "dev": true, 669 | "dependencies": { 670 | "graceful-fs": "^4.2.0", 671 | "jsonfile": "^4.0.0", 672 | "universalify": "^0.1.0" 673 | }, 674 | "engines": { 675 | "node": ">=6 <7 || >=8" 676 | } 677 | }, 678 | "node_modules/get-stream": { 679 | "version": "4.1.0", 680 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 681 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 682 | "dependencies": { 683 | "pump": "^3.0.0" 684 | }, 685 | "engines": { 686 | "node": ">=6" 687 | } 688 | }, 689 | "node_modules/getpass": { 690 | "version": "0.1.7", 691 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 692 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 693 | "dependencies": { 694 | "assert-plus": "^1.0.0" 695 | } 696 | }, 697 | "node_modules/github": { 698 | "version": "14.0.0", 699 | "resolved": "https://registry.npmjs.org/github/-/github-14.0.0.tgz", 700 | "integrity": "sha512-34/VqwhYGeYN0VHBSH49TmRWMF7emy32qjK6POiW47T/QI2u/cpuKsmrWt7a218ew/73dF4dQSJE68/HXdNfPw==", 701 | "deprecated": "'github' has been renamed to '@octokit/rest' (https://git.io/vNB11)" 702 | }, 703 | "node_modules/glob-parent": { 704 | "version": "5.1.2", 705 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 706 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 707 | "dev": true, 708 | "license": "ISC", 709 | "dependencies": { 710 | "is-glob": "^4.0.1" 711 | }, 712 | "engines": { 713 | "node": ">= 6" 714 | } 715 | }, 716 | "node_modules/globby": { 717 | "version": "11.0.1", 718 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", 719 | "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", 720 | "dev": true, 721 | "dependencies": { 722 | "array-union": "^2.1.0", 723 | "dir-glob": "^3.0.1", 724 | "fast-glob": "^3.1.1", 725 | "ignore": "^5.1.4", 726 | "merge2": "^1.3.0", 727 | "slash": "^3.0.0" 728 | }, 729 | "engines": { 730 | "node": ">=10" 731 | }, 732 | "funding": { 733 | "url": "https://github.com/sponsors/sindresorhus" 734 | } 735 | }, 736 | "node_modules/graceful-fs": { 737 | "version": "4.2.4", 738 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 739 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 740 | }, 741 | "node_modules/har-schema": { 742 | "version": "2.0.0", 743 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 744 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 745 | "engines": { 746 | "node": ">=4" 747 | } 748 | }, 749 | "node_modules/har-validator": { 750 | "version": "5.1.5", 751 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 752 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 753 | "deprecated": "this library is no longer supported", 754 | "dependencies": { 755 | "ajv": "^6.12.3", 756 | "har-schema": "^2.0.0" 757 | }, 758 | "engines": { 759 | "node": ">=6" 760 | } 761 | }, 762 | "node_modules/has-flag": { 763 | "version": "4.0.0", 764 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 765 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 766 | "dev": true, 767 | "engines": { 768 | "node": ">=8" 769 | } 770 | }, 771 | "node_modules/http-signature": { 772 | "version": "1.2.0", 773 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 774 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 775 | "dependencies": { 776 | "assert-plus": "^1.0.0", 777 | "jsprim": "^1.2.2", 778 | "sshpk": "^1.7.0" 779 | }, 780 | "engines": { 781 | "node": ">=0.8", 782 | "npm": ">=1.3.7" 783 | } 784 | }, 785 | "node_modules/ignore": { 786 | "version": "5.1.8", 787 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", 788 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", 789 | "dev": true, 790 | "engines": { 791 | "node": ">= 4" 792 | } 793 | }, 794 | "node_modules/imurmurhash": { 795 | "version": "0.1.4", 796 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 797 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 798 | "engines": { 799 | "node": ">=0.8.19" 800 | } 801 | }, 802 | "node_modules/inherits": { 803 | "version": "2.0.4", 804 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 805 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 806 | }, 807 | "node_modules/into-stream": { 808 | "version": "5.1.1", 809 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", 810 | "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", 811 | "dev": true, 812 | "dependencies": { 813 | "from2": "^2.3.0", 814 | "p-is-promise": "^3.0.0" 815 | }, 816 | "engines": { 817 | "node": ">=8" 818 | } 819 | }, 820 | "node_modules/into-stream/node_modules/p-is-promise": { 821 | "version": "3.0.0", 822 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", 823 | "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", 824 | "dev": true, 825 | "engines": { 826 | "node": ">=8" 827 | } 828 | }, 829 | "node_modules/is-extglob": { 830 | "version": "2.1.1", 831 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 832 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 833 | "dev": true, 834 | "engines": { 835 | "node": ">=0.10.0" 836 | } 837 | }, 838 | "node_modules/is-glob": { 839 | "version": "4.0.1", 840 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 841 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 842 | "dev": true, 843 | "dependencies": { 844 | "is-extglob": "^2.1.1" 845 | }, 846 | "engines": { 847 | "node": ">=0.10.0" 848 | } 849 | }, 850 | "node_modules/is-number": { 851 | "version": "7.0.0", 852 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 853 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 854 | "dev": true, 855 | "license": "MIT", 856 | "engines": { 857 | "node": ">=0.12.0" 858 | } 859 | }, 860 | "node_modules/is-plain-object": { 861 | "version": "4.1.1", 862 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-4.1.1.tgz", 863 | "integrity": "sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA==", 864 | "engines": { 865 | "node": ">=0.10.0" 866 | } 867 | }, 868 | "node_modules/is-stream": { 869 | "version": "1.1.0", 870 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 871 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 872 | "engines": { 873 | "node": ">=0.10.0" 874 | } 875 | }, 876 | "node_modules/is-typedarray": { 877 | "version": "1.0.0", 878 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 879 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 880 | }, 881 | "node_modules/isarray": { 882 | "version": "1.0.0", 883 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 884 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 885 | "dev": true 886 | }, 887 | "node_modules/isexe": { 888 | "version": "2.0.0", 889 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 890 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 891 | }, 892 | "node_modules/isstream": { 893 | "version": "0.1.2", 894 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 895 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 896 | }, 897 | "node_modules/js-yaml": { 898 | "version": "3.14.0", 899 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 900 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 901 | "dependencies": { 902 | "argparse": "^1.0.7", 903 | "esprima": "^4.0.0" 904 | }, 905 | "bin": { 906 | "js-yaml": "bin/js-yaml.js" 907 | } 908 | }, 909 | "node_modules/jsbn": { 910 | "version": "0.1.1", 911 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 912 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 913 | }, 914 | "node_modules/json-schema": { 915 | "version": "0.4.0", 916 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 917 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", 918 | "license": "(AFL-2.1 OR BSD-3-Clause)" 919 | }, 920 | "node_modules/json-schema-traverse": { 921 | "version": "0.4.1", 922 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 923 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 924 | }, 925 | "node_modules/json-stringify-safe": { 926 | "version": "5.0.1", 927 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 928 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 929 | }, 930 | "node_modules/jsonfile": { 931 | "version": "4.0.0", 932 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 933 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 934 | "dev": true, 935 | "optionalDependencies": { 936 | "graceful-fs": "^4.1.6" 937 | } 938 | }, 939 | "node_modules/jsprim": { 940 | "version": "1.4.2", 941 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 942 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 943 | "license": "MIT", 944 | "dependencies": { 945 | "assert-plus": "1.0.0", 946 | "extsprintf": "1.3.0", 947 | "json-schema": "0.4.0", 948 | "verror": "1.10.0" 949 | }, 950 | "engines": { 951 | "node": ">=0.6.0" 952 | } 953 | }, 954 | "node_modules/levn": { 955 | "version": "0.3.0", 956 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 957 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 958 | "dev": true, 959 | "dependencies": { 960 | "prelude-ls": "~1.1.2", 961 | "type-check": "~0.3.2" 962 | }, 963 | "engines": { 964 | "node": ">= 0.8.0" 965 | } 966 | }, 967 | "node_modules/map-age-cleaner": { 968 | "version": "0.1.3", 969 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 970 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 971 | "dependencies": { 972 | "p-defer": "^1.0.0" 973 | }, 974 | "engines": { 975 | "node": ">=6" 976 | } 977 | }, 978 | "node_modules/mem": { 979 | "version": "4.3.0", 980 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 981 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 982 | "dependencies": { 983 | "map-age-cleaner": "^0.1.1", 984 | "mimic-fn": "^2.0.0", 985 | "p-is-promise": "^2.0.0" 986 | }, 987 | "engines": { 988 | "node": ">=6" 989 | } 990 | }, 991 | "node_modules/merge2": { 992 | "version": "1.4.1", 993 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 994 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 995 | "dev": true, 996 | "engines": { 997 | "node": ">= 8" 998 | } 999 | }, 1000 | "node_modules/micromatch": { 1001 | "version": "4.0.8", 1002 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1003 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1004 | "dev": true, 1005 | "license": "MIT", 1006 | "dependencies": { 1007 | "braces": "^3.0.3", 1008 | "picomatch": "^2.3.1" 1009 | }, 1010 | "engines": { 1011 | "node": ">=8.6" 1012 | } 1013 | }, 1014 | "node_modules/mime-db": { 1015 | "version": "1.44.0", 1016 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1017 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", 1018 | "engines": { 1019 | "node": ">= 0.6" 1020 | } 1021 | }, 1022 | "node_modules/mime-types": { 1023 | "version": "2.1.27", 1024 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1025 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1026 | "dependencies": { 1027 | "mime-db": "1.44.0" 1028 | }, 1029 | "engines": { 1030 | "node": ">= 0.6" 1031 | } 1032 | }, 1033 | "node_modules/mimic-fn": { 1034 | "version": "2.1.0", 1035 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1036 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1037 | "engines": { 1038 | "node": ">=6" 1039 | } 1040 | }, 1041 | "node_modules/minimalistic-assert": { 1042 | "version": "1.0.1", 1043 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1044 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1045 | }, 1046 | "node_modules/minimist": { 1047 | "version": "1.2.8", 1048 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1049 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1050 | "dev": true, 1051 | "license": "MIT", 1052 | "funding": { 1053 | "url": "https://github.com/sponsors/ljharb" 1054 | } 1055 | }, 1056 | "node_modules/mkdirp": { 1057 | "version": "1.0.4", 1058 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1059 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1060 | "bin": { 1061 | "mkdirp": "bin/cmd.js" 1062 | }, 1063 | "engines": { 1064 | "node": ">=10" 1065 | } 1066 | }, 1067 | "node_modules/multistream": { 1068 | "version": "2.1.1", 1069 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", 1070 | "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", 1071 | "dev": true, 1072 | "dependencies": { 1073 | "inherits": "^2.0.1", 1074 | "readable-stream": "^2.0.5" 1075 | } 1076 | }, 1077 | "node_modules/nice-try": { 1078 | "version": "1.0.5", 1079 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1080 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 1081 | }, 1082 | "node_modules/node-fetch": { 1083 | "version": "2.7.0", 1084 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1085 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1086 | "license": "MIT", 1087 | "dependencies": { 1088 | "whatwg-url": "^5.0.0" 1089 | }, 1090 | "engines": { 1091 | "node": "4.x || >=6.0.0" 1092 | }, 1093 | "peerDependencies": { 1094 | "encoding": "^0.1.0" 1095 | }, 1096 | "peerDependenciesMeta": { 1097 | "encoding": { 1098 | "optional": true 1099 | } 1100 | } 1101 | }, 1102 | "node_modules/node-localstorage": { 1103 | "version": "1.3.1", 1104 | "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", 1105 | "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", 1106 | "dependencies": { 1107 | "write-file-atomic": "^1.1.4" 1108 | }, 1109 | "engines": { 1110 | "node": ">=0.12" 1111 | } 1112 | }, 1113 | "node_modules/npm-run-path": { 1114 | "version": "2.0.2", 1115 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1116 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1117 | "dependencies": { 1118 | "path-key": "^2.0.0" 1119 | }, 1120 | "engines": { 1121 | "node": ">=4" 1122 | } 1123 | }, 1124 | "node_modules/oauth-sign": { 1125 | "version": "0.9.0", 1126 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1127 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1128 | "engines": { 1129 | "node": "*" 1130 | } 1131 | }, 1132 | "node_modules/once": { 1133 | "version": "1.4.0", 1134 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1135 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1136 | "dependencies": { 1137 | "wrappy": "1" 1138 | } 1139 | }, 1140 | "node_modules/openpgp": { 1141 | "version": "4.10.11", 1142 | "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.10.11.tgz", 1143 | "integrity": "sha512-ec8m6xkuBqTaSSoNEr7CK0AepeVvKkgvMxs0KVAtEHlFDd1fA93Q+jYls6vRfrZDl0UEAEmcvRUa4W8VuGey2w==", 1144 | "license": "LGPL-3.0+", 1145 | "dependencies": { 1146 | "asn1.js": "^5.0.0", 1147 | "node-fetch": "^2.1.2", 1148 | "node-localstorage": "~1.3.0" 1149 | }, 1150 | "engines": { 1151 | "node": ">= 8.0.0" 1152 | } 1153 | }, 1154 | "node_modules/optionator": { 1155 | "version": "0.8.3", 1156 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1157 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1158 | "dev": true, 1159 | "dependencies": { 1160 | "deep-is": "~0.1.3", 1161 | "fast-levenshtein": "~2.0.6", 1162 | "levn": "~0.3.0", 1163 | "prelude-ls": "~1.1.2", 1164 | "type-check": "~0.3.2", 1165 | "word-wrap": "~1.2.3" 1166 | }, 1167 | "engines": { 1168 | "node": ">= 0.8.0" 1169 | } 1170 | }, 1171 | "node_modules/os-tmpdir": { 1172 | "version": "1.0.2", 1173 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1174 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1175 | "dev": true, 1176 | "engines": { 1177 | "node": ">=0.10.0" 1178 | } 1179 | }, 1180 | "node_modules/p-defer": { 1181 | "version": "1.0.0", 1182 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1183 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 1184 | "engines": { 1185 | "node": ">=4" 1186 | } 1187 | }, 1188 | "node_modules/p-finally": { 1189 | "version": "1.0.0", 1190 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1191 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1192 | "engines": { 1193 | "node": ">=4" 1194 | } 1195 | }, 1196 | "node_modules/p-is-promise": { 1197 | "version": "2.0.0", 1198 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", 1199 | "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", 1200 | "engines": { 1201 | "node": ">=6" 1202 | } 1203 | }, 1204 | "node_modules/path-key": { 1205 | "version": "2.0.1", 1206 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1207 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1208 | "engines": { 1209 | "node": ">=4" 1210 | } 1211 | }, 1212 | "node_modules/path-parse": { 1213 | "version": "1.0.7", 1214 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1215 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1216 | "dev": true, 1217 | "license": "MIT" 1218 | }, 1219 | "node_modules/path-type": { 1220 | "version": "4.0.0", 1221 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1222 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1223 | "dev": true, 1224 | "engines": { 1225 | "node": ">=8" 1226 | } 1227 | }, 1228 | "node_modules/performance-now": { 1229 | "version": "2.1.0", 1230 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1231 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1232 | }, 1233 | "node_modules/picomatch": { 1234 | "version": "2.3.1", 1235 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1236 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1237 | "dev": true, 1238 | "license": "MIT", 1239 | "engines": { 1240 | "node": ">=8.6" 1241 | }, 1242 | "funding": { 1243 | "url": "https://github.com/sponsors/jonschlinkert" 1244 | } 1245 | }, 1246 | "node_modules/pkg": { 1247 | "version": "4.4.9", 1248 | "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.4.9.tgz", 1249 | "integrity": "sha512-FK4GqHtcCY2PPPVaKViU0NyRzpo6gCS7tPKN5b7AkElqjAOCH1bsRKgohEnxThr6DWfTGByGqba2YHGR/BqbmA==", 1250 | "dev": true, 1251 | "dependencies": { 1252 | "@babel/parser": "^7.9.4", 1253 | "@babel/runtime": "^7.9.2", 1254 | "chalk": "^3.0.0", 1255 | "escodegen": "^1.14.1", 1256 | "fs-extra": "^8.1.0", 1257 | "globby": "^11.0.0", 1258 | "into-stream": "^5.1.1", 1259 | "minimist": "^1.2.5", 1260 | "multistream": "^2.1.1", 1261 | "pkg-fetch": "^2.6.9", 1262 | "progress": "^2.0.3", 1263 | "resolve": "^1.15.1", 1264 | "stream-meter": "^1.0.4" 1265 | }, 1266 | "bin": { 1267 | "pkg": "lib-es5/bin.js" 1268 | } 1269 | }, 1270 | "node_modules/pkg-fetch": { 1271 | "version": "2.6.9", 1272 | "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.6.9.tgz", 1273 | "integrity": "sha512-EnVR8LRILXBvaNP+wJOSY02c3+qDDfyEyR+aqAHLhcc9PBnbxFT9UZ1+If49goPQzQPn26TzF//fc6KXZ0aXEg==", 1274 | "dev": true, 1275 | "dependencies": { 1276 | "@babel/runtime": "^7.9.2", 1277 | "byline": "^5.0.0", 1278 | "chalk": "^3.0.0", 1279 | "expand-template": "^2.0.3", 1280 | "fs-extra": "^8.1.0", 1281 | "minimist": "^1.2.5", 1282 | "progress": "^2.0.3", 1283 | "request": "^2.88.0", 1284 | "request-progress": "^3.0.0", 1285 | "semver": "^6.3.0", 1286 | "unique-temp-dir": "^1.0.0" 1287 | }, 1288 | "bin": { 1289 | "pkg-fetch": "lib-es5/bin.js" 1290 | } 1291 | }, 1292 | "node_modules/pkg-fetch/node_modules/semver": { 1293 | "version": "6.3.1", 1294 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1295 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1296 | "dev": true, 1297 | "license": "ISC", 1298 | "bin": { 1299 | "semver": "bin/semver.js" 1300 | } 1301 | }, 1302 | "node_modules/prelude-ls": { 1303 | "version": "1.1.2", 1304 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1305 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1306 | "dev": true, 1307 | "engines": { 1308 | "node": ">= 0.8.0" 1309 | } 1310 | }, 1311 | "node_modules/process-nextick-args": { 1312 | "version": "2.0.1", 1313 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1314 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1315 | "dev": true 1316 | }, 1317 | "node_modules/progress": { 1318 | "version": "2.0.3", 1319 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1320 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1321 | "dev": true, 1322 | "engines": { 1323 | "node": ">=0.4.0" 1324 | } 1325 | }, 1326 | "node_modules/psl": { 1327 | "version": "1.8.0", 1328 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1329 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1330 | }, 1331 | "node_modules/pump": { 1332 | "version": "3.0.0", 1333 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1334 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1335 | "dependencies": { 1336 | "end-of-stream": "^1.1.0", 1337 | "once": "^1.3.1" 1338 | } 1339 | }, 1340 | "node_modules/punycode": { 1341 | "version": "2.1.1", 1342 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1343 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1344 | "engines": { 1345 | "node": ">=6" 1346 | } 1347 | }, 1348 | "node_modules/qs": { 1349 | "version": "6.5.3", 1350 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1351 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 1352 | "license": "BSD-3-Clause", 1353 | "engines": { 1354 | "node": ">=0.6" 1355 | } 1356 | }, 1357 | "node_modules/readable-stream": { 1358 | "version": "2.3.7", 1359 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1360 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1361 | "dev": true, 1362 | "dependencies": { 1363 | "core-util-is": "~1.0.0", 1364 | "inherits": "~2.0.3", 1365 | "isarray": "~1.0.0", 1366 | "process-nextick-args": "~2.0.0", 1367 | "safe-buffer": "~5.1.1", 1368 | "string_decoder": "~1.1.1", 1369 | "util-deprecate": "~1.0.1" 1370 | } 1371 | }, 1372 | "node_modules/readable-stream/node_modules/safe-buffer": { 1373 | "version": "5.1.2", 1374 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1375 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1376 | "dev": true 1377 | }, 1378 | "node_modules/regenerator-runtime": { 1379 | "version": "0.13.7", 1380 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1381 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", 1382 | "dev": true 1383 | }, 1384 | "node_modules/request": { 1385 | "version": "2.88.2", 1386 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1387 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1388 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 1389 | "dependencies": { 1390 | "aws-sign2": "~0.7.0", 1391 | "aws4": "^1.8.0", 1392 | "caseless": "~0.12.0", 1393 | "combined-stream": "~1.0.6", 1394 | "extend": "~3.0.2", 1395 | "forever-agent": "~0.6.1", 1396 | "form-data": "~2.3.2", 1397 | "har-validator": "~5.1.3", 1398 | "http-signature": "~1.2.0", 1399 | "is-typedarray": "~1.0.0", 1400 | "isstream": "~0.1.2", 1401 | "json-stringify-safe": "~5.0.1", 1402 | "mime-types": "~2.1.19", 1403 | "oauth-sign": "~0.9.0", 1404 | "performance-now": "^2.1.0", 1405 | "qs": "~6.5.2", 1406 | "safe-buffer": "^5.1.2", 1407 | "tough-cookie": "~2.5.0", 1408 | "tunnel-agent": "^0.6.0", 1409 | "uuid": "^3.3.2" 1410 | }, 1411 | "engines": { 1412 | "node": ">= 6" 1413 | } 1414 | }, 1415 | "node_modules/request-progress": { 1416 | "version": "3.0.0", 1417 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", 1418 | "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", 1419 | "dev": true, 1420 | "dependencies": { 1421 | "throttleit": "^1.0.0" 1422 | } 1423 | }, 1424 | "node_modules/resolve": { 1425 | "version": "1.17.0", 1426 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1427 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1428 | "dev": true, 1429 | "dependencies": { 1430 | "path-parse": "^1.0.6" 1431 | }, 1432 | "funding": { 1433 | "url": "https://github.com/sponsors/ljharb" 1434 | } 1435 | }, 1436 | "node_modules/reusify": { 1437 | "version": "1.0.4", 1438 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1439 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1440 | "dev": true, 1441 | "engines": { 1442 | "iojs": ">=1.0.0", 1443 | "node": ">=0.10.0" 1444 | } 1445 | }, 1446 | "node_modules/run-parallel": { 1447 | "version": "1.1.9", 1448 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 1449 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", 1450 | "dev": true 1451 | }, 1452 | "node_modules/safe-buffer": { 1453 | "version": "5.2.1", 1454 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1455 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1456 | "funding": [ 1457 | { 1458 | "type": "github", 1459 | "url": "https://github.com/sponsors/feross" 1460 | }, 1461 | { 1462 | "type": "patreon", 1463 | "url": "https://www.patreon.com/feross" 1464 | }, 1465 | { 1466 | "type": "consulting", 1467 | "url": "https://feross.org/support" 1468 | } 1469 | ] 1470 | }, 1471 | "node_modules/safer-buffer": { 1472 | "version": "2.1.2", 1473 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1474 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1475 | }, 1476 | "node_modules/semver": { 1477 | "version": "7.6.3", 1478 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1479 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1480 | "license": "ISC", 1481 | "bin": { 1482 | "semver": "bin/semver.js" 1483 | }, 1484 | "engines": { 1485 | "node": ">=10" 1486 | } 1487 | }, 1488 | "node_modules/shebang-command": { 1489 | "version": "1.2.0", 1490 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1491 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1492 | "dependencies": { 1493 | "shebang-regex": "^1.0.0" 1494 | }, 1495 | "engines": { 1496 | "node": ">=0.10.0" 1497 | } 1498 | }, 1499 | "node_modules/shebang-regex": { 1500 | "version": "1.0.0", 1501 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1502 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1503 | "engines": { 1504 | "node": ">=0.10.0" 1505 | } 1506 | }, 1507 | "node_modules/signal-exit": { 1508 | "version": "3.0.2", 1509 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1510 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1511 | }, 1512 | "node_modules/slash": { 1513 | "version": "3.0.0", 1514 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1515 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1516 | "dev": true, 1517 | "engines": { 1518 | "node": ">=8" 1519 | } 1520 | }, 1521 | "node_modules/slide": { 1522 | "version": "1.1.6", 1523 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 1524 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", 1525 | "engines": { 1526 | "node": "*" 1527 | } 1528 | }, 1529 | "node_modules/source-map": { 1530 | "version": "0.6.1", 1531 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1532 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1533 | "dev": true, 1534 | "optional": true, 1535 | "engines": { 1536 | "node": ">=0.10.0" 1537 | } 1538 | }, 1539 | "node_modules/split": { 1540 | "version": "1.0.1", 1541 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 1542 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 1543 | "dependencies": { 1544 | "through": "2" 1545 | }, 1546 | "engines": { 1547 | "node": "*" 1548 | } 1549 | }, 1550 | "node_modules/sprintf-js": { 1551 | "version": "1.0.3", 1552 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1553 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1554 | }, 1555 | "node_modules/sshpk": { 1556 | "version": "1.16.1", 1557 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1558 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1559 | "dependencies": { 1560 | "asn1": "~0.2.3", 1561 | "assert-plus": "^1.0.0", 1562 | "bcrypt-pbkdf": "^1.0.0", 1563 | "dashdash": "^1.12.0", 1564 | "ecc-jsbn": "~0.1.1", 1565 | "getpass": "^0.1.1", 1566 | "jsbn": "~0.1.0", 1567 | "safer-buffer": "^2.0.2", 1568 | "tweetnacl": "~0.14.0" 1569 | }, 1570 | "bin": { 1571 | "sshpk-conv": "bin/sshpk-conv", 1572 | "sshpk-sign": "bin/sshpk-sign", 1573 | "sshpk-verify": "bin/sshpk-verify" 1574 | }, 1575 | "engines": { 1576 | "node": ">=0.10.0" 1577 | } 1578 | }, 1579 | "node_modules/stream-meter": { 1580 | "version": "1.0.4", 1581 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", 1582 | "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=", 1583 | "dev": true, 1584 | "dependencies": { 1585 | "readable-stream": "^2.1.4" 1586 | } 1587 | }, 1588 | "node_modules/string_decoder": { 1589 | "version": "1.1.1", 1590 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1591 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1592 | "dev": true, 1593 | "dependencies": { 1594 | "safe-buffer": "~5.1.0" 1595 | } 1596 | }, 1597 | "node_modules/string_decoder/node_modules/safe-buffer": { 1598 | "version": "5.1.2", 1599 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1600 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1601 | "dev": true 1602 | }, 1603 | "node_modules/strip-eof": { 1604 | "version": "1.0.0", 1605 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1606 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 1607 | "engines": { 1608 | "node": ">=0.10.0" 1609 | } 1610 | }, 1611 | "node_modules/supports-color": { 1612 | "version": "7.1.0", 1613 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1614 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1615 | "dev": true, 1616 | "dependencies": { 1617 | "has-flag": "^4.0.0" 1618 | }, 1619 | "engines": { 1620 | "node": ">=8" 1621 | } 1622 | }, 1623 | "node_modules/throttleit": { 1624 | "version": "1.0.0", 1625 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 1626 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 1627 | "dev": true 1628 | }, 1629 | "node_modules/through": { 1630 | "version": "2.3.8", 1631 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1632 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1633 | }, 1634 | "node_modules/to-regex-range": { 1635 | "version": "5.0.1", 1636 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1637 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1638 | "dev": true, 1639 | "license": "MIT", 1640 | "dependencies": { 1641 | "is-number": "^7.0.0" 1642 | }, 1643 | "engines": { 1644 | "node": ">=8.0" 1645 | } 1646 | }, 1647 | "node_modules/tough-cookie": { 1648 | "version": "2.5.0", 1649 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1650 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1651 | "dependencies": { 1652 | "psl": "^1.1.28", 1653 | "punycode": "^2.1.1" 1654 | }, 1655 | "engines": { 1656 | "node": ">=0.8" 1657 | } 1658 | }, 1659 | "node_modules/tr46": { 1660 | "version": "0.0.3", 1661 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1662 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 1663 | "license": "MIT" 1664 | }, 1665 | "node_modules/tunnel-agent": { 1666 | "version": "0.6.0", 1667 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1668 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1669 | "dependencies": { 1670 | "safe-buffer": "^5.0.1" 1671 | }, 1672 | "engines": { 1673 | "node": "*" 1674 | } 1675 | }, 1676 | "node_modules/tweetnacl": { 1677 | "version": "0.14.5", 1678 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1679 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1680 | }, 1681 | "node_modules/type-check": { 1682 | "version": "0.3.2", 1683 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1684 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1685 | "dev": true, 1686 | "dependencies": { 1687 | "prelude-ls": "~1.1.2" 1688 | }, 1689 | "engines": { 1690 | "node": ">= 0.8.0" 1691 | } 1692 | }, 1693 | "node_modules/uid2": { 1694 | "version": "0.0.3", 1695 | "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", 1696 | "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", 1697 | "dev": true 1698 | }, 1699 | "node_modules/unique-temp-dir": { 1700 | "version": "1.0.0", 1701 | "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", 1702 | "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", 1703 | "dev": true, 1704 | "dependencies": { 1705 | "mkdirp": "^0.5.1", 1706 | "os-tmpdir": "^1.0.1", 1707 | "uid2": "0.0.3" 1708 | }, 1709 | "engines": { 1710 | "node": ">=0.10.0" 1711 | } 1712 | }, 1713 | "node_modules/unique-temp-dir/node_modules/mkdirp": { 1714 | "version": "0.5.5", 1715 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1716 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1717 | "dev": true, 1718 | "dependencies": { 1719 | "minimist": "^1.2.5" 1720 | }, 1721 | "bin": { 1722 | "mkdirp": "bin/cmd.js" 1723 | } 1724 | }, 1725 | "node_modules/universal-user-agent": { 1726 | "version": "6.0.0", 1727 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", 1728 | "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" 1729 | }, 1730 | "node_modules/universalify": { 1731 | "version": "0.1.2", 1732 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1733 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1734 | "dev": true, 1735 | "engines": { 1736 | "node": ">= 4.0.0" 1737 | } 1738 | }, 1739 | "node_modules/uri-js": { 1740 | "version": "4.2.2", 1741 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1742 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1743 | "dependencies": { 1744 | "punycode": "^2.1.0" 1745 | } 1746 | }, 1747 | "node_modules/username": { 1748 | "version": "5.1.0", 1749 | "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", 1750 | "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", 1751 | "dependencies": { 1752 | "execa": "^1.0.0", 1753 | "mem": "^4.3.0" 1754 | }, 1755 | "engines": { 1756 | "node": ">=8" 1757 | } 1758 | }, 1759 | "node_modules/util-deprecate": { 1760 | "version": "1.0.2", 1761 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1762 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1763 | "dev": true 1764 | }, 1765 | "node_modules/uuid": { 1766 | "version": "3.4.0", 1767 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1768 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1769 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1770 | "bin": { 1771 | "uuid": "bin/uuid" 1772 | } 1773 | }, 1774 | "node_modules/verror": { 1775 | "version": "1.10.0", 1776 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1777 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1778 | "engines": [ 1779 | "node >=0.6.0" 1780 | ], 1781 | "dependencies": { 1782 | "assert-plus": "^1.0.0", 1783 | "core-util-is": "1.0.2", 1784 | "extsprintf": "^1.2.0" 1785 | } 1786 | }, 1787 | "node_modules/webidl-conversions": { 1788 | "version": "3.0.1", 1789 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1790 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 1791 | "license": "BSD-2-Clause" 1792 | }, 1793 | "node_modules/whatwg-url": { 1794 | "version": "5.0.0", 1795 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1796 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1797 | "license": "MIT", 1798 | "dependencies": { 1799 | "tr46": "~0.0.3", 1800 | "webidl-conversions": "^3.0.0" 1801 | } 1802 | }, 1803 | "node_modules/which": { 1804 | "version": "1.3.1", 1805 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1806 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1807 | "dependencies": { 1808 | "isexe": "^2.0.0" 1809 | }, 1810 | "bin": { 1811 | "which": "bin/which" 1812 | } 1813 | }, 1814 | "node_modules/word-wrap": { 1815 | "version": "1.2.5", 1816 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1817 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1818 | "dev": true, 1819 | "license": "MIT", 1820 | "engines": { 1821 | "node": ">=0.10.0" 1822 | } 1823 | }, 1824 | "node_modules/wrappy": { 1825 | "version": "1.0.2", 1826 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1827 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1828 | }, 1829 | "node_modules/write-file-atomic": { 1830 | "version": "1.3.4", 1831 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", 1832 | "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", 1833 | "dependencies": { 1834 | "graceful-fs": "^4.1.11", 1835 | "imurmurhash": "^0.1.4", 1836 | "slide": "^1.1.5" 1837 | } 1838 | } 1839 | } 1840 | } 1841 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remnux-cli", 3 | "version": "1.4.3", 4 | "description": "Manage your REMnux installation", 5 | "main": "remnux-cli.js", 6 | "bin": { 7 | "remnux-cli": "remnux-cli.js" 8 | }, 9 | "scripts": { 10 | "pkg:prep": "jo version=$(bash .ci/version) > config.json", 11 | "pkg:build": "pkg -t node12-linux --out-dir release package.json && cd release && mv remnux-cli remnux-cli-linux", 12 | "pkg:hash": "cd release && shasum -a 256 remnux-cli-linux > remnux-cli-linux.sha256", 13 | "pkg:sign": "cd release && rm -f remnux-cli-linux.sha256.asc && gpg --armor --clearsign --digest-algo SHA256 -u 28CD19DB remnux-cli-linux.sha256 && rm remnux-cli-linux.sha256", 14 | "pkg": "npm run pkg:prep && npm run pkg:build && npm run pkg:hash && npm run pkg:sign" 15 | }, 16 | "author": "Erik Kristensen . Revised for REMnux by Lenny Zeltser.", 17 | "license": "MIT", 18 | "dependencies": { 19 | "@octokit/rest": "^18.0.3", 20 | "bluebird": "^3.7.2", 21 | "docopt": "0.6.2", 22 | "github": "14.0.0", 23 | "js-yaml": "3.14.0", 24 | "mkdirp": "1.0.4", 25 | "openpgp": "^4.10.11", 26 | "request": "2.88.2", 27 | "semver": "^7.6.3", 28 | "split": "1.0.1", 29 | "username": "5.1.0" 30 | }, 31 | "devDependencies": { 32 | "pkg": "4.4.9" 33 | }, 34 | "pkg": { 35 | "scripts": [ 36 | "node_modules/github/lib/routes.json" 37 | ] 38 | }, 39 | "false": {} 40 | } 41 | -------------------------------------------------------------------------------- /remnux-cli.js: -------------------------------------------------------------------------------- 1 | const cfg = require('./config.json') 2 | const bluebird = require('bluebird') 3 | const os = require('os') 4 | const fs = bluebird.promisifyAll(require('fs')) 5 | const child_process = bluebird.promisifyAll(require('child_process')) 6 | const crypto = require('crypto') 7 | const spawn = require('child_process').spawn 8 | const docopt = require('docopt').docopt 9 | const { Octokit } = require('@octokit/rest') 10 | const mkdirp = require('mkdirp') 11 | const request = require('request') 12 | const openpgp = require('openpgp') 13 | const username = require('username') 14 | const readline = require('readline') 15 | const split = require('split') 16 | const semver = require('semver') 17 | 18 | /** 19 | * Setup Custom YAML Parsing 20 | */ 21 | const yaml = require('js-yaml') 22 | const PythonUnicodeType = new yaml.Type('tag:yaml.org,2002:python/unicode', { 23 | kind: 'scalar', 24 | construct: (data) => { return data !== null ? data : ''; } 25 | }) 26 | const PYTHON_SCHEMA = new yaml.Schema({ 27 | include: [yaml.DEFAULT_SAFE_SCHEMA], 28 | explicit: [PythonUnicodeType] 29 | }) 30 | 31 | const currentUser = process.env.SUDO_USER || username.sync() 32 | 33 | const doc = ` 34 | Usage: 35 | remnux [options] list-upgrades [--pre-release] 36 | remnux [options] install [--pre-release] [--version=] [--mode=] [--user=] 37 | remnux [options] update 38 | remnux [options] upgrade [--pre-release] [--mode=] [--user=] 39 | remnux [options] version 40 | remnux [options] debug 41 | remnux -h | --help | -v 42 | 43 | Options: 44 | --dev Developer Mode (do not use, dangerous, bypasses checks) 45 | --version= Specific version install [default: latest] 46 | --mode= REMnux installation mode (dedicated, addon, or cloud) 47 | --user= User used for REMnux configuration [default: ${currentUser}] 48 | --no-cache Ignore the cache, always download the release files 49 | --verbose Display verbose logging 50 | ` 51 | 52 | const saltstackVersion = '3006' 53 | const pubKey = ` 54 | -----BEGIN PGP PUBLIC KEY BLOCK----- 55 | 56 | mQGNBGPazmABDAC6qc2st6/Uh/5AL325OB5+Z1XMFM2HhQNjB/VcYbLvcCx9AXsU 57 | eaEmNPm6OY3p5+j8omjpXPYSU7DUQ0lIutuAtwkDMROH7uH/r9IY7iu88S6w3q89 58 | bgbnqhu4mrSik2RNH2NqEiJkylz5rwj4F387y+UGH3aXIGryr+Lux9WxfqoRRX7J 59 | WCf6KOaduLSp9lF4qdpAb4/Z5yExXtQRA9HULSJZqNVhfhWInTkVPw+vUo/P9AYv 60 | mJVv6HRNlTb4HCnl6AZGcAYv66J7iWukavmYKxuIbdn4gBJwE0shU9SaP70dh/LT 61 | WqIUuGRZBVH/LCuVGzglGYDh2iiOvR7YRMKf26/9xlR0SpeU/B1g6tRu3p+7OgjA 62 | vJFws+bGSPed07asam3mRZ0Y9QLCXMouWhQZQpx7Or1pUl5Wljhe2W84MfW+Ph6T 63 | yUm/j0yRlZJ750rGfDKA5gKIlTUXr+nTvsK3nnRiHGH2zwrC1BkPG8K6MLRluU/J 64 | ChgZo72AOpVNq9MAEQEAAbQ5U2FsdCBQcm9qZWN0IFBhY2thZ2luZyA8c2FsdHBy 65 | b2plY3QtcGFja2FnaW5nQHZtd2FyZS5jb20+iQHSBBMBCAA8FiEEEIV//dP5Hq5X 66 | eiHWZMu8gXPXaz8FAmPazmACGwMFCwkIBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheA 67 | AAoJEGTLvIFz12s/yf0L/jyP/LfduA4DwpjKX9Vpk26tgis9Q0I54UerpD5ibpTA 68 | krzZxK1yFOPddcOjo+Xqg+I8aA+0nJkf+vsfnRgcpLs2qHZkikwZbPduZwkNUHX7 69 | 6YPSXTwyFlzhaRycwPtvBPLFjfmjjjTi/aH4V/frfxfjH/wFvH/xiaiFsYbP3aAP 70 | sJNTLh3im480ugQ7P54ukdte2QHKsjJ3z4tkjnu1ogc1+ZLCSZVDxfR4gLfE6GsN 71 | YFNd+LF7+NtAeJRuJceXIisj8mTQYg+esTF9QtWovdg7vHVPz8mmcsrG9shGr+G9 72 | iwwtCig+hAGtXFAuODRMur9QfPlP6FhJw0FX/36iJ2p6APZB0EGqn7LJ91EyOnWv 73 | iRimLLvlGFiVB9Xxw1TxnQMNj9jmB1CA4oNqlromO/AA0ryh13TpcIo5gbn6Jcdc 74 | fD4Rbj5k+2HhJTkQ78GpZ0q95P08XD2dlaM2QxxKQGqADJOdV2VgjB2NDXURkInq 75 | 6pdkcaRgAKme8b+xjCcVjLkBjQRj2s5gAQwAxmgflHInM8oKQnsXezG5etLmaUsS 76 | EkV5jjQFCShNn9zJEF/PWJk5Df/mbODj02wyc749dSJbRlTY3LgGz1AeywOsM1oQ 77 | XkhfRZZqMwqvfx8IkEPjMvGIv/UI9pqqg/TY7OiYLEDahYXHJDKmlnmCBlnU96cL 78 | yh7a/xY3ZC20/JwbFVAFzD4biWOrAm1YPpdKbqCPclpvRP9N6nb6hxvKKmDo7MqS 79 | uANZMaoqhvnGazt9n435GQkYRvtqmqmOvt8I4oCzV0Y39HfbCHhhy64HSIowKYE7 80 | YWIujJcfoIDQqq2378T631BxLEUPaoSOV4B8gk/Jbf3KVu4LNqJive7chR8F1C2k 81 | eeAKpaf2CSAe7OrbAfWysHRZ060bSJzRk3COEACk/UURY+RlIwh+LQxEKb1YQueS 82 | YGjxIjV1X7ScyOvam5CmqOd4do9psOS7MHcQNeUbhnjm0TyGT9DF8ELoE0NSYa+J 83 | PvDGHo51M33s31RUO4TtJnU5xSRb2sOKzIuBABEBAAGJAbYEGAEIACAWIQQQhX/9 84 | 0/kerld6IdZky7yBc9drPwUCY9rOYAIbDAAKCRBky7yBc9drP8ctC/9wGi01cBAW 85 | BPEKEnfrKdvlsaLeRxotriupDqGSWxqVxBVd+n0Xs0zPB/kuZFTkHOHpbAWkhPr+ 86 | hP+RJemxCKMCo7kT2FXVR1OYej8Vh+aYWZ5lw6dJGtgo3Ebib2VSKdasmIOI2CY/ 87 | 03G46jv05qK3fP6phz+RaX+9hHgh1XW9kKbdkX5lM9RQSZOof3/67IN8w+euy61O 88 | UhNcrsDKrp0kZxw3S+b/02oP1qADXHz2BUerkCZa4RVK1pM0UfRUooOHiEdUxKKM 89 | DE501hwQsMH7WuvlIR8Oc2UGkEtzgukhmhpQPSsVPg54y9US+LkpztM+yq+zRu33 90 | gAfssli0MvSmkbcTDD22PGbgPMseyYxfw7vuwmjdqvi9Z4jdln2gyZ6sSZdgUMYW 91 | PGEjZDoMzsZx9Zx6SO9XCS7XgYHVc8/B2LGSxj+rpZ6lBbywH88lNnrm/SpQB74U 92 | 4QVLffuw76FanTH6advqdWIqtlWPoAQcEkKf5CdmfT2ei2wX1QLatTs= 93 | =ZKPF 94 | -----END PGP PUBLIC KEY BLOCK----- 95 | ` 96 | 97 | const help = ` 98 | 99 | Sometimes problems occur due to network or server issues when 100 | downloading packages, in which case retrying your operation 101 | a bit later might lead to good results. 102 | 103 | To determine the nature of the issue, please review the 104 | saltstack.log file under /var/cache/remnux/cli in the 105 | subdirectory that matches the REMnux version you're installing. 106 | Search for the log file for "result: false" messages and look at 107 | the surrounding lines to diagnose the issue. 108 | 109 | For assistance go to https://github.com/REMnux/remnux-cli/issues 110 | 111 | ` 112 | 113 | let osVersion = null 114 | let osCodename = null 115 | let cachePath = '/var/cache/remnux/cli' 116 | let versionFile = '/etc/remnux-version' 117 | let configFile = '/etc/remnux-config' 118 | let releaseFile = '/etc/os-release' 119 | let remnuxConfiguration = {} 120 | 121 | const validModes = ['dedicated', 'addon','cloud'] 122 | let isModeSpecified = false 123 | 124 | const cli = docopt(doc) 125 | 126 | const github = new Octokit({ 127 | version: '3.0.0', 128 | validateCache: true, 129 | }) 130 | 131 | const error = (err) => { 132 | console.log('') 133 | console.log(err.message) 134 | console.log(err.stack) 135 | console.log(help) 136 | process.exit(1) 137 | } 138 | 139 | const setup = async () => { 140 | if (cli['--dev'] === true) { 141 | cachePath = '/tmp/var/cache/remnux' 142 | versionFile = '/tmp/remnux-version' 143 | configFile = '/tmp/remnux-config' 144 | } 145 | 146 | await mkdirp(cachePath) 147 | } 148 | 149 | const validOS = async () => { 150 | try { 151 | const contents = fs.readFileSync(releaseFile, 'utf8') 152 | 153 | if (contents.indexOf('UBUNTU_CODENAME=bionic') !== -1) { 154 | osVersion = '18.04' 155 | osCodename = 'bionic' 156 | return true 157 | } 158 | 159 | if (contents.indexOf('UBUNTU_CODENAME=focal') !== -1) { 160 | osVersion = '20.04' 161 | osCodename = 'focal' 162 | return true 163 | } 164 | 165 | throw new Error('Invalid OS or unable to determine Ubuntu version') 166 | } catch (err) { 167 | if (err && err.code === 'ENOENT') { 168 | throw new Error('invalid OS, missing ${releaseFile}') 169 | } 170 | 171 | throw err 172 | } 173 | } 174 | 175 | const checkOptions = () => { 176 | if (cli['--mode'] != null) { 177 | if (validModes.indexOf(cli['--mode']) === -1) { 178 | throw new Error(`${cli['--mode']} is not a valid install mode. Valid modes are: ${validModes.join(', ')}`) 179 | } 180 | else { 181 | isModeSpecified = true 182 | } 183 | } 184 | } 185 | 186 | const fileExists = (path) => { 187 | return new Promise((resolve, reject) => { 188 | fs.stat(path, (err, stats) => { 189 | if (err && err.code === 'ENOENT') { 190 | return resolve(false) 191 | } 192 | 193 | if (err) { 194 | return reject(err) 195 | } 196 | 197 | return resolve(true) 198 | }) 199 | }) 200 | } 201 | 202 | const saltCheckVersion = (path, value) => { 203 | return new Promise((resolve, reject) => { 204 | fs.readFile(path, 'utf8', (err, contents) => { 205 | if (err && err.code === 'ENOENT') { 206 | return resolve(false); 207 | } 208 | 209 | if (err) { 210 | return reject(err); 211 | } 212 | 213 | if (contents.indexOf(value) === 0) { 214 | return resolve(true); 215 | } 216 | 217 | return resolve(false); 218 | }) 219 | }) 220 | } 221 | 222 | const setupSalt = async () => { 223 | if (cli['--dev'] === false) { 224 | const baseUrl = 'https://packages.broadcom.com' 225 | const aptSourceList = '/etc/apt/sources.list.d/saltstack.list' 226 | const aptDebString = `deb [signed-by=/usr/share/keyrings/salt-archive-keyring.pgp arch=amd64] ${baseUrl}/artifactory/saltproject-deb/ stable main` 227 | 228 | const aptExists = await fileExists(aptSourceList) 229 | const saltExists = await fileExists('/usr/bin/salt-call') 230 | const saltVersionOk = await saltCheckVersion(aptSourceList, aptDebString) 231 | 232 | if (aptExists === true && saltVersionOk === false) { 233 | console.log('NOTICE: Fixing incorrect Saltstack version configuration.') 234 | console.log('Installing and configuring Saltstack properly ...') 235 | await child_process.execAsync('apt-get remove -y --allow-change-held-packages salt-common salt-minion') 236 | await child_process.execAsync('mkdir -p /usr/share/keyrings') 237 | await child_process.execAsync(`curl -fsSL -o /usr/share/keyrings/salt-archive-keyring.pgp https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public`) 238 | await fs.writeFileAsync(aptSourceList, `deb [signed-by=/usr/share/keyrings/salt-archive-keyring.pgp arch=amd64] ${baseUrl}/artifactory/saltproject-deb/ stable main`) 239 | await child_process.execAsync(`printf 'Package: salt-*\nPin: version 3006.*\nPin-Priority: 1001' > /etc/apt/preferences.d/salt-pin-1001`) 240 | await child_process.execAsync('apt-get update') 241 | await child_process.execAsync('apt-get install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --allow-change-held-packages salt-common', { 242 | env: { 243 | ...process.env, 244 | DEBIAN_FRONTEND: 'noninteractive', 245 | }, 246 | }) 247 | } else if (aptExists === false || saltExists === false) { 248 | console.log('Installing and configuring SaltStack properly ...') 249 | await child_process.execAsync('mkdir -p /usr/share/keyrings') 250 | await child_process.execAsync(`curl -fsSL -o /usr/share/keyrings/salt-archive-keyring.pgp https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public`) 251 | await fs.writeFileAsync(aptSourceList, `deb [signed-by=/usr/share/keyrings/salt-archive-keyring.pgp arch=amd64] ${baseUrl}/artifactory/saltproject-deb/ stable main`) 252 | await child_process.execAsync(`printf 'Package: salt-*\nPin: version 3006.*\nPin-Priority: 1001' > /etc/apt/preferences.d/salt-pin-1001`) 253 | await child_process.execAsync('apt-get update') 254 | await child_process.execAsync('apt-get install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --allow-change-held-packages salt-common', { 255 | env: { 256 | ...process.env, 257 | DEBIAN_FRONTEND: 'noninteractive', 258 | }, 259 | }) 260 | } 261 | } else { 262 | return new Promise((resolve, reject) => { 263 | resolve() 264 | }) 265 | } 266 | } 267 | 268 | const getCurrentVersion = () => { 269 | return fs.readFileAsync(versionFile) 270 | .catch((err) => { 271 | if (err.code === 'ENOENT') return 'notinstalled' 272 | if (err) throw err 273 | }) 274 | .then(contents => contents.toString().replace(/\n/g, '')) 275 | } 276 | 277 | const listReleases = () => { 278 | return github.repos.listReleases({ 279 | owner: 'REMnux', 280 | repo: 'salt-states' 281 | }) 282 | } 283 | 284 | const getValidReleases = async () => { 285 | const currentRelease = await getCurrentVersion() 286 | let releases = await listReleases() 287 | const realReleases = releases.data.filter(release => !Boolean(release.prerelease)).map(release => release.tag_name) 288 | const allReleases = releases.data.map(release => release.tag_name) 289 | 290 | if (currentRelease === 'notinstalled') { 291 | if (cli['--pre-release'] === true) { 292 | return allReleases 293 | } 294 | return realReleases 295 | } 296 | 297 | let curIndex = allReleases.indexOf(currentRelease) 298 | if (curIndex === 0) { 299 | return [allReleases[0]] 300 | } 301 | 302 | if (cli['--pre-release'] === true) { 303 | return allReleases.slice(0, curIndex) 304 | } 305 | 306 | return allReleases.slice(0, curIndex).filter((release) => { 307 | return realReleases.indexOf(release) !== -1 308 | }) 309 | } 310 | 311 | const getLatestRelease = () => { 312 | return getValidReleases().then(releases => releases[0]) 313 | } 314 | 315 | const isValidRelease = (version) => { 316 | return getValidReleases().then((releases) => { 317 | return new Promise((resolve, reject) => { 318 | if (releases.indexOf(version) === -1) { 319 | return resolve(false) 320 | } 321 | resolve(true) 322 | }) 323 | }) 324 | } 325 | 326 | const validateVersion = (version) => { 327 | return getValidReleases().then((releases) => { 328 | if (typeof releases.indexOf(version) === -1) { 329 | throw new Error('The version you are wanting to install/upgrade to is not valid.') 330 | } 331 | return new Promise((resolve) => { resolve() }) 332 | }) 333 | } 334 | 335 | const downloadReleaseFile = (version, filename) => { 336 | console.log(`>> downloading ${filename}`) 337 | 338 | const filepath = `${cachePath}/${version}/${filename}` 339 | 340 | if (fs.existsSync(filepath) && cli['--no-cache'] === false) { 341 | return new Promise((resolve) => { resolve() }) 342 | } 343 | 344 | return new Promise((resolve, reject) => { 345 | const output = fs.createWriteStream(filepath) 346 | const req = request.get(`https://github.com/REMnux/salt-states/releases/download/${version}/${filename}`) 347 | req.on('error', (err) => { 348 | reject(err) 349 | }) 350 | req 351 | .on('response', (res) => { 352 | if (res.statusCode !== 200) { 353 | throw new Error(res.body) 354 | } 355 | }) 356 | .pipe(output) 357 | .on('error', (err) => { 358 | reject(err) 359 | }) 360 | .on('close', resolve) 361 | }) 362 | } 363 | 364 | const downloadRelease = (version) => { 365 | console.log(`>> downloading remnux-salt-states-${version}.tar.gz`) 366 | 367 | const filepath = `${cachePath}/${version}/remnux-salt-states-${version}.tar.gz` 368 | 369 | if (fs.existsSync(filepath) && cli['--no-cache'] === false) { 370 | return new Promise((resolve, reject) => { resolve() }) 371 | } 372 | 373 | return new Promise((resolve, reject) => { 374 | const output = fs.createWriteStream(filepath) 375 | const req = request.get(`https://github.com/REMnux/salt-states/archive/${version}.tar.gz`) 376 | req.on('error', (err) => { 377 | reject(err) 378 | }) 379 | req 380 | .pipe(output) 381 | .on('error', (err) => { 382 | reject(err) 383 | }) 384 | .on('close', resolve) 385 | }) 386 | } 387 | 388 | const validateFile = async (version, filename) => { 389 | console.log(`> validating file ${filename}`) 390 | const expected = await fs.readFileAsync(`${cachePath}/${version}/${filename}.sha256`) 391 | 392 | const actual = await new Promise((resolve, reject) => { 393 | const shasum = crypto.createHash('sha256') 394 | fs.createReadStream(`${cachePath}/${version}/${filename}`) 395 | .on('error', (err) => { 396 | reject(err) 397 | }) 398 | .on('data', (data) => { 399 | shasum.update(data) 400 | }) 401 | .on('close', () => { 402 | resolve(`${shasum.digest('hex')} /tmp/${filename}\n`) 403 | }) 404 | }) 405 | 406 | if (expected.toString() !== actual) { 407 | throw new Error(`Hashes for ${filename} do not match. Expected: ${expected}. Actual: ${actual}.`) 408 | } 409 | } 410 | 411 | const validateSignature = async (version, filename) => { 412 | console.log(`> validating signature for ${filename}`) 413 | 414 | const filepath = `${cachePath}/${version}/${filename}` 415 | 416 | const ctMessage = await fs.readFileAsync(`${filepath}`, 'utf8') 417 | const ctSignature = await fs.readFileAsync(`${filepath}.asc`, 'utf8') 418 | const ctPubKey = pubKey 419 | 420 | const options = { 421 | message: await openpgp.cleartext.readArmored(ctSignature), 422 | publicKeys: (await openpgp.key.readArmored(ctPubKey)).keys 423 | } 424 | 425 | const valid = await openpgp.verify(options) 426 | 427 | if (typeof valid.signatures === 'undefined' && typeof valid.signatures[0] === 'undefined') { 428 | throw new Error('Invalid Signature') 429 | } 430 | 431 | if (valid.signatures[0].valid === false) { 432 | throw new Error('PGP Signature is not valid') 433 | } 434 | } 435 | 436 | const extractUpdate = (version, filename) => { 437 | const filepath = `${cachePath}/${version}/${filename}` 438 | 439 | return new Promise((resolve, reject) => { 440 | console.log(`> extracting update ${filename}`) 441 | 442 | let stdout = '' 443 | let stderr = '' 444 | const extract = spawn('tar', ['-z', '-x', '-f', filepath, '-C', `${cachePath}/${version}`]) 445 | extract.stdout.on('data', (data) => { 446 | stdout = `${stdout}${data}` 447 | console.log(data.toString()) 448 | }) 449 | extract.stderr.on('data', (data) => { 450 | stderr = `${stderr}${data}` 451 | console.log(data.toString()) 452 | }) 453 | extract.on('error', (err) => { 454 | reject(err) 455 | }) 456 | extract.on('close', (code) => { 457 | if (code !== 0) { 458 | return reject(new Error('Extraction returned exit code not zero')) 459 | } 460 | 461 | resolve() 462 | }) 463 | }) 464 | } 465 | 466 | const downloadUpdate = async (version) => { 467 | console.log(`> downloading ${version}`) 468 | 469 | await mkdirp(`${cachePath}/${version}`) 470 | await downloadReleaseFile(version, `remnux-salt-states-${version}.tar.gz.asc`) 471 | await downloadReleaseFile(version, `remnux-salt-states-${version}.tar.gz.sha256`) 472 | await downloadReleaseFile(version, `remnux-salt-states-${version}.tar.gz.sha256.asc`) 473 | await downloadRelease(version) 474 | await validateFile(version, `remnux-salt-states-${version}.tar.gz`) 475 | await validateSignature(version, `remnux-salt-states-${version}.tar.gz.sha256`) 476 | await extractUpdate(version, `remnux-salt-states-${version}.tar.gz`) 477 | } 478 | 479 | const performUpdate = (version) => { 480 | const filepath = `${cachePath}/${version}/salt-states-${version.replace('v', '')}` 481 | const outputFilepath = `${cachePath}/${version}/results.yml` 482 | const logFilepath = `${cachePath}/${version}/saltstack.log` 483 | 484 | const begRegex = /Running state \[(.*)\] at time (.*)/g 485 | const endRegex = /Completed state \[(.*)\] at time (.*) duration_in_ms=(.*)/g 486 | 487 | const stateApplyMap = { 488 | 'dedicated': 'remnux.dedicated', 489 | 'addon': 'remnux.addon', 490 | 'cloud': 'remnux.cloud' 491 | } 492 | 493 | if (!isModeSpecified) { 494 | let savedMode = remnuxConfiguration['mode'] 495 | if (validModes.indexOf(savedMode) != -1) { 496 | cli['--mode'] = savedMode 497 | console.log(`> using previous mode: ${cli['--mode']}`) 498 | } else { 499 | console.log(`> no previous REMnux version found; performing a new 'dedicated' installation.`) 500 | cli['--mode'] = "dedicated" 501 | } 502 | } 503 | 504 | return new Promise((resolve, reject) => { 505 | console.log(`> upgrading/updating to ${version}`) 506 | 507 | console.log(`>> Log file: ${logFilepath}`) 508 | 509 | if (os.platform() !== 'linux') { 510 | console.log(`>>> Platform is not Linux`) 511 | return process.exit(0) 512 | } 513 | 514 | let stdout = '' 515 | let stderr = '' 516 | 517 | const logFile = fs.createWriteStream(logFilepath) 518 | 519 | const updateArgs = [ 520 | '-l', 'debug', '--local', 521 | '--file-root', filepath, 522 | '--state-output=terse', 523 | '--out=yaml', 524 | 'state.apply', stateApplyMap[cli['--mode']], 525 | `pillar={remnux_user: "${remnuxConfiguration['user']}"}` 526 | ] 527 | 528 | const update = spawn('salt-call', updateArgs) 529 | 530 | update.stdout.pipe(fs.createWriteStream(outputFilepath)) 531 | update.stdout.pipe(logFile) 532 | 533 | update.stderr.pipe(logFile) 534 | update.stderr 535 | .pipe(split()) 536 | .on('data', (data) => { 537 | stderr = `${stderr}${data}` 538 | 539 | const begMatch = begRegex.exec(data) 540 | const endMatch = endRegex.exec(data) 541 | 542 | if (begMatch !== null) { 543 | process.stdout.write(`\n>> Running: ${begMatch[1]}\r`) 544 | } else if (endMatch !== null) { 545 | let message = `>> Completed: ${endMatch[1]} (Took: ${endMatch[3]} ms)` 546 | if (process.stdout.isTTY === true) { 547 | readline.clearLine(process.stdout, 0) 548 | readline.cursorTo(process.stdout, 0) 549 | } 550 | 551 | process.stdout.write(`${message}`) 552 | } 553 | }) 554 | 555 | update.on('error', (err) => { 556 | console.log(arguments) 557 | 558 | reject(err) 559 | }) 560 | update.on('close', (code) => { 561 | if (code !== 0) { 562 | return reject(new Error('Update returned exit code not zero')) 563 | } 564 | 565 | process.nextTick(resolve) 566 | }) 567 | }) 568 | } 569 | 570 | const summarizeResults = async (version) => { 571 | const outputFilepath = `${cachePath}/${version}/results.yml` 572 | const rawContents = await fs.readFileAsync(outputFilepath) 573 | let results = {} 574 | 575 | try { 576 | results = yaml.safeLoad(rawContents, { schema: PYTHON_SCHEMA }) 577 | } catch (err) { 578 | // TODO handle? 579 | } 580 | 581 | let success = 0 582 | let failure = 0 583 | let failures = []; 584 | 585 | Object.keys(results['local']).forEach((key) => { 586 | if (results['local'][key]['result'] === true) { 587 | success++ 588 | } else { 589 | failure++ 590 | failures.push(results['local'][key]) 591 | } 592 | }) 593 | 594 | if (failure > 0) { 595 | console.log(`\n\n>> Incomplete due to Failures -- Success: ${success}, Failure: ${failure}`) 596 | console.log(`\n>>>> List of Failures (first 10 only)`) 597 | console.log(`\n NOTE: First failure is generally the root cause.`) 598 | console.log(`\n IMPORTANT: If seeking assistance, include this information.\n`) 599 | failures.sort((a, b) => { 600 | return a['__run_num__'] - b['__run_num__'] 601 | }).slice(0, 10).forEach((key) => { 602 | console.log(` - ID: ${key['__id__']}`) 603 | console.log(` SLS: ${key['__sls__']}`) 604 | console.log(` Run#: ${key['__run_num__']}`) 605 | console.log(` Comment: ${key['comment']}`) 606 | }) 607 | 608 | return new Promise((resolve, reject) => { return resolve() }) 609 | } 610 | 611 | console.log(`\n\n>> COMPLETED SUCCESSFULLY! Success: ${success}, Failure: ${failure}`) 612 | console.log(`\n\n>> Please reboot to make sure all settings go into effect.`) 613 | } 614 | 615 | const saveConfiguration = (version) => { 616 | const config = { 617 | version: version, 618 | mode: cli['--mode'], 619 | user: cli['--user'] 620 | } 621 | 622 | return fs.writeFileAsync(configFile, yaml.safeDump(config)) 623 | } 624 | 625 | const loadConfiguration = async () => { 626 | try { 627 | return await fs.readFileAsync(configFile).then((c) => yaml.safeLoad(c)) 628 | } catch (err) { 629 | if (err.code === 'ENOENT') { 630 | return { 631 | mode: 'unknown', 632 | user: cli['--user'] 633 | } 634 | } 635 | 636 | throw err 637 | } 638 | } 639 | 640 | const run = async () => { 641 | if (cli['-v'] === true) { 642 | console.log(`Version: ${cfg.version}`) 643 | return process.exit(0) 644 | } 645 | 646 | console.log(`> remnux-cli@${cfg.version}`) 647 | 648 | if (cli['debug'] === true) { 649 | const config = await loadConfiguration() 650 | 651 | const debug = ` 652 | Version: ${cfg.version} 653 | User: ${currentUser} 654 | 655 | Config: 656 | ${yaml.safeDump(config)} 657 | ` 658 | console.log(debug) 659 | return process.exit(0) 660 | } 661 | 662 | if (currentUser === 'root') { 663 | console.log('Warning: You are running as root.') 664 | if (currentUser === cli['--user']) { 665 | console.log('Error: You cannot install as root without specifying the --user option.') 666 | console.log() 667 | console.log('The install user specified with --user must not be the root user.') 668 | return process.exit(5) 669 | } 670 | } 671 | 672 | checkOptions() 673 | 674 | await validOS() 675 | 676 | await setup() 677 | 678 | remnuxConfiguration = await loadConfiguration() 679 | 680 | const version = await getCurrentVersion() 681 | console.log(`> remnux-version: ${version}\n`) 682 | 683 | if (isModeSpecified) { 684 | console.log(`> mode: ${cli['--mode']}`) 685 | } 686 | 687 | if (cli['version'] === true) { 688 | return process.exit(0) 689 | } 690 | 691 | if (cli['list-upgrades'] === true) { 692 | const releases = await getValidReleases() 693 | const current = await getCurrentVersion() 694 | if (releases.length === 0 || releases[0] === current) { 695 | console.log('No upgrades available.') 696 | return process.exit(0) 697 | } 698 | 699 | console.log('> List of available releases') 700 | releases.forEach(release => console.log(` - ${release}`)) 701 | return process.exit(0) 702 | } 703 | 704 | if (!process.env.SUDO_USER && cli['--dev'] === false) { 705 | console.log('> Error! You must be root to execute this.') 706 | return process.exit(1) 707 | } 708 | 709 | await setupSalt() 710 | 711 | if (cli['update'] === true) { 712 | if (version === 'notinstalled') { 713 | throw new Error('REMnux is not installed, unable to update.') 714 | } 715 | 716 | await downloadUpdate(version) 717 | await performUpdate(version) 718 | await summarizeResults(version) 719 | } 720 | 721 | if (cli['install'] === true) { 722 | const currentVersion = await getCurrentVersion(versionFile) 723 | 724 | if (currentVersion !== 'notinstalled') { 725 | console.log('REMnux is already installed, please use the \"update\" or \"upgrade\" command.') 726 | return process.exit(0) 727 | } 728 | 729 | let versionToInstall = null 730 | if (cli['--version'] === 'latest') { 731 | versionToInstall = await getLatestRelease() 732 | } else { 733 | const validRelease = await isValidRelease(cli['--version']) 734 | 735 | if (validRelease === false) { 736 | console.log(`${cli['--version']} is not a REMnux valid release.`) 737 | return process.exit(5) 738 | } 739 | 740 | versionToInstall = cli['--version'] 741 | } 742 | 743 | if (versionToInstall === null) { 744 | throw new Error('versionToInstall was null, this should never happen.') 745 | } 746 | 747 | await validateVersion(versionToInstall) 748 | await downloadUpdate(versionToInstall) 749 | await performUpdate(versionToInstall) 750 | await summarizeResults(versionToInstall) 751 | await saveConfiguration(versionToInstall) 752 | } 753 | 754 | if (cli['upgrade'] === true) { 755 | const release = await getLatestRelease() 756 | const current = await getCurrentVersion() 757 | 758 | if (release === current || typeof release === 'undefined') { 759 | console.log('No upgrades available') 760 | process.exit(0) 761 | } 762 | 763 | await downloadUpdate(release) 764 | await performUpdate(release) 765 | await summarizeResults(release) 766 | } 767 | } 768 | 769 | const main = async () => { 770 | try { 771 | await run() 772 | } catch (err) { 773 | error(err) 774 | } 775 | } 776 | 777 | main() 778 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | "config:js-app", 5 | ":pinVersions", 6 | ":automergePatch", 7 | ":automergeMinor", 8 | ":assignee(lennzeltser)", 9 | ":reviewer(lennyzeltser)", 10 | ":label(kind/renovate)" 11 | ] 12 | } 13 | --------------------------------------------------------------------------------