├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── read-installed.js └── test ├── basic.js ├── cyclic-extraneous-peer-deps.js ├── depth-0.js ├── depth-1.js ├── dev.js ├── empty.js ├── extraneous-dev.js ├── extraneous.js ├── fixtures ├── extraneous-detected │ ├── node_modules │ │ ├── asdf │ │ │ └── package.json │ │ ├── bar │ │ │ ├── node_modules │ │ │ │ └── baz │ │ │ │ │ └── package.json │ │ │ └── package.json │ │ ├── foo │ │ │ └── package.json │ │ └── ghjk │ │ │ └── package.json │ └── package.json ├── extraneous-dev-dep │ ├── node_modules │ │ ├── d │ │ │ └── package.json │ │ └── x │ │ │ └── package.json │ └── package.json ├── grandparent-peer-dev │ └── package.json ├── grandparent-peer │ ├── node_modules │ │ ├── framework │ │ │ └── package.json │ │ └── plugin-wrapper │ │ │ ├── node_modules │ │ │ └── plugin │ │ │ │ └── package.json │ │ │ └── package.json │ └── package.json ├── issue-40 │ └── node_modules │ │ └── fake │ │ └── package.json ├── package.json └── peer-at-latest │ └── node_modules │ ├── debug │ └── package.json │ └── strong-task-emitter │ └── package.json ├── grandparent-peer-dev.js ├── grandparent-peer.js ├── issue-40.js ├── linked-dep-dev-deps-extraneous.js ├── noargs.js └── peer-dep-at-latest.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | .*.swp 3 | 4 | .DS_Store 5 | *~ 6 | .project 7 | .settings 8 | npm-debug.log 9 | coverage.html 10 | .idea 11 | lib-cov 12 | 13 | node_modules 14 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | before_install: 3 | - npm install -g npm@latest 4 | node_js: 5 | - "10" 6 | - "8" 7 | - "6" 8 | - "11" 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The ISC License 2 | 3 | Copyright (c) Isaac Z. Schlueter 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 10 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 11 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 12 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 14 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 | PERFORMANCE OF THIS SOFTWARE. 16 | 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # read-installed 2 | 3 | Read all the installed packages in a folder, and return a tree 4 | structure with all the data. 5 | 6 | npm uses this. 7 | 8 | ## 2.0.0 9 | 10 | Breaking changes in `2.0.0`: 11 | 12 | The second argument is now an `Object` that contains the following keys: 13 | 14 | * `depth` optional, defaults to Infinity 15 | * `log` optional log Function 16 | * `dev` optional, default false, set to true to include devDependencies 17 | 18 | ## Usage 19 | 20 | ```javascript 21 | var readInstalled = require("read-installed") 22 | // optional options 23 | var options = { dev: false, log: fn, depth: 2 } 24 | readInstalled(folder, options, function (er, data) { 25 | ... 26 | }) 27 | ``` 28 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "read-installed", 3 | "version": "4.0.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/generator": { 17 | "version": "7.3.2", 18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", 19 | "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/types": "^7.3.2", 23 | "jsesc": "^2.5.1", 24 | "lodash": "^4.17.10", 25 | "source-map": "^0.5.0", 26 | "trim-right": "^1.0.1" 27 | } 28 | }, 29 | "@babel/helper-function-name": { 30 | "version": "7.1.0", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", 32 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", 33 | "dev": true, 34 | "requires": { 35 | "@babel/helper-get-function-arity": "^7.0.0", 36 | "@babel/template": "^7.1.0", 37 | "@babel/types": "^7.0.0" 38 | } 39 | }, 40 | "@babel/helper-get-function-arity": { 41 | "version": "7.0.0", 42 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", 43 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", 44 | "dev": true, 45 | "requires": { 46 | "@babel/types": "^7.0.0" 47 | } 48 | }, 49 | "@babel/helper-split-export-declaration": { 50 | "version": "7.0.0", 51 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", 52 | "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", 53 | "dev": true, 54 | "requires": { 55 | "@babel/types": "^7.0.0" 56 | } 57 | }, 58 | "@babel/highlight": { 59 | "version": "7.0.0", 60 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 61 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 62 | "dev": true, 63 | "requires": { 64 | "chalk": "^2.0.0", 65 | "esutils": "^2.0.2", 66 | "js-tokens": "^4.0.0" 67 | } 68 | }, 69 | "@babel/parser": { 70 | "version": "7.3.2", 71 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", 72 | "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", 73 | "dev": true 74 | }, 75 | "@babel/template": { 76 | "version": "7.2.2", 77 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", 78 | "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", 79 | "dev": true, 80 | "requires": { 81 | "@babel/code-frame": "^7.0.0", 82 | "@babel/parser": "^7.2.2", 83 | "@babel/types": "^7.2.2" 84 | } 85 | }, 86 | "@babel/traverse": { 87 | "version": "7.2.3", 88 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", 89 | "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", 90 | "dev": true, 91 | "requires": { 92 | "@babel/code-frame": "^7.0.0", 93 | "@babel/generator": "^7.2.2", 94 | "@babel/helper-function-name": "^7.1.0", 95 | "@babel/helper-split-export-declaration": "^7.0.0", 96 | "@babel/parser": "^7.2.3", 97 | "@babel/types": "^7.2.2", 98 | "debug": "^4.1.0", 99 | "globals": "^11.1.0", 100 | "lodash": "^4.17.10" 101 | } 102 | }, 103 | "@babel/types": { 104 | "version": "7.3.2", 105 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", 106 | "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", 107 | "dev": true, 108 | "requires": { 109 | "esutils": "^2.0.2", 110 | "lodash": "^4.17.10", 111 | "to-fast-properties": "^2.0.0" 112 | } 113 | }, 114 | "ajv": { 115 | "version": "6.8.1", 116 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", 117 | "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", 118 | "dev": true, 119 | "requires": { 120 | "fast-deep-equal": "^2.0.1", 121 | "fast-json-stable-stringify": "^2.0.0", 122 | "json-schema-traverse": "^0.4.1", 123 | "uri-js": "^4.2.2" 124 | } 125 | }, 126 | "ansi-regex": { 127 | "version": "2.1.1", 128 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 129 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 130 | "dev": true 131 | }, 132 | "ansi-styles": { 133 | "version": "3.2.1", 134 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 135 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 136 | "dev": true, 137 | "requires": { 138 | "color-convert": "^1.9.0" 139 | } 140 | }, 141 | "arg": { 142 | "version": "4.1.0", 143 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", 144 | "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", 145 | "dev": true 146 | }, 147 | "argparse": { 148 | "version": "1.0.10", 149 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 150 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 151 | "dev": true, 152 | "requires": { 153 | "sprintf-js": "~1.0.2" 154 | } 155 | }, 156 | "asap": { 157 | "version": "2.0.6", 158 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 159 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 160 | }, 161 | "asn1": { 162 | "version": "0.2.4", 163 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 164 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 165 | "dev": true, 166 | "requires": { 167 | "safer-buffer": "~2.1.0" 168 | } 169 | }, 170 | "assert-plus": { 171 | "version": "1.0.0", 172 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 173 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 174 | "dev": true 175 | }, 176 | "asynckit": { 177 | "version": "0.4.0", 178 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 179 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 180 | "dev": true 181 | }, 182 | "aws-sign2": { 183 | "version": "0.7.0", 184 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 185 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 186 | "dev": true 187 | }, 188 | "aws4": { 189 | "version": "1.8.0", 190 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 191 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 192 | "dev": true 193 | }, 194 | "balanced-match": { 195 | "version": "1.0.0", 196 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 197 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 198 | }, 199 | "bcrypt-pbkdf": { 200 | "version": "1.0.2", 201 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 202 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 203 | "dev": true, 204 | "requires": { 205 | "tweetnacl": "^0.14.3" 206 | } 207 | }, 208 | "bind-obj-methods": { 209 | "version": "2.0.0", 210 | "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", 211 | "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", 212 | "dev": true 213 | }, 214 | "brace-expansion": { 215 | "version": "1.1.11", 216 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 217 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 218 | "requires": { 219 | "balanced-match": "^1.0.0", 220 | "concat-map": "0.0.1" 221 | } 222 | }, 223 | "browser-process-hrtime": { 224 | "version": "1.0.0", 225 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", 226 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", 227 | "dev": true 228 | }, 229 | "buffer-from": { 230 | "version": "1.1.1", 231 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 232 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 233 | "dev": true 234 | }, 235 | "capture-stack-trace": { 236 | "version": "1.0.1", 237 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 238 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", 239 | "dev": true 240 | }, 241 | "caseless": { 242 | "version": "0.12.0", 243 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 244 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 245 | "dev": true 246 | }, 247 | "chalk": { 248 | "version": "2.4.2", 249 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 250 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 251 | "dev": true, 252 | "requires": { 253 | "ansi-styles": "^3.2.1", 254 | "escape-string-regexp": "^1.0.5", 255 | "supports-color": "^5.3.0" 256 | } 257 | }, 258 | "clean-yaml-object": { 259 | "version": "0.1.0", 260 | "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", 261 | "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", 262 | "dev": true 263 | }, 264 | "color-convert": { 265 | "version": "1.9.3", 266 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 267 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 268 | "dev": true, 269 | "requires": { 270 | "color-name": "1.1.3" 271 | } 272 | }, 273 | "color-name": { 274 | "version": "1.1.3", 275 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 276 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 277 | "dev": true 278 | }, 279 | "color-support": { 280 | "version": "1.1.3", 281 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 282 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 283 | "dev": true 284 | }, 285 | "combined-stream": { 286 | "version": "1.0.7", 287 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 288 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 289 | "dev": true, 290 | "requires": { 291 | "delayed-stream": "~1.0.0" 292 | } 293 | }, 294 | "concat-map": { 295 | "version": "0.0.1", 296 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 297 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 298 | }, 299 | "core-util-is": { 300 | "version": "1.0.2", 301 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 302 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 303 | "dev": true 304 | }, 305 | "coveralls": { 306 | "version": "3.0.2", 307 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", 308 | "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", 309 | "dev": true, 310 | "requires": { 311 | "growl": "~> 1.10.0", 312 | "js-yaml": "^3.11.0", 313 | "lcov-parse": "^0.0.10", 314 | "log-driver": "^1.2.7", 315 | "minimist": "^1.2.0", 316 | "request": "^2.85.0" 317 | }, 318 | "dependencies": { 319 | "minimist": { 320 | "version": "1.2.0", 321 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 322 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 323 | "dev": true 324 | } 325 | } 326 | }, 327 | "cross-spawn": { 328 | "version": "4.0.2", 329 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 330 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", 331 | "dev": true, 332 | "requires": { 333 | "lru-cache": "^4.0.1", 334 | "which": "^1.2.9" 335 | } 336 | }, 337 | "dashdash": { 338 | "version": "1.14.1", 339 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 340 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 341 | "dev": true, 342 | "requires": { 343 | "assert-plus": "^1.0.0" 344 | } 345 | }, 346 | "debug": { 347 | "version": "4.1.1", 348 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 349 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 350 | "dev": true, 351 | "requires": { 352 | "ms": "^2.1.1" 353 | } 354 | }, 355 | "debuglog": { 356 | "version": "1.0.1", 357 | "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", 358 | "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" 359 | }, 360 | "delayed-stream": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 363 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 364 | "dev": true 365 | }, 366 | "dezalgo": { 367 | "version": "1.0.3", 368 | "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", 369 | "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", 370 | "requires": { 371 | "asap": "^2.0.0", 372 | "wrappy": "1" 373 | } 374 | }, 375 | "diff": { 376 | "version": "1.4.0", 377 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 378 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 379 | "dev": true 380 | }, 381 | "domain-browser": { 382 | "version": "1.2.0", 383 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 384 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 385 | "dev": true 386 | }, 387 | "ecc-jsbn": { 388 | "version": "0.1.2", 389 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 390 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 391 | "dev": true, 392 | "requires": { 393 | "jsbn": "~0.1.0", 394 | "safer-buffer": "^2.1.0" 395 | } 396 | }, 397 | "escape-string-regexp": { 398 | "version": "1.0.5", 399 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 400 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 401 | "dev": true 402 | }, 403 | "esm": { 404 | "version": "3.2.4", 405 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.4.tgz", 406 | "integrity": "sha512-wOuWtQCkkwD1WKQN/k3RsyGSSN+AmiUzdKftn8vaC+uV9JesYmQlODJxgXaaRz0LaaFIlUxZaUu5NPiUAjKAAA==", 407 | "dev": true 408 | }, 409 | "esprima": { 410 | "version": "4.0.1", 411 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 412 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 413 | "dev": true 414 | }, 415 | "esutils": { 416 | "version": "2.0.2", 417 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 418 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 419 | "dev": true 420 | }, 421 | "events-to-array": { 422 | "version": "1.1.2", 423 | "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", 424 | "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", 425 | "dev": true 426 | }, 427 | "extend": { 428 | "version": "3.0.2", 429 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 430 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 431 | "dev": true 432 | }, 433 | "extsprintf": { 434 | "version": "1.3.0", 435 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 436 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 437 | "dev": true 438 | }, 439 | "fast-deep-equal": { 440 | "version": "2.0.1", 441 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 442 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 443 | "dev": true 444 | }, 445 | "fast-json-stable-stringify": { 446 | "version": "2.0.0", 447 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 448 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 449 | "dev": true 450 | }, 451 | "foreground-child": { 452 | "version": "1.5.6", 453 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", 454 | "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", 455 | "dev": true, 456 | "requires": { 457 | "cross-spawn": "^4", 458 | "signal-exit": "^3.0.0" 459 | } 460 | }, 461 | "forever-agent": { 462 | "version": "0.6.1", 463 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 464 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 465 | "dev": true 466 | }, 467 | "form-data": { 468 | "version": "2.3.3", 469 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 470 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 471 | "dev": true, 472 | "requires": { 473 | "asynckit": "^0.4.0", 474 | "combined-stream": "^1.0.6", 475 | "mime-types": "^2.1.12" 476 | } 477 | }, 478 | "fs-exists-cached": { 479 | "version": "1.0.0", 480 | "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", 481 | "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", 482 | "dev": true 483 | }, 484 | "fs.realpath": { 485 | "version": "1.0.0", 486 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 487 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 488 | }, 489 | "function-loop": { 490 | "version": "1.0.1", 491 | "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", 492 | "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", 493 | "dev": true 494 | }, 495 | "getpass": { 496 | "version": "0.1.7", 497 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 498 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 499 | "dev": true, 500 | "requires": { 501 | "assert-plus": "^1.0.0" 502 | } 503 | }, 504 | "glob": { 505 | "version": "7.1.3", 506 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 507 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 508 | "requires": { 509 | "fs.realpath": "^1.0.0", 510 | "inflight": "^1.0.4", 511 | "inherits": "2", 512 | "minimatch": "^3.0.4", 513 | "once": "^1.3.0", 514 | "path-is-absolute": "^1.0.0" 515 | } 516 | }, 517 | "globals": { 518 | "version": "11.10.0", 519 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", 520 | "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", 521 | "dev": true 522 | }, 523 | "graceful-fs": { 524 | "version": "4.1.15", 525 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 526 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 527 | }, 528 | "growl": { 529 | "version": "1.10.5", 530 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 531 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 532 | "dev": true 533 | }, 534 | "har-schema": { 535 | "version": "2.0.0", 536 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 537 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 538 | "dev": true 539 | }, 540 | "har-validator": { 541 | "version": "5.1.3", 542 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 543 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 544 | "dev": true, 545 | "requires": { 546 | "ajv": "^6.5.5", 547 | "har-schema": "^2.0.0" 548 | } 549 | }, 550 | "has-flag": { 551 | "version": "3.0.0", 552 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 553 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 554 | "dev": true 555 | }, 556 | "hosted-git-info": { 557 | "version": "2.7.1", 558 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 559 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 560 | }, 561 | "http-signature": { 562 | "version": "1.2.0", 563 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 564 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 565 | "dev": true, 566 | "requires": { 567 | "assert-plus": "^1.0.0", 568 | "jsprim": "^1.2.2", 569 | "sshpk": "^1.7.0" 570 | } 571 | }, 572 | "imurmurhash": { 573 | "version": "0.1.4", 574 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 575 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 576 | "dev": true 577 | }, 578 | "inflight": { 579 | "version": "1.0.6", 580 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 581 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 582 | "requires": { 583 | "once": "^1.3.0", 584 | "wrappy": "1" 585 | } 586 | }, 587 | "inherits": { 588 | "version": "2.0.3", 589 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 590 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 591 | }, 592 | "is-typedarray": { 593 | "version": "1.0.0", 594 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 595 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 596 | "dev": true 597 | }, 598 | "isarray": { 599 | "version": "1.0.0", 600 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 601 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 602 | "dev": true, 603 | "optional": true 604 | }, 605 | "isexe": { 606 | "version": "2.0.0", 607 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 608 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 609 | "dev": true 610 | }, 611 | "isstream": { 612 | "version": "0.1.2", 613 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 614 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 615 | "dev": true 616 | }, 617 | "istanbul-lib-coverage": { 618 | "version": "2.0.3", 619 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", 620 | "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", 621 | "dev": true 622 | }, 623 | "istanbul-lib-instrument": { 624 | "version": "3.1.0", 625 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", 626 | "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", 627 | "dev": true, 628 | "requires": { 629 | "@babel/generator": "^7.0.0", 630 | "@babel/parser": "^7.0.0", 631 | "@babel/template": "^7.0.0", 632 | "@babel/traverse": "^7.0.0", 633 | "@babel/types": "^7.0.0", 634 | "istanbul-lib-coverage": "^2.0.3", 635 | "semver": "^5.5.0" 636 | } 637 | }, 638 | "js-tokens": { 639 | "version": "4.0.0", 640 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 641 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 642 | "dev": true 643 | }, 644 | "js-yaml": { 645 | "version": "3.12.1", 646 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", 647 | "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", 648 | "dev": true, 649 | "requires": { 650 | "argparse": "^1.0.7", 651 | "esprima": "^4.0.0" 652 | } 653 | }, 654 | "jsbn": { 655 | "version": "0.1.1", 656 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 657 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 658 | "dev": true 659 | }, 660 | "jsesc": { 661 | "version": "2.5.2", 662 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 663 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 664 | "dev": true 665 | }, 666 | "json-parse-better-errors": { 667 | "version": "1.0.2", 668 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 669 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 670 | }, 671 | "json-schema": { 672 | "version": "0.2.3", 673 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 674 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 675 | "dev": true 676 | }, 677 | "json-schema-traverse": { 678 | "version": "0.4.1", 679 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 680 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 681 | "dev": true 682 | }, 683 | "json-stringify-safe": { 684 | "version": "5.0.1", 685 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 686 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 687 | "dev": true 688 | }, 689 | "jsprim": { 690 | "version": "1.4.1", 691 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 692 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 693 | "dev": true, 694 | "requires": { 695 | "assert-plus": "1.0.0", 696 | "extsprintf": "1.3.0", 697 | "json-schema": "0.2.3", 698 | "verror": "1.10.0" 699 | } 700 | }, 701 | "lcov-parse": { 702 | "version": "0.0.10", 703 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 704 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 705 | "dev": true 706 | }, 707 | "lodash": { 708 | "version": "4.17.11", 709 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 710 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 711 | "dev": true 712 | }, 713 | "log-driver": { 714 | "version": "1.2.7", 715 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", 716 | "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", 717 | "dev": true 718 | }, 719 | "lru-cache": { 720 | "version": "4.1.5", 721 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 722 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 723 | "dev": true, 724 | "requires": { 725 | "pseudomap": "^1.0.2", 726 | "yallist": "^2.1.2" 727 | } 728 | }, 729 | "make-error": { 730 | "version": "1.3.5", 731 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 732 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 733 | "dev": true 734 | }, 735 | "mime-db": { 736 | "version": "1.37.0", 737 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 738 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 739 | "dev": true 740 | }, 741 | "mime-types": { 742 | "version": "2.1.21", 743 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 744 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 745 | "dev": true, 746 | "requires": { 747 | "mime-db": "~1.37.0" 748 | } 749 | }, 750 | "minimatch": { 751 | "version": "3.0.4", 752 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 753 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 754 | "requires": { 755 | "brace-expansion": "^1.1.7" 756 | } 757 | }, 758 | "minimist": { 759 | "version": "0.0.8", 760 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 761 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 762 | "dev": true 763 | }, 764 | "minipass": { 765 | "version": "2.3.5", 766 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", 767 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", 768 | "dev": true, 769 | "requires": { 770 | "safe-buffer": "^5.1.2", 771 | "yallist": "^3.0.0" 772 | }, 773 | "dependencies": { 774 | "yallist": { 775 | "version": "3.0.3", 776 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 777 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", 778 | "dev": true 779 | } 780 | } 781 | }, 782 | "mkdirp": { 783 | "version": "0.5.1", 784 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 785 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 786 | "dev": true, 787 | "requires": { 788 | "minimist": "0.0.8" 789 | } 790 | }, 791 | "ms": { 792 | "version": "2.1.1", 793 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 794 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 795 | "dev": true 796 | }, 797 | "normalize-package-data": { 798 | "version": "2.5.0", 799 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 800 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 801 | "requires": { 802 | "hosted-git-info": "^2.1.4", 803 | "resolve": "^1.10.0", 804 | "semver": "2 || 3 || 4 || 5", 805 | "validate-npm-package-license": "^3.0.1" 806 | } 807 | }, 808 | "nyc": { 809 | "version": "13.2.0", 810 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.2.0.tgz", 811 | "integrity": "sha512-gQBlOqvfpYt9b2PZ7qElrHWt8x4y8ApNfbMBoDPdl3sY4/4RJwCxDGTSqhA9RnaguZjS5nW7taW8oToe86JLgQ==", 812 | "dev": true, 813 | "requires": { 814 | "archy": "^1.0.0", 815 | "arrify": "^1.0.1", 816 | "caching-transform": "^3.0.1", 817 | "convert-source-map": "^1.6.0", 818 | "find-cache-dir": "^2.0.0", 819 | "find-up": "^3.0.0", 820 | "foreground-child": "^1.5.6", 821 | "glob": "^7.1.3", 822 | "istanbul-lib-coverage": "^2.0.3", 823 | "istanbul-lib-hook": "^2.0.3", 824 | "istanbul-lib-instrument": "^3.0.1", 825 | "istanbul-lib-report": "^2.0.4", 826 | "istanbul-lib-source-maps": "^3.0.2", 827 | "istanbul-reports": "^2.1.0", 828 | "make-dir": "^1.3.0", 829 | "merge-source-map": "^1.1.0", 830 | "resolve-from": "^4.0.0", 831 | "rimraf": "^2.6.3", 832 | "signal-exit": "^3.0.2", 833 | "spawn-wrap": "^1.4.2", 834 | "test-exclude": "^5.1.0", 835 | "uuid": "^3.3.2", 836 | "yargs": "^12.0.5", 837 | "yargs-parser": "^11.1.1" 838 | }, 839 | "dependencies": { 840 | "ansi-regex": { 841 | "version": "3.0.0", 842 | "bundled": true, 843 | "dev": true 844 | }, 845 | "append-transform": { 846 | "version": "1.0.0", 847 | "bundled": true, 848 | "dev": true, 849 | "requires": { 850 | "default-require-extensions": "^2.0.0" 851 | } 852 | }, 853 | "archy": { 854 | "version": "1.0.0", 855 | "bundled": true, 856 | "dev": true 857 | }, 858 | "arrify": { 859 | "version": "1.0.1", 860 | "bundled": true, 861 | "dev": true 862 | }, 863 | "async": { 864 | "version": "2.6.1", 865 | "bundled": true, 866 | "dev": true, 867 | "requires": { 868 | "lodash": "^4.17.10" 869 | } 870 | }, 871 | "balanced-match": { 872 | "version": "1.0.0", 873 | "bundled": true, 874 | "dev": true 875 | }, 876 | "brace-expansion": { 877 | "version": "1.1.11", 878 | "bundled": true, 879 | "dev": true, 880 | "requires": { 881 | "balanced-match": "^1.0.0", 882 | "concat-map": "0.0.1" 883 | } 884 | }, 885 | "builtin-modules": { 886 | "version": "1.1.1", 887 | "bundled": true, 888 | "dev": true 889 | }, 890 | "caching-transform": { 891 | "version": "3.0.1", 892 | "bundled": true, 893 | "dev": true, 894 | "requires": { 895 | "hasha": "^3.0.0", 896 | "make-dir": "^1.3.0", 897 | "package-hash": "^3.0.0", 898 | "write-file-atomic": "^2.3.0" 899 | } 900 | }, 901 | "camelcase": { 902 | "version": "5.0.0", 903 | "bundled": true, 904 | "dev": true 905 | }, 906 | "cliui": { 907 | "version": "4.1.0", 908 | "bundled": true, 909 | "dev": true, 910 | "requires": { 911 | "string-width": "^2.1.1", 912 | "strip-ansi": "^4.0.0", 913 | "wrap-ansi": "^2.0.0" 914 | } 915 | }, 916 | "code-point-at": { 917 | "version": "1.1.0", 918 | "bundled": true, 919 | "dev": true 920 | }, 921 | "commander": { 922 | "version": "2.17.1", 923 | "bundled": true, 924 | "dev": true, 925 | "optional": true 926 | }, 927 | "commondir": { 928 | "version": "1.0.1", 929 | "bundled": true, 930 | "dev": true 931 | }, 932 | "concat-map": { 933 | "version": "0.0.1", 934 | "bundled": true, 935 | "dev": true 936 | }, 937 | "convert-source-map": { 938 | "version": "1.6.0", 939 | "bundled": true, 940 | "dev": true, 941 | "requires": { 942 | "safe-buffer": "~5.1.1" 943 | } 944 | }, 945 | "cross-spawn": { 946 | "version": "4.0.2", 947 | "bundled": true, 948 | "dev": true, 949 | "requires": { 950 | "lru-cache": "^4.0.1", 951 | "which": "^1.2.9" 952 | } 953 | }, 954 | "debug": { 955 | "version": "4.1.1", 956 | "bundled": true, 957 | "dev": true, 958 | "requires": { 959 | "ms": "^2.1.1" 960 | } 961 | }, 962 | "decamelize": { 963 | "version": "1.2.0", 964 | "bundled": true, 965 | "dev": true 966 | }, 967 | "default-require-extensions": { 968 | "version": "2.0.0", 969 | "bundled": true, 970 | "dev": true, 971 | "requires": { 972 | "strip-bom": "^3.0.0" 973 | } 974 | }, 975 | "end-of-stream": { 976 | "version": "1.4.1", 977 | "bundled": true, 978 | "dev": true, 979 | "requires": { 980 | "once": "^1.4.0" 981 | } 982 | }, 983 | "error-ex": { 984 | "version": "1.3.2", 985 | "bundled": true, 986 | "dev": true, 987 | "requires": { 988 | "is-arrayish": "^0.2.1" 989 | } 990 | }, 991 | "es6-error": { 992 | "version": "4.1.1", 993 | "bundled": true, 994 | "dev": true 995 | }, 996 | "execa": { 997 | "version": "1.0.0", 998 | "bundled": true, 999 | "dev": true, 1000 | "requires": { 1001 | "cross-spawn": "^6.0.0", 1002 | "get-stream": "^4.0.0", 1003 | "is-stream": "^1.1.0", 1004 | "npm-run-path": "^2.0.0", 1005 | "p-finally": "^1.0.0", 1006 | "signal-exit": "^3.0.0", 1007 | "strip-eof": "^1.0.0" 1008 | }, 1009 | "dependencies": { 1010 | "cross-spawn": { 1011 | "version": "6.0.5", 1012 | "bundled": true, 1013 | "dev": true, 1014 | "requires": { 1015 | "nice-try": "^1.0.4", 1016 | "path-key": "^2.0.1", 1017 | "semver": "^5.5.0", 1018 | "shebang-command": "^1.2.0", 1019 | "which": "^1.2.9" 1020 | } 1021 | } 1022 | } 1023 | }, 1024 | "find-cache-dir": { 1025 | "version": "2.0.0", 1026 | "bundled": true, 1027 | "dev": true, 1028 | "requires": { 1029 | "commondir": "^1.0.1", 1030 | "make-dir": "^1.0.0", 1031 | "pkg-dir": "^3.0.0" 1032 | } 1033 | }, 1034 | "find-up": { 1035 | "version": "3.0.0", 1036 | "bundled": true, 1037 | "dev": true, 1038 | "requires": { 1039 | "locate-path": "^3.0.0" 1040 | } 1041 | }, 1042 | "foreground-child": { 1043 | "version": "1.5.6", 1044 | "bundled": true, 1045 | "dev": true, 1046 | "requires": { 1047 | "cross-spawn": "^4", 1048 | "signal-exit": "^3.0.0" 1049 | } 1050 | }, 1051 | "fs.realpath": { 1052 | "version": "1.0.0", 1053 | "bundled": true, 1054 | "dev": true 1055 | }, 1056 | "get-caller-file": { 1057 | "version": "1.0.3", 1058 | "bundled": true, 1059 | "dev": true 1060 | }, 1061 | "get-stream": { 1062 | "version": "4.1.0", 1063 | "bundled": true, 1064 | "dev": true, 1065 | "requires": { 1066 | "pump": "^3.0.0" 1067 | } 1068 | }, 1069 | "glob": { 1070 | "version": "7.1.3", 1071 | "bundled": true, 1072 | "dev": true, 1073 | "requires": { 1074 | "fs.realpath": "^1.0.0", 1075 | "inflight": "^1.0.4", 1076 | "inherits": "2", 1077 | "minimatch": "^3.0.4", 1078 | "once": "^1.3.0", 1079 | "path-is-absolute": "^1.0.0" 1080 | } 1081 | }, 1082 | "graceful-fs": { 1083 | "version": "4.1.15", 1084 | "bundled": true, 1085 | "dev": true 1086 | }, 1087 | "handlebars": { 1088 | "version": "4.0.12", 1089 | "bundled": true, 1090 | "dev": true, 1091 | "requires": { 1092 | "async": "^2.5.0", 1093 | "optimist": "^0.6.1", 1094 | "source-map": "^0.6.1", 1095 | "uglify-js": "^3.1.4" 1096 | }, 1097 | "dependencies": { 1098 | "source-map": { 1099 | "version": "0.6.1", 1100 | "bundled": true, 1101 | "dev": true 1102 | } 1103 | } 1104 | }, 1105 | "has-flag": { 1106 | "version": "3.0.0", 1107 | "bundled": true, 1108 | "dev": true 1109 | }, 1110 | "hasha": { 1111 | "version": "3.0.0", 1112 | "bundled": true, 1113 | "dev": true, 1114 | "requires": { 1115 | "is-stream": "^1.0.1" 1116 | } 1117 | }, 1118 | "hosted-git-info": { 1119 | "version": "2.7.1", 1120 | "bundled": true, 1121 | "dev": true 1122 | }, 1123 | "imurmurhash": { 1124 | "version": "0.1.4", 1125 | "bundled": true, 1126 | "dev": true 1127 | }, 1128 | "inflight": { 1129 | "version": "1.0.6", 1130 | "bundled": true, 1131 | "dev": true, 1132 | "requires": { 1133 | "once": "^1.3.0", 1134 | "wrappy": "1" 1135 | } 1136 | }, 1137 | "inherits": { 1138 | "version": "2.0.3", 1139 | "bundled": true, 1140 | "dev": true 1141 | }, 1142 | "invert-kv": { 1143 | "version": "2.0.0", 1144 | "bundled": true, 1145 | "dev": true 1146 | }, 1147 | "is-arrayish": { 1148 | "version": "0.2.1", 1149 | "bundled": true, 1150 | "dev": true 1151 | }, 1152 | "is-builtin-module": { 1153 | "version": "1.0.0", 1154 | "bundled": true, 1155 | "dev": true, 1156 | "requires": { 1157 | "builtin-modules": "^1.0.0" 1158 | } 1159 | }, 1160 | "is-fullwidth-code-point": { 1161 | "version": "2.0.0", 1162 | "bundled": true, 1163 | "dev": true 1164 | }, 1165 | "is-stream": { 1166 | "version": "1.1.0", 1167 | "bundled": true, 1168 | "dev": true 1169 | }, 1170 | "isexe": { 1171 | "version": "2.0.0", 1172 | "bundled": true, 1173 | "dev": true 1174 | }, 1175 | "istanbul-lib-coverage": { 1176 | "version": "2.0.3", 1177 | "bundled": true, 1178 | "dev": true 1179 | }, 1180 | "istanbul-lib-hook": { 1181 | "version": "2.0.3", 1182 | "bundled": true, 1183 | "dev": true, 1184 | "requires": { 1185 | "append-transform": "^1.0.0" 1186 | } 1187 | }, 1188 | "istanbul-lib-report": { 1189 | "version": "2.0.4", 1190 | "bundled": true, 1191 | "dev": true, 1192 | "requires": { 1193 | "istanbul-lib-coverage": "^2.0.3", 1194 | "make-dir": "^1.3.0", 1195 | "supports-color": "^6.0.0" 1196 | }, 1197 | "dependencies": { 1198 | "supports-color": { 1199 | "version": "6.1.0", 1200 | "bundled": true, 1201 | "dev": true, 1202 | "requires": { 1203 | "has-flag": "^3.0.0" 1204 | } 1205 | } 1206 | } 1207 | }, 1208 | "istanbul-lib-source-maps": { 1209 | "version": "3.0.2", 1210 | "bundled": true, 1211 | "dev": true, 1212 | "requires": { 1213 | "debug": "^4.1.1", 1214 | "istanbul-lib-coverage": "^2.0.3", 1215 | "make-dir": "^1.3.0", 1216 | "rimraf": "^2.6.2", 1217 | "source-map": "^0.6.1" 1218 | }, 1219 | "dependencies": { 1220 | "source-map": { 1221 | "version": "0.6.1", 1222 | "bundled": true, 1223 | "dev": true 1224 | } 1225 | } 1226 | }, 1227 | "istanbul-reports": { 1228 | "version": "2.1.0", 1229 | "bundled": true, 1230 | "dev": true, 1231 | "requires": { 1232 | "handlebars": "^4.0.11" 1233 | } 1234 | }, 1235 | "json-parse-better-errors": { 1236 | "version": "1.0.2", 1237 | "bundled": true, 1238 | "dev": true 1239 | }, 1240 | "lcid": { 1241 | "version": "2.0.0", 1242 | "bundled": true, 1243 | "dev": true, 1244 | "requires": { 1245 | "invert-kv": "^2.0.0" 1246 | } 1247 | }, 1248 | "load-json-file": { 1249 | "version": "4.0.0", 1250 | "bundled": true, 1251 | "dev": true, 1252 | "requires": { 1253 | "graceful-fs": "^4.1.2", 1254 | "parse-json": "^4.0.0", 1255 | "pify": "^3.0.0", 1256 | "strip-bom": "^3.0.0" 1257 | } 1258 | }, 1259 | "locate-path": { 1260 | "version": "3.0.0", 1261 | "bundled": true, 1262 | "dev": true, 1263 | "requires": { 1264 | "p-locate": "^3.0.0", 1265 | "path-exists": "^3.0.0" 1266 | } 1267 | }, 1268 | "lodash": { 1269 | "version": "4.17.11", 1270 | "bundled": true, 1271 | "dev": true 1272 | }, 1273 | "lodash.flattendeep": { 1274 | "version": "4.4.0", 1275 | "bundled": true, 1276 | "dev": true 1277 | }, 1278 | "lru-cache": { 1279 | "version": "4.1.5", 1280 | "bundled": true, 1281 | "dev": true, 1282 | "requires": { 1283 | "pseudomap": "^1.0.2", 1284 | "yallist": "^2.1.2" 1285 | } 1286 | }, 1287 | "make-dir": { 1288 | "version": "1.3.0", 1289 | "bundled": true, 1290 | "dev": true, 1291 | "requires": { 1292 | "pify": "^3.0.0" 1293 | } 1294 | }, 1295 | "map-age-cleaner": { 1296 | "version": "0.1.3", 1297 | "bundled": true, 1298 | "dev": true, 1299 | "requires": { 1300 | "p-defer": "^1.0.0" 1301 | } 1302 | }, 1303 | "mem": { 1304 | "version": "4.0.0", 1305 | "bundled": true, 1306 | "dev": true, 1307 | "requires": { 1308 | "map-age-cleaner": "^0.1.1", 1309 | "mimic-fn": "^1.0.0", 1310 | "p-is-promise": "^1.1.0" 1311 | } 1312 | }, 1313 | "merge-source-map": { 1314 | "version": "1.1.0", 1315 | "bundled": true, 1316 | "dev": true, 1317 | "requires": { 1318 | "source-map": "^0.6.1" 1319 | }, 1320 | "dependencies": { 1321 | "source-map": { 1322 | "version": "0.6.1", 1323 | "bundled": true, 1324 | "dev": true 1325 | } 1326 | } 1327 | }, 1328 | "mimic-fn": { 1329 | "version": "1.2.0", 1330 | "bundled": true, 1331 | "dev": true 1332 | }, 1333 | "minimatch": { 1334 | "version": "3.0.4", 1335 | "bundled": true, 1336 | "dev": true, 1337 | "requires": { 1338 | "brace-expansion": "^1.1.7" 1339 | } 1340 | }, 1341 | "minimist": { 1342 | "version": "0.0.10", 1343 | "bundled": true, 1344 | "dev": true 1345 | }, 1346 | "mkdirp": { 1347 | "version": "0.5.1", 1348 | "bundled": true, 1349 | "dev": true, 1350 | "requires": { 1351 | "minimist": "0.0.8" 1352 | }, 1353 | "dependencies": { 1354 | "minimist": { 1355 | "version": "0.0.8", 1356 | "bundled": true, 1357 | "dev": true 1358 | } 1359 | } 1360 | }, 1361 | "ms": { 1362 | "version": "2.1.1", 1363 | "bundled": true, 1364 | "dev": true 1365 | }, 1366 | "nice-try": { 1367 | "version": "1.0.5", 1368 | "bundled": true, 1369 | "dev": true 1370 | }, 1371 | "normalize-package-data": { 1372 | "version": "2.4.0", 1373 | "bundled": true, 1374 | "dev": true, 1375 | "requires": { 1376 | "hosted-git-info": "^2.1.4", 1377 | "is-builtin-module": "^1.0.0", 1378 | "semver": "2 || 3 || 4 || 5", 1379 | "validate-npm-package-license": "^3.0.1" 1380 | } 1381 | }, 1382 | "npm-run-path": { 1383 | "version": "2.0.2", 1384 | "bundled": true, 1385 | "dev": true, 1386 | "requires": { 1387 | "path-key": "^2.0.0" 1388 | } 1389 | }, 1390 | "number-is-nan": { 1391 | "version": "1.0.1", 1392 | "bundled": true, 1393 | "dev": true 1394 | }, 1395 | "once": { 1396 | "version": "1.4.0", 1397 | "bundled": true, 1398 | "dev": true, 1399 | "requires": { 1400 | "wrappy": "1" 1401 | } 1402 | }, 1403 | "optimist": { 1404 | "version": "0.6.1", 1405 | "bundled": true, 1406 | "dev": true, 1407 | "requires": { 1408 | "minimist": "~0.0.1", 1409 | "wordwrap": "~0.0.2" 1410 | } 1411 | }, 1412 | "os-homedir": { 1413 | "version": "1.0.2", 1414 | "bundled": true, 1415 | "dev": true 1416 | }, 1417 | "os-locale": { 1418 | "version": "3.1.0", 1419 | "bundled": true, 1420 | "dev": true, 1421 | "requires": { 1422 | "execa": "^1.0.0", 1423 | "lcid": "^2.0.0", 1424 | "mem": "^4.0.0" 1425 | } 1426 | }, 1427 | "p-defer": { 1428 | "version": "1.0.0", 1429 | "bundled": true, 1430 | "dev": true 1431 | }, 1432 | "p-finally": { 1433 | "version": "1.0.0", 1434 | "bundled": true, 1435 | "dev": true 1436 | }, 1437 | "p-is-promise": { 1438 | "version": "1.1.0", 1439 | "bundled": true, 1440 | "dev": true 1441 | }, 1442 | "p-limit": { 1443 | "version": "2.1.0", 1444 | "bundled": true, 1445 | "dev": true, 1446 | "requires": { 1447 | "p-try": "^2.0.0" 1448 | } 1449 | }, 1450 | "p-locate": { 1451 | "version": "3.0.0", 1452 | "bundled": true, 1453 | "dev": true, 1454 | "requires": { 1455 | "p-limit": "^2.0.0" 1456 | } 1457 | }, 1458 | "p-try": { 1459 | "version": "2.0.0", 1460 | "bundled": true, 1461 | "dev": true 1462 | }, 1463 | "package-hash": { 1464 | "version": "3.0.0", 1465 | "bundled": true, 1466 | "dev": true, 1467 | "requires": { 1468 | "graceful-fs": "^4.1.15", 1469 | "hasha": "^3.0.0", 1470 | "lodash.flattendeep": "^4.4.0", 1471 | "release-zalgo": "^1.0.0" 1472 | } 1473 | }, 1474 | "parse-json": { 1475 | "version": "4.0.0", 1476 | "bundled": true, 1477 | "dev": true, 1478 | "requires": { 1479 | "error-ex": "^1.3.1", 1480 | "json-parse-better-errors": "^1.0.1" 1481 | } 1482 | }, 1483 | "path-exists": { 1484 | "version": "3.0.0", 1485 | "bundled": true, 1486 | "dev": true 1487 | }, 1488 | "path-is-absolute": { 1489 | "version": "1.0.1", 1490 | "bundled": true, 1491 | "dev": true 1492 | }, 1493 | "path-key": { 1494 | "version": "2.0.1", 1495 | "bundled": true, 1496 | "dev": true 1497 | }, 1498 | "path-type": { 1499 | "version": "3.0.0", 1500 | "bundled": true, 1501 | "dev": true, 1502 | "requires": { 1503 | "pify": "^3.0.0" 1504 | } 1505 | }, 1506 | "pify": { 1507 | "version": "3.0.0", 1508 | "bundled": true, 1509 | "dev": true 1510 | }, 1511 | "pkg-dir": { 1512 | "version": "3.0.0", 1513 | "bundled": true, 1514 | "dev": true, 1515 | "requires": { 1516 | "find-up": "^3.0.0" 1517 | } 1518 | }, 1519 | "pseudomap": { 1520 | "version": "1.0.2", 1521 | "bundled": true, 1522 | "dev": true 1523 | }, 1524 | "pump": { 1525 | "version": "3.0.0", 1526 | "bundled": true, 1527 | "dev": true, 1528 | "requires": { 1529 | "end-of-stream": "^1.1.0", 1530 | "once": "^1.3.1" 1531 | } 1532 | }, 1533 | "read-pkg": { 1534 | "version": "3.0.0", 1535 | "bundled": true, 1536 | "dev": true, 1537 | "requires": { 1538 | "load-json-file": "^4.0.0", 1539 | "normalize-package-data": "^2.3.2", 1540 | "path-type": "^3.0.0" 1541 | } 1542 | }, 1543 | "read-pkg-up": { 1544 | "version": "4.0.0", 1545 | "bundled": true, 1546 | "dev": true, 1547 | "requires": { 1548 | "find-up": "^3.0.0", 1549 | "read-pkg": "^3.0.0" 1550 | } 1551 | }, 1552 | "release-zalgo": { 1553 | "version": "1.0.0", 1554 | "bundled": true, 1555 | "dev": true, 1556 | "requires": { 1557 | "es6-error": "^4.0.1" 1558 | } 1559 | }, 1560 | "require-directory": { 1561 | "version": "2.1.1", 1562 | "bundled": true, 1563 | "dev": true 1564 | }, 1565 | "require-main-filename": { 1566 | "version": "1.0.1", 1567 | "bundled": true, 1568 | "dev": true 1569 | }, 1570 | "resolve-from": { 1571 | "version": "4.0.0", 1572 | "bundled": true, 1573 | "dev": true 1574 | }, 1575 | "rimraf": { 1576 | "version": "2.6.3", 1577 | "bundled": true, 1578 | "dev": true, 1579 | "requires": { 1580 | "glob": "^7.1.3" 1581 | } 1582 | }, 1583 | "safe-buffer": { 1584 | "version": "5.1.2", 1585 | "bundled": true, 1586 | "dev": true 1587 | }, 1588 | "semver": { 1589 | "version": "5.6.0", 1590 | "bundled": true, 1591 | "dev": true 1592 | }, 1593 | "set-blocking": { 1594 | "version": "2.0.0", 1595 | "bundled": true, 1596 | "dev": true 1597 | }, 1598 | "shebang-command": { 1599 | "version": "1.2.0", 1600 | "bundled": true, 1601 | "dev": true, 1602 | "requires": { 1603 | "shebang-regex": "^1.0.0" 1604 | } 1605 | }, 1606 | "shebang-regex": { 1607 | "version": "1.0.0", 1608 | "bundled": true, 1609 | "dev": true 1610 | }, 1611 | "signal-exit": { 1612 | "version": "3.0.2", 1613 | "bundled": true, 1614 | "dev": true 1615 | }, 1616 | "spawn-wrap": { 1617 | "version": "1.4.2", 1618 | "bundled": true, 1619 | "dev": true, 1620 | "requires": { 1621 | "foreground-child": "^1.5.6", 1622 | "mkdirp": "^0.5.0", 1623 | "os-homedir": "^1.0.1", 1624 | "rimraf": "^2.6.2", 1625 | "signal-exit": "^3.0.2", 1626 | "which": "^1.3.0" 1627 | } 1628 | }, 1629 | "spdx-correct": { 1630 | "version": "3.1.0", 1631 | "bundled": true, 1632 | "dev": true, 1633 | "requires": { 1634 | "spdx-expression-parse": "^3.0.0", 1635 | "spdx-license-ids": "^3.0.0" 1636 | } 1637 | }, 1638 | "spdx-exceptions": { 1639 | "version": "2.2.0", 1640 | "bundled": true, 1641 | "dev": true 1642 | }, 1643 | "spdx-expression-parse": { 1644 | "version": "3.0.0", 1645 | "bundled": true, 1646 | "dev": true, 1647 | "requires": { 1648 | "spdx-exceptions": "^2.1.0", 1649 | "spdx-license-ids": "^3.0.0" 1650 | } 1651 | }, 1652 | "spdx-license-ids": { 1653 | "version": "3.0.3", 1654 | "bundled": true, 1655 | "dev": true 1656 | }, 1657 | "string-width": { 1658 | "version": "2.1.1", 1659 | "bundled": true, 1660 | "dev": true, 1661 | "requires": { 1662 | "is-fullwidth-code-point": "^2.0.0", 1663 | "strip-ansi": "^4.0.0" 1664 | } 1665 | }, 1666 | "strip-ansi": { 1667 | "version": "4.0.0", 1668 | "bundled": true, 1669 | "dev": true, 1670 | "requires": { 1671 | "ansi-regex": "^3.0.0" 1672 | } 1673 | }, 1674 | "strip-bom": { 1675 | "version": "3.0.0", 1676 | "bundled": true, 1677 | "dev": true 1678 | }, 1679 | "strip-eof": { 1680 | "version": "1.0.0", 1681 | "bundled": true, 1682 | "dev": true 1683 | }, 1684 | "test-exclude": { 1685 | "version": "5.1.0", 1686 | "bundled": true, 1687 | "dev": true, 1688 | "requires": { 1689 | "arrify": "^1.0.1", 1690 | "minimatch": "^3.0.4", 1691 | "read-pkg-up": "^4.0.0", 1692 | "require-main-filename": "^1.0.1" 1693 | } 1694 | }, 1695 | "uglify-js": { 1696 | "version": "3.4.9", 1697 | "bundled": true, 1698 | "dev": true, 1699 | "optional": true, 1700 | "requires": { 1701 | "commander": "~2.17.1", 1702 | "source-map": "~0.6.1" 1703 | }, 1704 | "dependencies": { 1705 | "source-map": { 1706 | "version": "0.6.1", 1707 | "bundled": true, 1708 | "dev": true, 1709 | "optional": true 1710 | } 1711 | } 1712 | }, 1713 | "uuid": { 1714 | "version": "3.3.2", 1715 | "bundled": true, 1716 | "dev": true 1717 | }, 1718 | "validate-npm-package-license": { 1719 | "version": "3.0.4", 1720 | "bundled": true, 1721 | "dev": true, 1722 | "requires": { 1723 | "spdx-correct": "^3.0.0", 1724 | "spdx-expression-parse": "^3.0.0" 1725 | } 1726 | }, 1727 | "which": { 1728 | "version": "1.3.1", 1729 | "bundled": true, 1730 | "dev": true, 1731 | "requires": { 1732 | "isexe": "^2.0.0" 1733 | } 1734 | }, 1735 | "which-module": { 1736 | "version": "2.0.0", 1737 | "bundled": true, 1738 | "dev": true 1739 | }, 1740 | "wordwrap": { 1741 | "version": "0.0.3", 1742 | "bundled": true, 1743 | "dev": true 1744 | }, 1745 | "wrap-ansi": { 1746 | "version": "2.1.0", 1747 | "bundled": true, 1748 | "dev": true, 1749 | "requires": { 1750 | "string-width": "^1.0.1", 1751 | "strip-ansi": "^3.0.1" 1752 | }, 1753 | "dependencies": { 1754 | "ansi-regex": { 1755 | "version": "2.1.1", 1756 | "bundled": true, 1757 | "dev": true 1758 | }, 1759 | "is-fullwidth-code-point": { 1760 | "version": "1.0.0", 1761 | "bundled": true, 1762 | "dev": true, 1763 | "requires": { 1764 | "number-is-nan": "^1.0.0" 1765 | } 1766 | }, 1767 | "string-width": { 1768 | "version": "1.0.2", 1769 | "bundled": true, 1770 | "dev": true, 1771 | "requires": { 1772 | "code-point-at": "^1.0.0", 1773 | "is-fullwidth-code-point": "^1.0.0", 1774 | "strip-ansi": "^3.0.0" 1775 | } 1776 | }, 1777 | "strip-ansi": { 1778 | "version": "3.0.1", 1779 | "bundled": true, 1780 | "dev": true, 1781 | "requires": { 1782 | "ansi-regex": "^2.0.0" 1783 | } 1784 | } 1785 | } 1786 | }, 1787 | "wrappy": { 1788 | "version": "1.0.2", 1789 | "bundled": true, 1790 | "dev": true 1791 | }, 1792 | "write-file-atomic": { 1793 | "version": "2.4.2", 1794 | "bundled": true, 1795 | "dev": true, 1796 | "requires": { 1797 | "graceful-fs": "^4.1.11", 1798 | "imurmurhash": "^0.1.4", 1799 | "signal-exit": "^3.0.2" 1800 | } 1801 | }, 1802 | "y18n": { 1803 | "version": "4.0.0", 1804 | "bundled": true, 1805 | "dev": true 1806 | }, 1807 | "yallist": { 1808 | "version": "2.1.2", 1809 | "bundled": true, 1810 | "dev": true 1811 | }, 1812 | "yargs": { 1813 | "version": "12.0.5", 1814 | "bundled": true, 1815 | "dev": true, 1816 | "requires": { 1817 | "cliui": "^4.0.0", 1818 | "decamelize": "^1.2.0", 1819 | "find-up": "^3.0.0", 1820 | "get-caller-file": "^1.0.1", 1821 | "os-locale": "^3.0.0", 1822 | "require-directory": "^2.1.1", 1823 | "require-main-filename": "^1.0.1", 1824 | "set-blocking": "^2.0.0", 1825 | "string-width": "^2.0.0", 1826 | "which-module": "^2.0.0", 1827 | "y18n": "^3.2.1 || ^4.0.0", 1828 | "yargs-parser": "^11.1.1" 1829 | } 1830 | }, 1831 | "yargs-parser": { 1832 | "version": "11.1.1", 1833 | "bundled": true, 1834 | "dev": true, 1835 | "requires": { 1836 | "camelcase": "^5.0.0", 1837 | "decamelize": "^1.2.0" 1838 | } 1839 | } 1840 | } 1841 | }, 1842 | "oauth-sign": { 1843 | "version": "0.9.0", 1844 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1845 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1846 | "dev": true 1847 | }, 1848 | "once": { 1849 | "version": "1.4.0", 1850 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1851 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1852 | "requires": { 1853 | "wrappy": "1" 1854 | } 1855 | }, 1856 | "opener": { 1857 | "version": "1.5.1", 1858 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", 1859 | "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", 1860 | "dev": true 1861 | }, 1862 | "os-homedir": { 1863 | "version": "1.0.2", 1864 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1865 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1866 | "dev": true 1867 | }, 1868 | "own-or": { 1869 | "version": "1.0.0", 1870 | "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", 1871 | "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", 1872 | "dev": true 1873 | }, 1874 | "own-or-env": { 1875 | "version": "1.0.1", 1876 | "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", 1877 | "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", 1878 | "dev": true, 1879 | "requires": { 1880 | "own-or": "^1.0.0" 1881 | } 1882 | }, 1883 | "path-is-absolute": { 1884 | "version": "1.0.1", 1885 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1886 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1887 | }, 1888 | "path-parse": { 1889 | "version": "1.0.6", 1890 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1891 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1892 | }, 1893 | "performance-now": { 1894 | "version": "2.1.0", 1895 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1896 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1897 | "dev": true 1898 | }, 1899 | "process-nextick-args": { 1900 | "version": "2.0.0", 1901 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1902 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1903 | "dev": true, 1904 | "optional": true 1905 | }, 1906 | "pseudomap": { 1907 | "version": "1.0.2", 1908 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1909 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1910 | "dev": true 1911 | }, 1912 | "psl": { 1913 | "version": "1.1.31", 1914 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 1915 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", 1916 | "dev": true 1917 | }, 1918 | "punycode": { 1919 | "version": "2.1.1", 1920 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1921 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1922 | "dev": true 1923 | }, 1924 | "qs": { 1925 | "version": "6.5.2", 1926 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1927 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1928 | "dev": true 1929 | }, 1930 | "read-package-json": { 1931 | "version": "2.0.13", 1932 | "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", 1933 | "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", 1934 | "requires": { 1935 | "glob": "^7.1.1", 1936 | "graceful-fs": "^4.1.2", 1937 | "json-parse-better-errors": "^1.0.1", 1938 | "normalize-package-data": "^2.0.0", 1939 | "slash": "^1.0.0" 1940 | } 1941 | }, 1942 | "readable-stream": { 1943 | "version": "2.3.6", 1944 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1945 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1946 | "dev": true, 1947 | "optional": true, 1948 | "requires": { 1949 | "core-util-is": "~1.0.0", 1950 | "inherits": "~2.0.3", 1951 | "isarray": "~1.0.0", 1952 | "process-nextick-args": "~2.0.0", 1953 | "safe-buffer": "~5.1.1", 1954 | "string_decoder": "~1.1.1", 1955 | "util-deprecate": "~1.0.1" 1956 | } 1957 | }, 1958 | "readdir-scoped-modules": { 1959 | "version": "1.0.2", 1960 | "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", 1961 | "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", 1962 | "requires": { 1963 | "debuglog": "^1.0.1", 1964 | "dezalgo": "^1.0.0", 1965 | "graceful-fs": "^4.1.2", 1966 | "once": "^1.3.0" 1967 | } 1968 | }, 1969 | "request": { 1970 | "version": "2.88.0", 1971 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1972 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1973 | "dev": true, 1974 | "requires": { 1975 | "aws-sign2": "~0.7.0", 1976 | "aws4": "^1.8.0", 1977 | "caseless": "~0.12.0", 1978 | "combined-stream": "~1.0.6", 1979 | "extend": "~3.0.2", 1980 | "forever-agent": "~0.6.1", 1981 | "form-data": "~2.3.2", 1982 | "har-validator": "~5.1.0", 1983 | "http-signature": "~1.2.0", 1984 | "is-typedarray": "~1.0.0", 1985 | "isstream": "~0.1.2", 1986 | "json-stringify-safe": "~5.0.1", 1987 | "mime-types": "~2.1.19", 1988 | "oauth-sign": "~0.9.0", 1989 | "performance-now": "^2.1.0", 1990 | "qs": "~6.5.2", 1991 | "safe-buffer": "^5.1.2", 1992 | "tough-cookie": "~2.4.3", 1993 | "tunnel-agent": "^0.6.0", 1994 | "uuid": "^3.3.2" 1995 | } 1996 | }, 1997 | "resolve": { 1998 | "version": "1.10.0", 1999 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", 2000 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", 2001 | "requires": { 2002 | "path-parse": "^1.0.6" 2003 | } 2004 | }, 2005 | "rimraf": { 2006 | "version": "2.6.3", 2007 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2008 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2009 | "dev": true, 2010 | "requires": { 2011 | "glob": "^7.1.3" 2012 | } 2013 | }, 2014 | "safe-buffer": { 2015 | "version": "5.1.2", 2016 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2017 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2018 | "dev": true 2019 | }, 2020 | "safer-buffer": { 2021 | "version": "2.1.2", 2022 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2023 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2024 | "dev": true 2025 | }, 2026 | "semver": { 2027 | "version": "5.6.0", 2028 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 2029 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 2030 | }, 2031 | "signal-exit": { 2032 | "version": "3.0.2", 2033 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2034 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2035 | "dev": true 2036 | }, 2037 | "slash": { 2038 | "version": "1.0.0", 2039 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 2040 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 2041 | }, 2042 | "slide": { 2043 | "version": "1.1.6", 2044 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 2045 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" 2046 | }, 2047 | "source-map": { 2048 | "version": "0.5.7", 2049 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2050 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2051 | "dev": true 2052 | }, 2053 | "source-map-support": { 2054 | "version": "0.5.10", 2055 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", 2056 | "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", 2057 | "dev": true, 2058 | "requires": { 2059 | "buffer-from": "^1.0.0", 2060 | "source-map": "^0.6.0" 2061 | }, 2062 | "dependencies": { 2063 | "source-map": { 2064 | "version": "0.6.1", 2065 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2066 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2067 | "dev": true 2068 | } 2069 | } 2070 | }, 2071 | "spdx-correct": { 2072 | "version": "3.1.0", 2073 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 2074 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 2075 | "requires": { 2076 | "spdx-expression-parse": "^3.0.0", 2077 | "spdx-license-ids": "^3.0.0" 2078 | } 2079 | }, 2080 | "spdx-exceptions": { 2081 | "version": "2.2.0", 2082 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 2083 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 2084 | }, 2085 | "spdx-expression-parse": { 2086 | "version": "3.0.0", 2087 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 2088 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 2089 | "requires": { 2090 | "spdx-exceptions": "^2.1.0", 2091 | "spdx-license-ids": "^3.0.0" 2092 | } 2093 | }, 2094 | "spdx-license-ids": { 2095 | "version": "3.0.3", 2096 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", 2097 | "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" 2098 | }, 2099 | "sprintf-js": { 2100 | "version": "1.0.3", 2101 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2102 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2103 | "dev": true 2104 | }, 2105 | "sshpk": { 2106 | "version": "1.16.1", 2107 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2108 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2109 | "dev": true, 2110 | "requires": { 2111 | "asn1": "~0.2.3", 2112 | "assert-plus": "^1.0.0", 2113 | "bcrypt-pbkdf": "^1.0.0", 2114 | "dashdash": "^1.12.0", 2115 | "ecc-jsbn": "~0.1.1", 2116 | "getpass": "^0.1.1", 2117 | "jsbn": "~0.1.0", 2118 | "safer-buffer": "^2.0.2", 2119 | "tweetnacl": "~0.14.0" 2120 | } 2121 | }, 2122 | "stack-utils": { 2123 | "version": "1.0.2", 2124 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", 2125 | "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", 2126 | "dev": true 2127 | }, 2128 | "string_decoder": { 2129 | "version": "1.1.1", 2130 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2131 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2132 | "dev": true, 2133 | "optional": true, 2134 | "requires": { 2135 | "safe-buffer": "~5.1.0" 2136 | } 2137 | }, 2138 | "strip-ansi": { 2139 | "version": "3.0.1", 2140 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2141 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2142 | "dev": true, 2143 | "requires": { 2144 | "ansi-regex": "^2.0.0" 2145 | } 2146 | }, 2147 | "supports-color": { 2148 | "version": "5.5.0", 2149 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2150 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2151 | "dev": true, 2152 | "requires": { 2153 | "has-flag": "^3.0.0" 2154 | } 2155 | }, 2156 | "tap": { 2157 | "version": "12.5.2", 2158 | "resolved": "https://registry.npmjs.org/tap/-/tap-12.5.2.tgz", 2159 | "integrity": "sha512-r1uXuQ39+EnnR4hqWDTKw854+2ZSGR6QUEZwVRfabqcnhoNmkPQfiJCaVyhw+DILuMcJyT2/VRTVzn6puxkJ6w==", 2160 | "dev": true, 2161 | "requires": { 2162 | "bind-obj-methods": "^2.0.0", 2163 | "browser-process-hrtime": "^1.0.0", 2164 | "capture-stack-trace": "^1.0.0", 2165 | "clean-yaml-object": "^0.1.0", 2166 | "color-support": "^1.1.0", 2167 | "coveralls": "^3.0.2", 2168 | "domain-browser": "^1.2.0", 2169 | "esm": "^3.2.3", 2170 | "foreground-child": "^1.3.3", 2171 | "fs-exists-cached": "^1.0.0", 2172 | "function-loop": "^1.0.1", 2173 | "glob": "^7.1.3", 2174 | "isexe": "^2.0.0", 2175 | "js-yaml": "^3.12.1", 2176 | "minipass": "^2.3.5", 2177 | "mkdirp": "^0.5.1", 2178 | "nyc": "^13.2.0", 2179 | "opener": "^1.5.1", 2180 | "os-homedir": "^1.0.2", 2181 | "own-or": "^1.0.0", 2182 | "own-or-env": "^1.0.1", 2183 | "rimraf": "^2.6.3", 2184 | "signal-exit": "^3.0.0", 2185 | "source-map-support": "^0.5.10", 2186 | "stack-utils": "^1.0.2", 2187 | "tap-mocha-reporter": "^3.0.7", 2188 | "tap-parser": "^7.0.0", 2189 | "tmatch": "^4.0.0", 2190 | "trivial-deferred": "^1.0.1", 2191 | "ts-node": "^8.0.2", 2192 | "tsame": "^2.0.1", 2193 | "typescript": "^3.3.3", 2194 | "write-file-atomic": "^2.4.2", 2195 | "yapool": "^1.0.0" 2196 | }, 2197 | "dependencies": { 2198 | "diff": { 2199 | "version": "3.5.0", 2200 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 2201 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 2202 | "dev": true 2203 | }, 2204 | "ts-node": { 2205 | "version": "8.0.2", 2206 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", 2207 | "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", 2208 | "dev": true, 2209 | "requires": { 2210 | "arg": "^4.1.0", 2211 | "diff": "^3.1.0", 2212 | "make-error": "^1.1.1", 2213 | "source-map-support": "^0.5.6", 2214 | "yn": "^3.0.0" 2215 | } 2216 | } 2217 | } 2218 | }, 2219 | "tap-mocha-reporter": { 2220 | "version": "3.0.7", 2221 | "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.7.tgz", 2222 | "integrity": "sha512-GHVXJ38C3oPRpM3YUc43JlGdpVZYiKeT1fmAd3HH2+J+ZWwsNAUFvRRdoGsXLw9+gU9o+zXpBqhS/oXyRQYwlA==", 2223 | "dev": true, 2224 | "requires": { 2225 | "color-support": "^1.1.0", 2226 | "debug": "^2.1.3", 2227 | "diff": "^1.3.2", 2228 | "escape-string-regexp": "^1.0.3", 2229 | "glob": "^7.0.5", 2230 | "js-yaml": "^3.3.1", 2231 | "readable-stream": "^2.1.5", 2232 | "tap-parser": "^5.1.0", 2233 | "unicode-length": "^1.0.0" 2234 | }, 2235 | "dependencies": { 2236 | "debug": { 2237 | "version": "2.6.9", 2238 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2239 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2240 | "dev": true, 2241 | "requires": { 2242 | "ms": "2.0.0" 2243 | } 2244 | }, 2245 | "ms": { 2246 | "version": "2.0.0", 2247 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2248 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2249 | "dev": true 2250 | }, 2251 | "tap-parser": { 2252 | "version": "5.4.0", 2253 | "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", 2254 | "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", 2255 | "dev": true, 2256 | "requires": { 2257 | "events-to-array": "^1.0.1", 2258 | "js-yaml": "^3.2.7", 2259 | "readable-stream": "^2" 2260 | } 2261 | } 2262 | } 2263 | }, 2264 | "tap-parser": { 2265 | "version": "7.0.0", 2266 | "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", 2267 | "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", 2268 | "dev": true, 2269 | "requires": { 2270 | "events-to-array": "^1.0.1", 2271 | "js-yaml": "^3.2.7", 2272 | "minipass": "^2.2.0" 2273 | } 2274 | }, 2275 | "tmatch": { 2276 | "version": "4.0.0", 2277 | "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", 2278 | "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", 2279 | "dev": true 2280 | }, 2281 | "to-fast-properties": { 2282 | "version": "2.0.0", 2283 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2284 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2285 | "dev": true 2286 | }, 2287 | "tough-cookie": { 2288 | "version": "2.4.3", 2289 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 2290 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 2291 | "dev": true, 2292 | "requires": { 2293 | "psl": "^1.1.24", 2294 | "punycode": "^1.4.1" 2295 | }, 2296 | "dependencies": { 2297 | "punycode": { 2298 | "version": "1.4.1", 2299 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2300 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2301 | "dev": true 2302 | } 2303 | } 2304 | }, 2305 | "trim-right": { 2306 | "version": "1.0.1", 2307 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 2308 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 2309 | "dev": true 2310 | }, 2311 | "trivial-deferred": { 2312 | "version": "1.0.1", 2313 | "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", 2314 | "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", 2315 | "dev": true 2316 | }, 2317 | "tsame": { 2318 | "version": "2.0.1", 2319 | "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", 2320 | "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", 2321 | "dev": true 2322 | }, 2323 | "tunnel-agent": { 2324 | "version": "0.6.0", 2325 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2326 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2327 | "dev": true, 2328 | "requires": { 2329 | "safe-buffer": "^5.0.1" 2330 | } 2331 | }, 2332 | "tweetnacl": { 2333 | "version": "0.14.5", 2334 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2335 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2336 | "dev": true 2337 | }, 2338 | "typescript": { 2339 | "version": "3.3.3", 2340 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", 2341 | "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", 2342 | "dev": true 2343 | }, 2344 | "unicode-length": { 2345 | "version": "1.0.3", 2346 | "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", 2347 | "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", 2348 | "dev": true, 2349 | "requires": { 2350 | "punycode": "^1.3.2", 2351 | "strip-ansi": "^3.0.1" 2352 | }, 2353 | "dependencies": { 2354 | "punycode": { 2355 | "version": "1.4.1", 2356 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2357 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2358 | "dev": true 2359 | } 2360 | } 2361 | }, 2362 | "uri-js": { 2363 | "version": "4.2.2", 2364 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2365 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2366 | "dev": true, 2367 | "requires": { 2368 | "punycode": "^2.1.0" 2369 | } 2370 | }, 2371 | "util-deprecate": { 2372 | "version": "1.0.2", 2373 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2374 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2375 | "dev": true, 2376 | "optional": true 2377 | }, 2378 | "util-extend": { 2379 | "version": "1.0.3", 2380 | "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", 2381 | "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" 2382 | }, 2383 | "uuid": { 2384 | "version": "3.3.2", 2385 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2386 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 2387 | "dev": true 2388 | }, 2389 | "validate-npm-package-license": { 2390 | "version": "3.0.4", 2391 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2392 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2393 | "requires": { 2394 | "spdx-correct": "^3.0.0", 2395 | "spdx-expression-parse": "^3.0.0" 2396 | } 2397 | }, 2398 | "verror": { 2399 | "version": "1.10.0", 2400 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2401 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2402 | "dev": true, 2403 | "requires": { 2404 | "assert-plus": "^1.0.0", 2405 | "core-util-is": "1.0.2", 2406 | "extsprintf": "^1.2.0" 2407 | } 2408 | }, 2409 | "which": { 2410 | "version": "1.3.1", 2411 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2412 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2413 | "dev": true, 2414 | "requires": { 2415 | "isexe": "^2.0.0" 2416 | } 2417 | }, 2418 | "wrappy": { 2419 | "version": "1.0.2", 2420 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2421 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2422 | }, 2423 | "write-file-atomic": { 2424 | "version": "2.4.2", 2425 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", 2426 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", 2427 | "dev": true, 2428 | "requires": { 2429 | "graceful-fs": "^4.1.11", 2430 | "imurmurhash": "^0.1.4", 2431 | "signal-exit": "^3.0.2" 2432 | } 2433 | }, 2434 | "yallist": { 2435 | "version": "2.1.2", 2436 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2437 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2438 | "dev": true 2439 | }, 2440 | "yapool": { 2441 | "version": "1.0.0", 2442 | "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", 2443 | "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", 2444 | "dev": true 2445 | }, 2446 | "yn": { 2447 | "version": "3.0.0", 2448 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", 2449 | "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", 2450 | "dev": true 2451 | } 2452 | } 2453 | } 2454 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "read-installed", 3 | "description": "Read all the installed packages in a folder, and return a tree structure with all the data.", 4 | "version": "4.0.3", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/npm/read-installed.git" 8 | }, 9 | "main": "read-installed.js", 10 | "scripts": { 11 | "test": "tap ./test/*.js" 12 | }, 13 | "dependencies": { 14 | "debuglog": "^1.0.1", 15 | "read-package-json": "^2.0.0", 16 | "readdir-scoped-modules": "^1.0.0", 17 | "semver": "2 || 3 || 4 || 5", 18 | "slide": "~1.1.3", 19 | "util-extend": "^1.0.1" 20 | }, 21 | "optionalDependencies": { 22 | "graceful-fs": "^4.1.2" 23 | }, 24 | "author": "Isaac Z. Schlueter (http://blog.izs.me/)", 25 | "license": "ISC", 26 | "devDependencies": { 27 | "mkdirp": "^0.5.0", 28 | "rimraf": "^2.2.8", 29 | "tap": "^12.5.2" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /read-installed.js: -------------------------------------------------------------------------------- 1 | 2 | // Walk through the file-system "database" of installed 3 | // packages, and create a data object related to the 4 | // installed versions of each package. 5 | 6 | /* 7 | This will traverse through all node_modules folders, 8 | resolving the dependencies object to the object corresponding to 9 | the package that meets that dep, or just the version/range if 10 | unmet. 11 | 12 | Assuming that you had this folder structure: 13 | 14 | /path/to 15 | +-- package.json { name = "root" } 16 | `-- node_modules 17 | +-- foo {bar, baz, asdf} 18 | | +-- node_modules 19 | | +-- bar { baz } 20 | | `-- baz 21 | `-- asdf 22 | 23 | where "foo" depends on bar, baz, and asdf, bar depends on baz, 24 | and bar and baz are bundled with foo, whereas "asdf" is at 25 | the higher level (sibling to foo), you'd get this object structure: 26 | 27 | { 28 | , path: "/path/to" 29 | , parent: null 30 | , dependencies: 31 | { foo : 32 | { version: "1.2.3" 33 | , path: "/path/to/node_modules/foo" 34 | , parent: 35 | , dependencies: 36 | { bar: 37 | { parent: 38 | , path: "/path/to/node_modules/foo/node_modules/bar" 39 | , version: "2.3.4" 40 | , dependencies: { baz: } 41 | } 42 | , baz: { ... } 43 | , asdf: 44 | } 45 | } 46 | , asdf: { ... } 47 | } 48 | } 49 | 50 | Unmet deps are left as strings. 51 | Extraneous deps are marked with extraneous:true 52 | deps that don't meet a requirement are marked with invalid:true 53 | deps that don't meet a peer requirement are marked with peerInvalid:true 54 | 55 | to READ(packagefolder, parentobj, name, reqver) 56 | obj = read package.json 57 | installed = ./node_modules/* 58 | if parentobj is null, and no package.json 59 | obj = {dependencies:{:ANY}} 60 | deps = Object.keys(obj.dependencies) 61 | obj.path = packagefolder 62 | obj.parent = parentobj 63 | if name, && obj.name !== name, obj.invalid = true 64 | if reqver, && obj.version !satisfies reqver, obj.invalid = true 65 | if !reqver && parentobj, obj.extraneous = true 66 | for each folder in installed 67 | obj.dependencies[folder] = READ(packagefolder+node_modules+folder, 68 | obj, folder, obj.dependencies[folder]) 69 | # walk tree to find unmet deps 70 | for each dep in obj.dependencies not in installed 71 | r = obj.parent 72 | while r 73 | if r.dependencies[dep] 74 | if r.dependencies[dep].verion !satisfies obj.dependencies[dep] 75 | WARN 76 | r.dependencies[dep].invalid = true 77 | obj.dependencies[dep] = r.dependencies[dep] 78 | r = null 79 | else r = r.parent 80 | return obj 81 | 82 | 83 | TODO: 84 | 1. Find unmet deps in parent directories, searching as node does up 85 | as far as the left-most node_modules folder. 86 | 2. Ignore anything in node_modules that isn't a package folder. 87 | 88 | */ 89 | 90 | try { 91 | var fs = require("graceful-fs") 92 | } catch (er) { 93 | var fs = require("fs") 94 | } 95 | 96 | var path = require("path") 97 | var asyncMap = require("slide").asyncMap 98 | var semver = require("semver") 99 | var readJson = require("read-package-json") 100 | var url = require("url") 101 | var util = require("util") 102 | var extend = require("util-extend") 103 | 104 | var debug = require("debuglog")("read-installed") 105 | 106 | var readdir = require("readdir-scoped-modules") 107 | 108 | // Sentinel catch-all version constraint used when a dependency is not 109 | // listed in the package.json file. 110 | var ANY = {} 111 | 112 | module.exports = readInstalled 113 | 114 | function readInstalled (folder, opts, cb) { 115 | if (typeof opts === 'function') { 116 | cb = opts 117 | opts = {} 118 | } else { 119 | opts = extend({}, opts) 120 | } 121 | 122 | if (typeof opts.depth !== 'number') 123 | opts.depth = Infinity 124 | 125 | opts.depth = Math.max(0, opts.depth) 126 | 127 | if (typeof opts.log !== 'function') 128 | opts.log = function () {} 129 | 130 | opts.dev = !!opts.dev 131 | opts.realpathSeen = {} 132 | opts.findUnmetSeen = [] 133 | 134 | 135 | readInstalled_(folder, null, null, null, 0, opts, function (er, obj) { 136 | if (er) return cb(er) 137 | // now obj has all the installed things, where they're installed 138 | // figure out the inheritance links, now that the object is built. 139 | resolveInheritance(obj, opts) 140 | obj.root = true 141 | unmarkExtraneous(obj, opts) 142 | cb(null, obj) 143 | }) 144 | } 145 | 146 | function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { 147 | var installed 148 | , obj 149 | , real 150 | , link 151 | , realpathSeen = opts.realpathSeen 152 | 153 | readdir(path.resolve(folder, "node_modules"), function (er, i) { 154 | // error indicates that nothing is installed here 155 | if (er) i = [] 156 | installed = i.filter(function (f) { return f.charAt(0) !== "." }) 157 | next() 158 | }) 159 | 160 | readJson(path.resolve(folder, "package.json"), function (er, data) { 161 | obj = copy(data) 162 | 163 | if (!parent) { 164 | obj = obj || true 165 | er = null 166 | } 167 | return next(er) 168 | }) 169 | 170 | fs.lstat(folder, function (er, st) { 171 | if (er) { 172 | if (!parent) real = true 173 | return next(er) 174 | } 175 | fs.realpath(folder, function (er, rp) { 176 | debug("realpath(%j) = %j", folder, rp) 177 | real = rp 178 | if (st.isSymbolicLink()) link = rp 179 | next(er) 180 | }) 181 | }) 182 | 183 | var errState = null 184 | , called = false 185 | function next (er) { 186 | if (errState) return 187 | if (er) { 188 | errState = er 189 | return cb(null, []) 190 | } 191 | debug('next', installed, obj && typeof obj, name, real) 192 | if (!installed || !obj || !real || called) return 193 | called = true 194 | if (realpathSeen[real]) return cb(null, realpathSeen[real]) 195 | if (obj === true) { 196 | obj = {dependencies:{}, path:folder} 197 | installed.forEach(function (i) { obj.dependencies[i] = ANY }) 198 | } 199 | if (name && obj.name !== name) obj.invalid = true 200 | obj.realName = name || obj.name 201 | obj.dependencies = obj.dependencies || {} 202 | 203 | // At this point, figure out what dependencies we NEED to get met 204 | obj._dependencies = copy(obj.dependencies) 205 | 206 | if (reqver === ANY) { 207 | // We were unable to determine the required version of this 208 | // dependency from the package.json file, but we now know its actual 209 | // version, so treat that version as the required version to avoid 210 | // marking the dependency as invalid below. See #40. 211 | reqver = obj.version; 212 | } 213 | 214 | // "foo":"http://blah" and "foo":"latest" are always presumed valid 215 | if (reqver 216 | && semver.validRange(reqver, true) 217 | && !semver.satisfies(obj.version, reqver, true)) { 218 | obj.invalid = true 219 | } 220 | 221 | // Mark as extraneous at this point. 222 | // This will be un-marked in unmarkExtraneous, where we mark as 223 | // not-extraneous everything that is required in some way from 224 | // the root object. 225 | obj.extraneous = true 226 | 227 | obj.path = obj.path || folder 228 | obj.realPath = real 229 | obj.link = link 230 | if (parent && !obj.link) obj.parent = parent 231 | realpathSeen[real] = obj 232 | obj.depth = depth 233 | //if (depth >= opts.depth) return cb(null, obj) 234 | asyncMap(installed, function (pkg, cb) { 235 | var rv = obj.dependencies[pkg] 236 | if (!rv && obj.devDependencies && opts.dev) 237 | rv = obj.devDependencies[pkg] 238 | 239 | if (depth > opts.depth) { 240 | obj.dependencies = {} 241 | return cb(null, obj) 242 | } 243 | 244 | readInstalled_( path.resolve(folder, "node_modules/"+pkg) 245 | , obj, pkg, obj.dependencies[pkg], depth + 1, opts 246 | , cb ) 247 | 248 | }, function (er, installedData) { 249 | if (er) return cb(er) 250 | installedData.forEach(function (dep) { 251 | obj.dependencies[dep.realName] = dep 252 | }) 253 | 254 | // any strings here are unmet things. however, if it's 255 | // optional, then that's fine, so just delete it. 256 | if (obj.optionalDependencies) { 257 | Object.keys(obj.optionalDependencies).forEach(function (dep) { 258 | if (typeof obj.dependencies[dep] === "string") { 259 | delete obj.dependencies[dep] 260 | } 261 | }) 262 | } 263 | return cb(null, obj) 264 | }) 265 | } 266 | } 267 | 268 | // starting from a root object, call findUnmet on each layer of children 269 | var riSeen = [] 270 | function resolveInheritance (obj, opts) { 271 | if (typeof obj !== "object") return 272 | if (riSeen.indexOf(obj) !== -1) return 273 | riSeen.push(obj) 274 | if (typeof obj.dependencies !== "object") { 275 | obj.dependencies = {} 276 | } 277 | Object.keys(obj.dependencies).forEach(function (dep) { 278 | findUnmet(obj.dependencies[dep], opts) 279 | }) 280 | Object.keys(obj.dependencies).forEach(function (dep) { 281 | if (typeof obj.dependencies[dep] === "object") { 282 | resolveInheritance(obj.dependencies[dep], opts) 283 | } else { 284 | debug("unmet dep! %s %s@%s", obj.name, dep, obj.dependencies[dep]) 285 | } 286 | }) 287 | findUnmet(obj, opts) 288 | } 289 | 290 | // find unmet deps by walking up the tree object. 291 | // No I/O 292 | function findUnmet (obj, opts) { 293 | var findUnmetSeen = opts.findUnmetSeen 294 | if (findUnmetSeen.indexOf(obj) !== -1) return 295 | findUnmetSeen.push(obj) 296 | debug("find unmet parent=%s obj=", obj.parent && obj.parent.name, obj.name || obj) 297 | var deps = obj.dependencies = obj.dependencies || {} 298 | 299 | debug(deps) 300 | Object.keys(deps) 301 | .filter(function (d) { return typeof deps[d] === "string" }) 302 | .forEach(function (d) { 303 | var found = findDep(obj, d) 304 | debug("finding dep %j", d, found && found.name || found) 305 | // "foo":"http://blah" and "foo":"latest" are always presumed valid 306 | if (typeof deps[d] === "string" && 307 | semver.validRange(deps[d], true) && 308 | found && 309 | !semver.satisfies(found.version, deps[d], true)) { 310 | // the bad thing will happen 311 | opts.log( "unmet dependency" 312 | , obj.path + " requires "+d+"@'"+deps[d] 313 | + "' but will load\n" 314 | + found.path+",\nwhich is version "+found.version ) 315 | found.invalid = true 316 | } 317 | if (found) { 318 | deps[d] = found 319 | } 320 | }) 321 | 322 | var peerDeps = obj.peerDependencies = obj.peerDependencies || {} 323 | Object.keys(peerDeps).forEach(function (d) { 324 | var dependency 325 | 326 | if (!obj.parent) { 327 | dependency = obj.dependencies[d] 328 | 329 | // read it as a missing dep 330 | if (!dependency) { 331 | obj.dependencies[d] = peerDeps[d] 332 | } 333 | } else { 334 | var r = obj.parent 335 | while (r && !dependency) { 336 | dependency = r.dependencies && r.dependencies[d] 337 | r = r.link ? null : r.parent 338 | } 339 | } 340 | 341 | if (!dependency) { 342 | // mark as a missing dep! 343 | obj.dependencies[d] = peerDeps[d] 344 | } else if (!semver.satisfies(dependency.version, peerDeps[d], true)) { 345 | dependency.peerInvalid = true 346 | } 347 | }) 348 | 349 | return obj 350 | } 351 | 352 | function unmarkExtraneous (obj, opts) { 353 | // Mark all non-required deps as extraneous. 354 | // start from the root object and mark as non-extraneous all modules 355 | // that haven't been previously flagged as extraneous then propagate 356 | // to all their dependencies 357 | 358 | obj.extraneous = false 359 | 360 | var deps = obj._dependencies || [] 361 | if (opts.dev && obj.devDependencies && (obj.root || obj.link)) { 362 | Object.keys(obj.devDependencies).forEach(function (k) { 363 | deps[k] = obj.devDependencies[k] 364 | }) 365 | } 366 | 367 | if (obj.peerDependencies) { 368 | Object.keys(obj.peerDependencies).forEach(function (k) { 369 | deps[k] = obj.peerDependencies[k] 370 | }) 371 | } 372 | 373 | debug("not extraneous", obj._id, deps) 374 | Object.keys(deps).forEach(function (d) { 375 | var dep = findDep(obj, d) 376 | if (dep && dep.extraneous) { 377 | unmarkExtraneous(dep, opts) 378 | } 379 | }) 380 | } 381 | 382 | // Find the one that will actually be loaded by require() 383 | // so we can make sure it's valid etc. 384 | function findDep (obj, d) { 385 | var r = obj 386 | , found = null 387 | while (r && !found) { 388 | // if r is a valid choice, then use that. 389 | // kinda weird if a pkg depends on itself, but after the first 390 | // iteration of this loop, it indicates a dep cycle. 391 | if (typeof r.dependencies[d] === "object") { 392 | found = r.dependencies[d] 393 | } 394 | if (!found && r.realName === d) found = r 395 | r = r.link ? null : r.parent 396 | } 397 | return found 398 | } 399 | 400 | function copy (obj) { 401 | if (!obj || typeof obj !== 'object') return obj 402 | if (Array.isArray(obj)) return obj.map(copy) 403 | 404 | var o = {} 405 | for (var i in obj) o[i] = copy(obj[i]) 406 | return o 407 | } 408 | -------------------------------------------------------------------------------- /test/basic.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js") 2 | var json = require("../package.json") 3 | var d = Object.keys(json.dependencies) 4 | var dd = Object.keys(json.devDependencies) 5 | var od = Object.keys(json.optionalDependencies) 6 | var known = d.concat(dd).concat(od).sort() 7 | var test = require("tap").test 8 | var path = require("path") 9 | 10 | test("make sure that it works", function (t) { 11 | readInstalled(path.join(__dirname, "../"), { 12 | dev: true, 13 | log: console.error 14 | }, function (er, map) { 15 | t.notOk(er, "er should be bull") 16 | t.ok(map, "map should be data") 17 | if (er) return console.error(er.stack || er.message) 18 | cleanup(map) 19 | var deps = Object.keys(map.dependencies).sort() 20 | t.equal(known.length, deps.length, "array lengths are equal") 21 | t.deepEqual(known, deps, "arrays should be equal") 22 | t.notOk(map.dependencies.tap.extraneous, 'extraneous not set on devDep') 23 | t.end() 24 | }) 25 | }) 26 | 27 | var seen = [] 28 | function cleanup (map) { 29 | if (seen.indexOf(map) !== -1) return 30 | seen.push(map) 31 | for (var i in map) switch (i) { 32 | case "_id": 33 | case "path": 34 | case "extraneous": case "invalid": 35 | case "dependencies": case "name": 36 | continue 37 | default: delete map[i] 38 | } 39 | var dep = map.dependencies 40 | if (dep) { 41 | for (var i in dep) if (typeof dep[i] === "object") { 42 | cleanup(dep[i]) 43 | } 44 | } 45 | return map 46 | } 47 | -------------------------------------------------------------------------------- /test/cyclic-extraneous-peer-deps.js: -------------------------------------------------------------------------------- 1 | var test = require("tap").test 2 | var mkdirp = require("mkdirp") 3 | var rimraf = require("rimraf") 4 | var fs = require("fs") 5 | var path = require("path") 6 | var readInstalled = require("../read-installed.js") 7 | 8 | var parent = { 9 | name: "parent", 10 | version: "1.2.3", 11 | dependencies: {}, 12 | devDependencies: { 13 | "child1":"*" 14 | }, 15 | readme:"." 16 | } 17 | 18 | var child1 = { 19 | name: "child1", 20 | version: "1.2.3", 21 | peerDependencies: { 22 | child2: "*" 23 | }, 24 | readme:"." 25 | } 26 | 27 | var child2 = { 28 | name: "child2", 29 | version: "1.2.3", 30 | peerDependencies: { 31 | child1: "*" 32 | }, 33 | readme:"." 34 | } 35 | 36 | 37 | var root = path.resolve(__dirname, "cyclic-extraneous-peer-deps") 38 | var parentjson = path.resolve(root, "package.json") 39 | var child1root = path.resolve(root, "node_modules/child1") 40 | var child1json = path.resolve(child1root, "package.json") 41 | var child2root = path.resolve(root, "node_modules/child2") 42 | var child2json = path.resolve(child2root, "package.json") 43 | 44 | test("setup", function (t) { 45 | rimraf.sync(root) 46 | mkdirp.sync(child1root) 47 | mkdirp.sync(child2root) 48 | fs.writeFileSync(parentjson, JSON.stringify(parent, null, 2) + "\n", "utf8") 49 | fs.writeFileSync(child1json, JSON.stringify(child1, null, 2) + "\n", "utf8") 50 | fs.writeFileSync(child2json, JSON.stringify(child2, null, 2) + "\n", "utf8") 51 | t.pass("setup done") 52 | t.end() 53 | }) 54 | 55 | test("dev mode", function (t) { 56 | // peer dev deps should both be not extraneous. 57 | readInstalled(root, { dev: true }, function (er, data) { 58 | if (er) 59 | throw er 60 | t.notOk(data.dependencies.child1.extraneous, "c1 not extra") 61 | t.notOk(data.dependencies.child2.extraneous, "c2 not extra") 62 | t.end() 63 | }) 64 | }) 65 | 66 | test("prod mode", function (t) { 67 | readInstalled(root, { dev: false }, function (er, data) { 68 | if (er) 69 | throw er 70 | t.ok(data.dependencies.child1.extraneous, "c1 extra") 71 | t.ok(data.dependencies.child2.extraneous, "c2 extra") 72 | t.end() 73 | }) 74 | }) 75 | 76 | 77 | test("cleanup", function (t) { 78 | rimraf.sync(root) 79 | t.pass("cleanup done") 80 | t.end() 81 | }) 82 | -------------------------------------------------------------------------------- /test/depth-0.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js") 2 | var test = require("tap").test 3 | var json = require("../package.json") 4 | var path = require("path") 5 | var known = [].concat(Object.keys(json.dependencies) 6 | , Object.keys(json.optionalDependencies) 7 | , Object.keys(json.devDependencies)).sort() 8 | 9 | test("make sure that it works with depth=0", function (t) { 10 | readInstalled(path.join(__dirname, "../"), { 11 | depth: 0 12 | }, function (er, map) { 13 | t.notOk(er, "er should be bull") 14 | t.ok(map, "map should be data") 15 | if (er) return console.error(er.stack || er.message) 16 | // Exclude self from dependencies when depth = 0 17 | delete map.dependencies[json.name] 18 | var subdeps = Object.keys(map.dependencies).reduce(function(acc, dep) { 19 | // Exclude self from dependencies when depth = current depth 20 | delete map.dependencies[dep].dependencies[dep] 21 | acc += Object.keys(map.dependencies[dep].dependencies).length; 22 | return acc; 23 | }, 0); 24 | t.equal(subdeps, 0, "there should be no sub dependencies") 25 | t.end() 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /test/depth-1.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js") 2 | var test = require("tap").test 3 | var json = require("../package.json") 4 | var path = require("path") 5 | var known = [].concat(Object.keys(json.dependencies) 6 | , Object.keys(json.optionalDependencies) 7 | , Object.keys(json.devDependencies)).sort() 8 | 9 | test("make sure that it works with depth=1", function (t) { 10 | readInstalled(path.join(__dirname, "../"), { 11 | depth: 1 12 | }, function (er, map) { 13 | t.notOk(er, "er should be bull") 14 | t.ok(map, "map should be data") 15 | if (er) return console.error(er.stack || er.message) 16 | var subdeps = Object.keys(map.dependencies).reduce(function(acc, dep) { 17 | acc += Object.keys(map.dependencies[dep].dependencies).length; 18 | return acc; 19 | }, 0); 20 | t.notEqual(subdeps, 0, "there should some sub dependencies") 21 | t.end() 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /test/dev.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js") 2 | var test = require("tap").test 3 | var json = require("../package.json") 4 | var path = require("path") 5 | var known = [].concat(Object.keys(json.dependencies) 6 | , Object.keys(json.optionalDependencies) 7 | , Object.keys(json.devDependencies)).sort() 8 | 9 | test("make sure that it works without dev deps", function (t) { 10 | readInstalled(path.join(__dirname, "../"), { 11 | log: console.error, 12 | dev: false 13 | }, function (er, map) { 14 | t.notOk(er, "er should be bull") 15 | t.ok(map, "map should be data") 16 | if (er) return console.error(er.stack || er.message) 17 | var deps = Object.keys(map.dependencies).sort() 18 | t.equal(deps.length, known.length, "array lengths are equal") 19 | t.deepEqual(deps, known, "arrays should be equal") 20 | t.ok(map.dependencies.tap.extraneous, "extraneous is set on devDep") 21 | t.end() 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /test/empty.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js"); 2 | var test = require("tap").test; 3 | var path = require("path"); 4 | 5 | test("Handle bad path", function (t) { 6 | readInstalled(path.join(__dirname, "../unknown"), { 7 | dev: true, 8 | log: console.error 9 | }, function (er, map) { 10 | t.notOk(er, "er should be null"); 11 | t.ok(map, "map should be data"); 12 | t.equal(Object.keys(map.dependencies).length, 0, "Dependencies should have no keys"); 13 | if (er) return console.error(er.stack || er.message); 14 | t.end(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /test/extraneous-dev.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js") 2 | var test = require("tap").test 3 | var path = require("path") 4 | 5 | test("extraneous detected", function(t) { 6 | // This test verifies read-installed#16 7 | readInstalled( 8 | path.join(__dirname, "fixtures/extraneous-dev-dep"), 9 | { 10 | log: console.error, 11 | dev: true 12 | }, 13 | function (err, map) { 14 | t.ifError(err, "read-installed made it") 15 | 16 | t.notOk(map.dependencies.d.extraneous, "d is not extraneous, it's required by root") 17 | t.ok(map.dependencies.x.extraneous, "x is extraneous, it's only a dev dep of d") 18 | t.end() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /test/extraneous.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require('../read-installed.js') 2 | var test = require('tap').test 3 | var path = require('path') 4 | 5 | test('extraneous detected', function(t) { 6 | // This test verifies read-installed#16 7 | readInstalled( 8 | path.join(__dirname, 'fixtures/extraneous-detected'), 9 | { log: console.error }, 10 | function(err, map) { 11 | t.ok(map.dependencies.foo.extraneous, 'foo is extraneous, it\'s not required by any module') 12 | t.ok(map.dependencies.bar.extraneous, 'bar is extraneous, it\'s not required by any module') 13 | t.notOk(map.dependencies.asdf.extraneous, 'asdf is not extraneous, it\'s required by ghjk') 14 | t.notOk(map.dependencies.ghjk.extraneous, 'ghjk is not extraneous, it\'s required by our root module') 15 | t.end() 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-detected/node_modules/asdf/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asdf", 3 | "version": "0.0.0" 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-detected/node_modules/bar/node_modules/baz/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "baz", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "foo": "0.0.0", 6 | "bar": "0.0.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-detected/node_modules/bar/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bar", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "baz": "0.0.0", 6 | "foo": "0.0.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-detected/node_modules/foo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "foo", 3 | "version": "0.0.0" 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-detected/node_modules/ghjk/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ghjk", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "asdf": "0.0.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-detected/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "extraneous-detected", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "ghjk": "0.0.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-dev-dep/node_modules/d/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d", 3 | "version": "1.0.0", 4 | "devDependencies": { 5 | "x": "1.0.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-dev-dep/node_modules/x/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "x", 3 | "version": "1.0.0" 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/extraneous-dev-dep/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "extraneous-dev-dep", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "d": "1.0.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/grandparent-peer-dev/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "devDependencies": { 5 | "plugin-wrapper": "0.0.0", 6 | "framework": "0.0.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/grandparent-peer/node_modules/framework/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "framework", 3 | "version": "0.0.0" 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/grandparent-peer/node_modules/plugin-wrapper/node_modules/plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "plugin", 3 | "version": "0.0.0", 4 | "peerDependencies": { 5 | "framework": "0.0.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/grandparent-peer/node_modules/plugin-wrapper/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "plugin-wrapper", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "plugin": "0.0.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/grandparent-peer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "plugin-wrapper": "0.0.0", 6 | "framework": "0.0.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/issue-40/node_modules/fake/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fake", 3 | "version": "0.1.0-2", 4 | "description": "A fake package with a prerelease version. See #40." 5 | } 6 | -------------------------------------------------------------------------------- /test/fixtures/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "read-installed", 3 | "description": "Read all the installed packages in a folder, and return a tree structure with all the data.", 4 | "version": "1.0.0", 5 | "repository": { 6 | "type": "git", 7 | "url": "git://github.com/isaacs/read-installed" 8 | }, 9 | "main": "read-installed.js", 10 | "scripts": { 11 | "test": "tap ./test/" 12 | }, 13 | "dependencies": { 14 | "semver": "2", 15 | "slide": "~1.1.3", 16 | "read-package-json": "1", 17 | "util-extend":"1" 18 | }, 19 | "optionalDependencies": { 20 | "graceful-fs": "~2" 21 | }, 22 | "author": "Isaac Z. Schlueter (http://blog.izs.me/)", 23 | "license": "ISC", 24 | "devDependencies": { 25 | "tap": "~0.4.8" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /test/fixtures/peer-at-latest/node_modules/debug/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "debug", 3 | "version": "0.7.4", 4 | "dependencies": {}, 5 | "_id": "debug@0.7.4", 6 | "_from": "debug@latest" 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/peer-at-latest/node_modules/strong-task-emitter/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "strong-task-emitter", 3 | "version": "0.0.4", 4 | "dependencies": { 5 | "debug": "latest" 6 | }, 7 | "_id": "strong-task-emitter@0.0.4", 8 | "_from": "strong-task-emitter@0.0.4", 9 | "_resolved": "https://registry.npmjs.org/strong-task-emitter/-/strong-task-emitter-0.0.4.tgz" 10 | } 11 | -------------------------------------------------------------------------------- /test/grandparent-peer-dev.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require('../read-installed.js') 2 | var test = require('tap').test 3 | var path = require('path'); 4 | 5 | function allValid(t, map) { 6 | var deps = Object.keys(map.dependencies || {}) 7 | deps.forEach(function (dep) { 8 | t.ok(map.dependencies[dep].extraneous, 'dependency ' + dep + ' of ' + map.name + ' is extraneous') 9 | }) 10 | } 11 | 12 | test('grandparent dev peer dependencies should be extraneous', function(t) { 13 | readInstalled( 14 | path.join(__dirname, 'fixtures/grandparent-peer-dev'), 15 | { log: console.error }, 16 | function(err, map) { 17 | allValid(t, map) 18 | t.end() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /test/grandparent-peer.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require('../read-installed.js') 2 | var test = require('tap').test 3 | var path = require('path'); 4 | 5 | function allValid(t, map) { 6 | var deps = Object.keys(map.dependencies || {}) 7 | deps.forEach(function (dep) { 8 | t.notOk(map.dependencies[dep].invalid, 'dependency ' + dep + ' of ' + map.name + ' is not invalid') 9 | t.notOk(typeof map.dependencies[dep] === 'string', 'dependency ' + dep + ' of ' + map.name + ' is not missing') 10 | }) 11 | deps.forEach(function (dep) { 12 | allValid(t, map.dependencies[dep]) 13 | }) 14 | } 15 | 16 | test('grandparent can satisfy peer dependencies', function(t) { 17 | readInstalled( 18 | path.join(__dirname, 'fixtures/grandparent-peer'), 19 | { log: console.error }, 20 | function(err, map) { 21 | allValid(t, map) 22 | t.end() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /test/issue-40.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require('../read-installed.js'); 2 | var test = require('tap').test; 3 | var path = require('path'); 4 | 5 | test('prerelease packages should not be marked invalid', function(t) { 6 | readInstalled( 7 | path.join(__dirname, 'fixtures/issue-40'), 8 | { log: console.error }, 9 | function(err, map) { 10 | t.strictEqual(map.dependencies.fake.version, '0.1.0-2'); 11 | t.notOk(map.dependencies.fake.invalid); 12 | t.end(); 13 | } 14 | ); 15 | }); 16 | -------------------------------------------------------------------------------- /test/linked-dep-dev-deps-extraneous.js: -------------------------------------------------------------------------------- 1 | var test = require('tap').test 2 | var path = require('path') 3 | var fs = require('fs') 4 | var mkdirp = require('mkdirp') 5 | var rimraf = require('rimraf') 6 | var readInstalled = require('../') 7 | 8 | var root = path.resolve(__dirname, 'root') 9 | var pkg = path.resolve(root, 'pkg') 10 | var pkgnm = path.resolve(pkg, 'node_modules') 11 | var linkdepSrc = path.resolve(root, 'linkdep') 12 | var linkdepLink = path.resolve(pkgnm, 'linkdep') 13 | var devdep = path.resolve(linkdepSrc, 'node_modules', 'devdep') 14 | 15 | function pjson (dir, data) { 16 | mkdirp.sync(dir) 17 | var d = path.resolve(dir, 'package.json') 18 | fs.writeFileSync(d, JSON.stringify(data)) 19 | } 20 | 21 | test('setup', function (t) { 22 | rimraf.sync(root) 23 | pjson(pkg, { 24 | name: 'root', 25 | version: '1.2.3', 26 | dependencies: { 27 | linkdep: '' 28 | } 29 | }) 30 | pjson(linkdepSrc, { 31 | name: 'linkdep', 32 | version: '1.2.3', 33 | devDependencies: { 34 | devdep: '' 35 | } 36 | }) 37 | pjson(devdep, { 38 | name: 'devdep', 39 | version: '1.2.3' 40 | }) 41 | 42 | mkdirp.sync(pkgnm) 43 | fs.symlinkSync(linkdepSrc, linkdepLink, 'dir') 44 | 45 | t.end() 46 | }) 47 | 48 | test('basic', function (t) { 49 | readInstalled(pkg, { dev: true }, function (er, data) { 50 | var dd = data.dependencies.linkdep.dependencies.devdep 51 | t.notOk(dd.extraneous, 'linked dev dep should not be extraneous') 52 | t.end() 53 | }) 54 | }) 55 | 56 | test('cleanup', function (t) { 57 | rimraf.sync(root) 58 | t.end() 59 | }) 60 | -------------------------------------------------------------------------------- /test/noargs.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require("../read-installed.js") 2 | var test = require("tap").test 3 | var json = require("../package.json") 4 | var path = require("path") 5 | var known = [].concat(Object.keys(json.dependencies) 6 | , Object.keys(json.optionalDependencies) 7 | , Object.keys(json.devDependencies)).sort() 8 | 9 | test("make sure that it works without dev deps", function (t) { 10 | readInstalled(path.join(__dirname, "../"), function (er, map) { 11 | t.notOk(er, "er should be bull") 12 | t.ok(map, "map should be data") 13 | if (er) return console.error(er.stack || er.message) 14 | var deps = Object.keys(map.dependencies).sort() 15 | t.equal(deps.length, known.length, "array lengths are equal") 16 | t.deepEqual(deps, known, "arrays should be equal") 17 | t.ok(map.dependencies.tap.extraneous, 'extraneous is set on devDep') 18 | t.end() 19 | }) 20 | }) 21 | 22 | -------------------------------------------------------------------------------- /test/peer-dep-at-latest.js: -------------------------------------------------------------------------------- 1 | var readInstalled = require('../read-installed.js') 2 | var test = require('tap').test 3 | var path = require('path'); 4 | 5 | test('"latest" version is valid', function(t) { 6 | // This test verifies npm#3860 7 | readInstalled( 8 | path.join(__dirname, 'fixtures/peer-at-latest'), 9 | { log: console.error }, 10 | function(err, map) { 11 | t.notOk(map.dependencies.debug.invalid, 'debug@latest is satisfied by a peer') 12 | t.end() 13 | }) 14 | }) 15 | --------------------------------------------------------------------------------