├── .eslintrc ├── .gitignore ├── .travis.yml ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test ├── fixtures.js └── index.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "nodesecurity" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - stable 4 | notifications: 5 | slack: 6 | secure: WHt4oNqrHedn0DpnTNs47LHFdFVAsY8wc7dcEYvfHvn2DUwn6lAH5nxeal+e6/qVdtFSeBtbxHWJHOD/wKBi8cBzzXkcBhURzSVKPJRmrtLefpZEZPWWgcmNeoiclxSr8Rm7E3fErUPMRvZEVQQ2EsMn/T5XwtxRNG6AOzM+JCc= 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node security project npm utilities 2 | 3 | ## Methods: 4 | 5 | ### getPackageJson = function (module, callback) 6 | 7 | Return the full package document for the given `module`. 8 | 9 | ### getShrinkwrapDependencies = function (shrinkwrapJson, callback) 10 | 11 | Get a [depTree](#deptree-format) for the module from a full npm-shrinkwrap.json. `shrinkwrapJson` should be an object from a parsed npm-shrinkwrap.json file (or look like one): required keys: `name`, `version`, `dependencies`. 12 | 13 | ```js 14 | var fs = require('fs'); 15 | 16 | getShrinkwrapDependencies(JSON.parse(fs.readFileSync('./npm-shrinkwrap.json')), function (err, depTree) { 17 | console.log(depTree); 18 | }); 19 | ``` 20 | 21 | #### depTree format 22 | 23 | The returned `depTree` representing the full dependency tree object is in a format that's easier to traverse than a full tree. Each module in the full heirarchy has a key in the object of `module@version`. It's value is an object with `parents`, `children` and `source`. 24 | 25 | Note that the root module has a key too. 26 | 27 | e.g.: 28 | 29 | ```js 30 | //depTree for some-module version 1.1.0 31 | { 32 | //root module 33 | "some-module@1.1.0": { 34 | parents: [], 35 | children: ["depA@0.1.0", "depB@1.0.1", "depC@0.2.0"], 36 | }, 37 | 38 | //root's dependencies 39 | "depA@0.1.0": { 40 | parents: ["some-module@1.1.0"], 41 | children: ["underscore@1.6.0"], 42 | source: "npm" 43 | }, 44 | "depB@1.0.1": { 45 | parents: ["some-module@1.1.0"], 46 | children: ["underscore@1.6.0", "backbone@1.0.0"], 47 | source: "npm" 48 | }, 49 | "depC@0.2.0": { 50 | parents: ["some-module@1.1.0"], 51 | children: [], 52 | source: "unknown" //not on npm, maybe it's private/local? 53 | } 54 | 55 | //deeper dependencies 56 | "underscore@1.6.0": { 57 | parents: ["depA@0.1.0", "depB@1.0.1", "backbone@1.6.0"], //modules can be required multiple places in the tree 58 | children: [], 59 | source: "npm" 60 | }, 61 | "backbone@1.6.0": { 62 | parents: ["depB@1.0.1"], //modules can be required multiple places in the tree 63 | children: ["underscore@1.6.0"], 64 | source: "npm" 65 | } 66 | } 67 | ``` 68 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const internals = {}; 4 | internals._parseModule = function (module, path, name, results) { 5 | 6 | const moduleName = `${name || module.name}@${module.version}`; 7 | 8 | if (results[moduleName]) { 9 | results[moduleName].paths.push(path.concat(moduleName)); 10 | } 11 | else { 12 | results[moduleName] = { 13 | name: name || module.name, 14 | version: module.version, 15 | paths: [path.concat(moduleName)] 16 | }; 17 | } 18 | 19 | if (!module.dependencies) { 20 | module.dependencies = {}; 21 | } 22 | 23 | for (const child in module.dependencies) { 24 | internals._parseModule(module.dependencies[child], path.concat(moduleName), child, results); 25 | } 26 | }; 27 | 28 | exports.getShrinkwrapDependencies = function (shrinkwrap) { 29 | 30 | const results = {}; 31 | try { 32 | internals._parseModule(shrinkwrap, [], null, results); 33 | } 34 | catch (err) { 35 | // $lab:coverage:off$ 36 | return Promise.reject(err); 37 | // $lab:coverage:on$ 38 | } 39 | 40 | return Promise.resolve(results); 41 | }; 42 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodesecurity-npm-utils", 3 | "version": "6.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.2", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", 10 | "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "3.3.0" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.2.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", 33 | "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "fast-deep-equal": "1.0.0", 38 | "json-schema-traverse": "0.3.1", 39 | "json-stable-stringify": "1.0.1" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "1.5.1", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 45 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 46 | "dev": true 47 | }, 48 | "align-text": { 49 | "version": "0.1.4", 50 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 51 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 52 | "dev": true, 53 | "requires": { 54 | "kind-of": "3.2.2", 55 | "longest": "1.0.1", 56 | "repeat-string": "1.6.1" 57 | } 58 | }, 59 | "amdefine": { 60 | "version": "1.0.1", 61 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 62 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 63 | "dev": true 64 | }, 65 | "ansi-escapes": { 66 | "version": "2.0.0", 67 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", 68 | "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", 69 | "dev": true 70 | }, 71 | "ansi-regex": { 72 | "version": "2.1.1", 73 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 74 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 75 | "dev": true 76 | }, 77 | "ansi-styles": { 78 | "version": "2.2.1", 79 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 80 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 81 | "dev": true 82 | }, 83 | "argparse": { 84 | "version": "1.0.9", 85 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 86 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 87 | "dev": true, 88 | "requires": { 89 | "sprintf-js": "1.0.3" 90 | } 91 | }, 92 | "array-union": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 95 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 96 | "dev": true, 97 | "requires": { 98 | "array-uniq": "1.0.3" 99 | } 100 | }, 101 | "array-uniq": { 102 | "version": "1.0.3", 103 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 104 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 105 | "dev": true 106 | }, 107 | "arrify": { 108 | "version": "1.0.1", 109 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 110 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 111 | "dev": true 112 | }, 113 | "async": { 114 | "version": "1.5.2", 115 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 116 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 117 | "dev": true 118 | }, 119 | "babel-code-frame": { 120 | "version": "6.26.0", 121 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 122 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 123 | "dev": true, 124 | "requires": { 125 | "chalk": "1.1.3", 126 | "esutils": "2.0.2", 127 | "js-tokens": "3.0.2" 128 | }, 129 | "dependencies": { 130 | "chalk": { 131 | "version": "1.1.3", 132 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 133 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 134 | "dev": true, 135 | "requires": { 136 | "ansi-styles": "2.2.1", 137 | "escape-string-regexp": "1.0.5", 138 | "has-ansi": "2.0.0", 139 | "strip-ansi": "3.0.1", 140 | "supports-color": "2.0.0" 141 | } 142 | }, 143 | "strip-ansi": { 144 | "version": "3.0.1", 145 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 146 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 147 | "dev": true, 148 | "requires": { 149 | "ansi-regex": "2.1.1" 150 | } 151 | } 152 | } 153 | }, 154 | "balanced-match": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 157 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 158 | "dev": true 159 | }, 160 | "bossy": { 161 | "version": "3.0.4", 162 | "resolved": "https://registry.npmjs.org/bossy/-/bossy-3.0.4.tgz", 163 | "integrity": "sha1-+a6fJugbQaMY9O4Ng2huSlwlB7k=", 164 | "dev": true, 165 | "requires": { 166 | "hoek": "4.2.0", 167 | "joi": "10.6.0" 168 | } 169 | }, 170 | "brace-expansion": { 171 | "version": "1.1.8", 172 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 173 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 174 | "dev": true, 175 | "requires": { 176 | "balanced-match": "1.0.0", 177 | "concat-map": "0.0.1" 178 | } 179 | }, 180 | "caller-path": { 181 | "version": "0.1.0", 182 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 183 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 184 | "dev": true, 185 | "requires": { 186 | "callsites": "0.2.0" 187 | } 188 | }, 189 | "callsites": { 190 | "version": "0.2.0", 191 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 192 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 193 | "dev": true 194 | }, 195 | "camelcase": { 196 | "version": "1.2.1", 197 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 198 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 199 | "dev": true, 200 | "optional": true 201 | }, 202 | "center-align": { 203 | "version": "0.1.3", 204 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 205 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 206 | "dev": true, 207 | "optional": true, 208 | "requires": { 209 | "align-text": "0.1.4", 210 | "lazy-cache": "1.0.4" 211 | } 212 | }, 213 | "chalk": { 214 | "version": "2.1.0", 215 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 216 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 217 | "dev": true, 218 | "requires": { 219 | "ansi-styles": "3.2.0", 220 | "escape-string-regexp": "1.0.5", 221 | "supports-color": "4.4.0" 222 | }, 223 | "dependencies": { 224 | "ansi-styles": { 225 | "version": "3.2.0", 226 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 227 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 228 | "dev": true, 229 | "requires": { 230 | "color-convert": "1.9.0" 231 | } 232 | }, 233 | "supports-color": { 234 | "version": "4.4.0", 235 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 236 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 237 | "dev": true, 238 | "requires": { 239 | "has-flag": "2.0.0" 240 | } 241 | } 242 | } 243 | }, 244 | "circular-json": { 245 | "version": "0.3.3", 246 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 247 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 248 | "dev": true 249 | }, 250 | "cli-cursor": { 251 | "version": "2.1.0", 252 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 253 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 254 | "dev": true, 255 | "requires": { 256 | "restore-cursor": "2.0.0" 257 | } 258 | }, 259 | "cli-width": { 260 | "version": "2.2.0", 261 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 262 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 263 | "dev": true 264 | }, 265 | "cliui": { 266 | "version": "2.1.0", 267 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 268 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 269 | "dev": true, 270 | "optional": true, 271 | "requires": { 272 | "center-align": "0.1.3", 273 | "right-align": "0.1.3", 274 | "wordwrap": "0.0.2" 275 | }, 276 | "dependencies": { 277 | "wordwrap": { 278 | "version": "0.0.2", 279 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 280 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 281 | "dev": true, 282 | "optional": true 283 | } 284 | } 285 | }, 286 | "co": { 287 | "version": "4.6.0", 288 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 289 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 290 | "dev": true 291 | }, 292 | "code": { 293 | "version": "4.1.0", 294 | "resolved": "https://registry.npmjs.org/code/-/code-4.1.0.tgz", 295 | "integrity": "sha1-IJrRHQWvigwceq9pTZ+k0sfZW4U=", 296 | "dev": true, 297 | "requires": { 298 | "hoek": "4.2.0" 299 | } 300 | }, 301 | "color-convert": { 302 | "version": "1.9.0", 303 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", 304 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", 305 | "dev": true, 306 | "requires": { 307 | "color-name": "1.1.3" 308 | } 309 | }, 310 | "color-name": { 311 | "version": "1.1.3", 312 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 313 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 314 | "dev": true 315 | }, 316 | "concat-map": { 317 | "version": "0.0.1", 318 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 319 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 320 | "dev": true 321 | }, 322 | "concat-stream": { 323 | "version": "1.6.0", 324 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 325 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 326 | "dev": true, 327 | "requires": { 328 | "inherits": "2.0.3", 329 | "readable-stream": "2.3.3", 330 | "typedarray": "0.0.6" 331 | } 332 | }, 333 | "core-util-is": { 334 | "version": "1.0.2", 335 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 336 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 337 | "dev": true 338 | }, 339 | "cross-spawn": { 340 | "version": "5.1.0", 341 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 342 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 343 | "dev": true, 344 | "requires": { 345 | "lru-cache": "4.1.1", 346 | "shebang-command": "1.2.0", 347 | "which": "1.3.0" 348 | } 349 | }, 350 | "debug": { 351 | "version": "3.0.1", 352 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", 353 | "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", 354 | "dev": true, 355 | "requires": { 356 | "ms": "2.0.0" 357 | } 358 | }, 359 | "decamelize": { 360 | "version": "1.2.0", 361 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 362 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 363 | "dev": true, 364 | "optional": true 365 | }, 366 | "deep-is": { 367 | "version": "0.1.3", 368 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 369 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 370 | "dev": true 371 | }, 372 | "del": { 373 | "version": "2.2.2", 374 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 375 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 376 | "dev": true, 377 | "requires": { 378 | "globby": "5.0.0", 379 | "is-path-cwd": "1.0.0", 380 | "is-path-in-cwd": "1.0.0", 381 | "object-assign": "4.1.1", 382 | "pify": "2.3.0", 383 | "pinkie-promise": "2.0.1", 384 | "rimraf": "2.6.2" 385 | } 386 | }, 387 | "diff": { 388 | "version": "3.3.1", 389 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 390 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 391 | "dev": true 392 | }, 393 | "doctrine": { 394 | "version": "2.0.0", 395 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 396 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 397 | "dev": true, 398 | "requires": { 399 | "esutils": "2.0.2", 400 | "isarray": "1.0.0" 401 | } 402 | }, 403 | "escape-string-regexp": { 404 | "version": "1.0.5", 405 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 406 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 407 | "dev": true 408 | }, 409 | "eslint": { 410 | "version": "4.7.0", 411 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.7.0.tgz", 412 | "integrity": "sha1-01/AfEclIL496Fs9oR6ZxXav1RU=", 413 | "dev": true, 414 | "requires": { 415 | "ajv": "5.2.2", 416 | "babel-code-frame": "6.26.0", 417 | "chalk": "2.1.0", 418 | "concat-stream": "1.6.0", 419 | "cross-spawn": "5.1.0", 420 | "debug": "3.0.1", 421 | "doctrine": "2.0.0", 422 | "eslint-scope": "3.7.1", 423 | "espree": "3.5.1", 424 | "esquery": "1.0.0", 425 | "estraverse": "4.2.0", 426 | "esutils": "2.0.2", 427 | "file-entry-cache": "2.0.0", 428 | "functional-red-black-tree": "1.0.1", 429 | "glob": "7.1.2", 430 | "globals": "9.18.0", 431 | "ignore": "3.3.5", 432 | "imurmurhash": "0.1.4", 433 | "inquirer": "3.2.3", 434 | "is-resolvable": "1.0.0", 435 | "js-yaml": "3.10.0", 436 | "json-stable-stringify": "1.0.1", 437 | "levn": "0.3.0", 438 | "lodash": "4.17.4", 439 | "minimatch": "3.0.4", 440 | "mkdirp": "0.5.1", 441 | "natural-compare": "1.4.0", 442 | "optionator": "0.8.2", 443 | "path-is-inside": "1.0.2", 444 | "pluralize": "7.0.0", 445 | "progress": "2.0.0", 446 | "require-uncached": "1.0.3", 447 | "semver": "5.4.1", 448 | "strip-ansi": "4.0.0", 449 | "strip-json-comments": "2.0.1", 450 | "table": "4.0.1", 451 | "text-table": "0.2.0" 452 | } 453 | }, 454 | "eslint-config-hapi": { 455 | "version": "10.1.0", 456 | "resolved": "https://registry.npmjs.org/eslint-config-hapi/-/eslint-config-hapi-10.1.0.tgz", 457 | "integrity": "sha512-tAUedyvZla1qKt6jhOx7mj5tYDVCwdSyImpEK7wk/A/atKUjg18aHUK6Q6qWWM6rq21I1F/A8JAhIpkk0SvFMQ==", 458 | "dev": true 459 | }, 460 | "eslint-config-nodesecurity": { 461 | "version": "1.3.1", 462 | "resolved": "https://registry.npmjs.org/eslint-config-nodesecurity/-/eslint-config-nodesecurity-1.3.1.tgz", 463 | "integrity": "sha1-8IAQ/DDJZPrdG0Yi5mO8Dx8P7Uk=", 464 | "dev": true, 465 | "requires": { 466 | "eslint-plugin-hapi": "4.0.0" 467 | } 468 | }, 469 | "eslint-plugin-hapi": { 470 | "version": "4.0.0", 471 | "resolved": "https://registry.npmjs.org/eslint-plugin-hapi/-/eslint-plugin-hapi-4.0.0.tgz", 472 | "integrity": "sha1-RKouRfeTmlI5Kc2DK7mqEpqV6CM=", 473 | "dev": true, 474 | "requires": { 475 | "hapi-capitalize-modules": "1.1.6", 476 | "hapi-for-you": "1.0.0", 477 | "hapi-scope-start": "2.1.1", 478 | "no-arrowception": "1.0.0" 479 | } 480 | }, 481 | "eslint-scope": { 482 | "version": "3.7.1", 483 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 484 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 485 | "dev": true, 486 | "requires": { 487 | "esrecurse": "4.2.0", 488 | "estraverse": "4.2.0" 489 | } 490 | }, 491 | "espree": { 492 | "version": "3.5.1", 493 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", 494 | "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", 495 | "dev": true, 496 | "requires": { 497 | "acorn": "5.1.2", 498 | "acorn-jsx": "3.0.1" 499 | } 500 | }, 501 | "esprima": { 502 | "version": "4.0.0", 503 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 504 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 505 | "dev": true 506 | }, 507 | "esquery": { 508 | "version": "1.0.0", 509 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 510 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 511 | "dev": true, 512 | "requires": { 513 | "estraverse": "4.2.0" 514 | } 515 | }, 516 | "esrecurse": { 517 | "version": "4.2.0", 518 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 519 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 520 | "dev": true, 521 | "requires": { 522 | "estraverse": "4.2.0", 523 | "object-assign": "4.1.1" 524 | } 525 | }, 526 | "estraverse": { 527 | "version": "4.2.0", 528 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 529 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 530 | "dev": true 531 | }, 532 | "esutils": { 533 | "version": "2.0.2", 534 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 535 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 536 | "dev": true 537 | }, 538 | "external-editor": { 539 | "version": "2.0.4", 540 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", 541 | "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", 542 | "dev": true, 543 | "requires": { 544 | "iconv-lite": "0.4.19", 545 | "jschardet": "1.5.1", 546 | "tmp": "0.0.31" 547 | } 548 | }, 549 | "fast-deep-equal": { 550 | "version": "1.0.0", 551 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 552 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 553 | "dev": true 554 | }, 555 | "fast-levenshtein": { 556 | "version": "2.0.6", 557 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 558 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 559 | "dev": true 560 | }, 561 | "figures": { 562 | "version": "2.0.0", 563 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 564 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 565 | "dev": true, 566 | "requires": { 567 | "escape-string-regexp": "1.0.5" 568 | } 569 | }, 570 | "file-entry-cache": { 571 | "version": "2.0.0", 572 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 573 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 574 | "dev": true, 575 | "requires": { 576 | "flat-cache": "1.2.2", 577 | "object-assign": "4.1.1" 578 | } 579 | }, 580 | "find-rc": { 581 | "version": "3.0.1", 582 | "resolved": "https://registry.npmjs.org/find-rc/-/find-rc-3.0.1.tgz", 583 | "integrity": "sha1-VKQXg3DxC8k3H6jRssKAmir6DM4=", 584 | "dev": true 585 | }, 586 | "flat-cache": { 587 | "version": "1.2.2", 588 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", 589 | "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", 590 | "dev": true, 591 | "requires": { 592 | "circular-json": "0.3.3", 593 | "del": "2.2.2", 594 | "graceful-fs": "4.1.11", 595 | "write": "0.2.1" 596 | } 597 | }, 598 | "fs.realpath": { 599 | "version": "1.0.0", 600 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 601 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 602 | "dev": true 603 | }, 604 | "functional-red-black-tree": { 605 | "version": "1.0.1", 606 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 607 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 608 | "dev": true 609 | }, 610 | "git-validate": { 611 | "version": "2.2.2", 612 | "resolved": "https://registry.npmjs.org/git-validate/-/git-validate-2.2.2.tgz", 613 | "integrity": "sha1-nMj/ABF3lXoRcmq1CNQVu4Cxi88=", 614 | "dev": true 615 | }, 616 | "glob": { 617 | "version": "7.1.2", 618 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 619 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 620 | "dev": true, 621 | "requires": { 622 | "fs.realpath": "1.0.0", 623 | "inflight": "1.0.6", 624 | "inherits": "2.0.3", 625 | "minimatch": "3.0.4", 626 | "once": "1.4.0", 627 | "path-is-absolute": "1.0.1" 628 | } 629 | }, 630 | "globals": { 631 | "version": "9.18.0", 632 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 633 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 634 | "dev": true 635 | }, 636 | "globby": { 637 | "version": "5.0.0", 638 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 639 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 640 | "dev": true, 641 | "requires": { 642 | "array-union": "1.0.2", 643 | "arrify": "1.0.1", 644 | "glob": "7.1.2", 645 | "object-assign": "4.1.1", 646 | "pify": "2.3.0", 647 | "pinkie-promise": "2.0.1" 648 | } 649 | }, 650 | "graceful-fs": { 651 | "version": "4.1.11", 652 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 653 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 654 | "dev": true 655 | }, 656 | "handlebars": { 657 | "version": "4.0.10", 658 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", 659 | "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", 660 | "dev": true, 661 | "requires": { 662 | "async": "1.5.2", 663 | "optimist": "0.6.1", 664 | "source-map": "0.4.4", 665 | "uglify-js": "2.8.29" 666 | }, 667 | "dependencies": { 668 | "source-map": { 669 | "version": "0.4.4", 670 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 671 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 672 | "dev": true, 673 | "requires": { 674 | "amdefine": "1.0.1" 675 | } 676 | } 677 | } 678 | }, 679 | "hapi-capitalize-modules": { 680 | "version": "1.1.6", 681 | "resolved": "https://registry.npmjs.org/hapi-capitalize-modules/-/hapi-capitalize-modules-1.1.6.tgz", 682 | "integrity": "sha1-eZEXFBXhXmqjIx5k3ac8gUZmUxg=", 683 | "dev": true 684 | }, 685 | "hapi-for-you": { 686 | "version": "1.0.0", 687 | "resolved": "https://registry.npmjs.org/hapi-for-you/-/hapi-for-you-1.0.0.tgz", 688 | "integrity": "sha1-02L77o172pwseAHiB+WlzRoLans=", 689 | "dev": true 690 | }, 691 | "hapi-scope-start": { 692 | "version": "2.1.1", 693 | "resolved": "https://registry.npmjs.org/hapi-scope-start/-/hapi-scope-start-2.1.1.tgz", 694 | "integrity": "sha1-dJWnJv5yt7yo3izcwdh82M5qtPI=", 695 | "dev": true 696 | }, 697 | "has-ansi": { 698 | "version": "2.0.0", 699 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 700 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 701 | "dev": true, 702 | "requires": { 703 | "ansi-regex": "2.1.1" 704 | } 705 | }, 706 | "has-flag": { 707 | "version": "2.0.0", 708 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 709 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 710 | "dev": true 711 | }, 712 | "hoek": { 713 | "version": "4.2.0", 714 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 715 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", 716 | "dev": true 717 | }, 718 | "iconv-lite": { 719 | "version": "0.4.19", 720 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 721 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 722 | "dev": true 723 | }, 724 | "ignore": { 725 | "version": "3.3.5", 726 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", 727 | "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", 728 | "dev": true 729 | }, 730 | "imurmurhash": { 731 | "version": "0.1.4", 732 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 733 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 734 | "dev": true 735 | }, 736 | "inflight": { 737 | "version": "1.0.6", 738 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 739 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 740 | "dev": true, 741 | "requires": { 742 | "once": "1.4.0", 743 | "wrappy": "1.0.2" 744 | } 745 | }, 746 | "inherits": { 747 | "version": "2.0.3", 748 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 749 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 750 | "dev": true 751 | }, 752 | "inquirer": { 753 | "version": "3.2.3", 754 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.3.tgz", 755 | "integrity": "sha512-Bc3KbimpDTOeQdDj18Ir/rlsGuhBSSNqdOnxaAuKhpkdnMMuKsEGbZD2v5KFF9oso2OU+BPh7+/u5obmFDRmWw==", 756 | "dev": true, 757 | "requires": { 758 | "ansi-escapes": "2.0.0", 759 | "chalk": "2.1.0", 760 | "cli-cursor": "2.1.0", 761 | "cli-width": "2.2.0", 762 | "external-editor": "2.0.4", 763 | "figures": "2.0.0", 764 | "lodash": "4.17.4", 765 | "mute-stream": "0.0.7", 766 | "run-async": "2.3.0", 767 | "rx-lite": "4.0.8", 768 | "rx-lite-aggregates": "4.0.8", 769 | "string-width": "2.1.1", 770 | "strip-ansi": "4.0.0", 771 | "through": "2.3.8" 772 | } 773 | }, 774 | "is-buffer": { 775 | "version": "1.1.5", 776 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 777 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", 778 | "dev": true 779 | }, 780 | "is-fullwidth-code-point": { 781 | "version": "2.0.0", 782 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 783 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 784 | "dev": true 785 | }, 786 | "is-path-cwd": { 787 | "version": "1.0.0", 788 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 789 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 790 | "dev": true 791 | }, 792 | "is-path-in-cwd": { 793 | "version": "1.0.0", 794 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 795 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 796 | "dev": true, 797 | "requires": { 798 | "is-path-inside": "1.0.0" 799 | } 800 | }, 801 | "is-path-inside": { 802 | "version": "1.0.0", 803 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 804 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 805 | "dev": true, 806 | "requires": { 807 | "path-is-inside": "1.0.2" 808 | } 809 | }, 810 | "is-promise": { 811 | "version": "2.1.0", 812 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 813 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 814 | "dev": true 815 | }, 816 | "is-resolvable": { 817 | "version": "1.0.0", 818 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 819 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 820 | "dev": true, 821 | "requires": { 822 | "tryit": "1.0.3" 823 | } 824 | }, 825 | "isarray": { 826 | "version": "1.0.0", 827 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 828 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 829 | "dev": true 830 | }, 831 | "isemail": { 832 | "version": "2.2.1", 833 | "resolved": "https://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz", 834 | "integrity": "sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY=", 835 | "dev": true 836 | }, 837 | "isexe": { 838 | "version": "2.0.0", 839 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 840 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 841 | "dev": true 842 | }, 843 | "items": { 844 | "version": "2.1.1", 845 | "resolved": "https://registry.npmjs.org/items/-/items-2.1.1.tgz", 846 | "integrity": "sha1-i9FtnIOxlSneWuoyGsqtp4NkoZg=", 847 | "dev": true 848 | }, 849 | "joi": { 850 | "version": "10.6.0", 851 | "resolved": "https://registry.npmjs.org/joi/-/joi-10.6.0.tgz", 852 | "integrity": "sha512-hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ==", 853 | "dev": true, 854 | "requires": { 855 | "hoek": "4.2.0", 856 | "isemail": "2.2.1", 857 | "items": "2.1.1", 858 | "topo": "2.0.2" 859 | } 860 | }, 861 | "js-tokens": { 862 | "version": "3.0.2", 863 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 864 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 865 | "dev": true 866 | }, 867 | "js-yaml": { 868 | "version": "3.10.0", 869 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 870 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 871 | "dev": true, 872 | "requires": { 873 | "argparse": "1.0.9", 874 | "esprima": "4.0.0" 875 | } 876 | }, 877 | "jschardet": { 878 | "version": "1.5.1", 879 | "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", 880 | "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", 881 | "dev": true 882 | }, 883 | "json-schema-traverse": { 884 | "version": "0.3.1", 885 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 886 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 887 | "dev": true 888 | }, 889 | "json-stable-stringify": { 890 | "version": "1.0.1", 891 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 892 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 893 | "dev": true, 894 | "requires": { 895 | "jsonify": "0.0.0" 896 | } 897 | }, 898 | "json-stringify-safe": { 899 | "version": "5.0.1", 900 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 901 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 902 | "dev": true 903 | }, 904 | "jsonify": { 905 | "version": "0.0.0", 906 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 907 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 908 | "dev": true 909 | }, 910 | "kind-of": { 911 | "version": "3.2.2", 912 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 913 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 914 | "dev": true, 915 | "requires": { 916 | "is-buffer": "1.1.5" 917 | } 918 | }, 919 | "lab": { 920 | "version": "14.2.2", 921 | "resolved": "https://registry.npmjs.org/lab/-/lab-14.2.2.tgz", 922 | "integrity": "sha512-Vw+EnK3rI2fpxX3nhU/+a24C7zCUkdj7bQJTBqwjVhq/UhoYtbpsIT4bDfgyMwpTA1NKKezPUMPg/9hcfD+CrQ==", 923 | "dev": true, 924 | "requires": { 925 | "bossy": "3.0.4", 926 | "code": "4.1.0", 927 | "diff": "3.3.1", 928 | "eslint": "4.5.0", 929 | "eslint-config-hapi": "10.1.0", 930 | "eslint-plugin-hapi": "4.0.0", 931 | "espree": "3.5.1", 932 | "find-rc": "3.0.1", 933 | "handlebars": "4.0.10", 934 | "hoek": "4.2.0", 935 | "items": "2.1.1", 936 | "json-stable-stringify": "1.0.1", 937 | "json-stringify-safe": "5.0.1", 938 | "mkdirp": "0.5.1", 939 | "seedrandom": "2.4.3", 940 | "source-map": "0.5.7", 941 | "source-map-support": "0.4.18", 942 | "supports-color": "4.4.0" 943 | }, 944 | "dependencies": { 945 | "debug": { 946 | "version": "2.6.8", 947 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 948 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 949 | "dev": true, 950 | "requires": { 951 | "ms": "2.0.0" 952 | } 953 | }, 954 | "eslint": { 955 | "version": "4.5.0", 956 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.5.0.tgz", 957 | "integrity": "sha1-u3XTuL3pf7XhPvzVOXRGd/6wGcM=", 958 | "dev": true, 959 | "requires": { 960 | "ajv": "5.2.2", 961 | "babel-code-frame": "6.26.0", 962 | "chalk": "2.1.0", 963 | "concat-stream": "1.6.0", 964 | "cross-spawn": "5.1.0", 965 | "debug": "2.6.8", 966 | "doctrine": "2.0.0", 967 | "eslint-scope": "3.7.1", 968 | "espree": "3.5.1", 969 | "esquery": "1.0.0", 970 | "estraverse": "4.2.0", 971 | "esutils": "2.0.2", 972 | "file-entry-cache": "2.0.0", 973 | "functional-red-black-tree": "1.0.1", 974 | "glob": "7.1.2", 975 | "globals": "9.18.0", 976 | "ignore": "3.3.5", 977 | "imurmurhash": "0.1.4", 978 | "inquirer": "3.2.3", 979 | "is-resolvable": "1.0.0", 980 | "js-yaml": "3.10.0", 981 | "json-stable-stringify": "1.0.1", 982 | "levn": "0.3.0", 983 | "lodash": "4.17.4", 984 | "minimatch": "3.0.4", 985 | "mkdirp": "0.5.1", 986 | "natural-compare": "1.4.0", 987 | "optionator": "0.8.2", 988 | "path-is-inside": "1.0.2", 989 | "pluralize": "4.0.0", 990 | "progress": "2.0.0", 991 | "require-uncached": "1.0.3", 992 | "semver": "5.4.1", 993 | "strip-ansi": "4.0.0", 994 | "strip-json-comments": "2.0.1", 995 | "table": "4.0.1", 996 | "text-table": "0.2.0" 997 | } 998 | }, 999 | "pluralize": { 1000 | "version": "4.0.0", 1001 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", 1002 | "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", 1003 | "dev": true 1004 | }, 1005 | "supports-color": { 1006 | "version": "4.4.0", 1007 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1008 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1009 | "dev": true, 1010 | "requires": { 1011 | "has-flag": "2.0.0" 1012 | } 1013 | } 1014 | } 1015 | }, 1016 | "lazy-cache": { 1017 | "version": "1.0.4", 1018 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1019 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1020 | "dev": true, 1021 | "optional": true 1022 | }, 1023 | "levn": { 1024 | "version": "0.3.0", 1025 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1026 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1027 | "dev": true, 1028 | "requires": { 1029 | "prelude-ls": "1.1.2", 1030 | "type-check": "0.3.2" 1031 | } 1032 | }, 1033 | "lodash": { 1034 | "version": "4.17.4", 1035 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1036 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1037 | "dev": true 1038 | }, 1039 | "longest": { 1040 | "version": "1.0.1", 1041 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1042 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1043 | "dev": true 1044 | }, 1045 | "lru-cache": { 1046 | "version": "4.1.1", 1047 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 1048 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 1049 | "dev": true, 1050 | "requires": { 1051 | "pseudomap": "1.0.2", 1052 | "yallist": "2.1.2" 1053 | } 1054 | }, 1055 | "mimic-fn": { 1056 | "version": "1.1.0", 1057 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", 1058 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", 1059 | "dev": true 1060 | }, 1061 | "minimatch": { 1062 | "version": "3.0.4", 1063 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1064 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1065 | "dev": true, 1066 | "requires": { 1067 | "brace-expansion": "1.1.8" 1068 | } 1069 | }, 1070 | "minimist": { 1071 | "version": "0.0.8", 1072 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1073 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1074 | "dev": true 1075 | }, 1076 | "mkdirp": { 1077 | "version": "0.5.1", 1078 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1079 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1080 | "dev": true, 1081 | "requires": { 1082 | "minimist": "0.0.8" 1083 | } 1084 | }, 1085 | "ms": { 1086 | "version": "2.0.0", 1087 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1088 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1089 | "dev": true 1090 | }, 1091 | "mute-stream": { 1092 | "version": "0.0.7", 1093 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1094 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1095 | "dev": true 1096 | }, 1097 | "natural-compare": { 1098 | "version": "1.4.0", 1099 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1100 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1101 | "dev": true 1102 | }, 1103 | "no-arrowception": { 1104 | "version": "1.0.0", 1105 | "resolved": "https://registry.npmjs.org/no-arrowception/-/no-arrowception-1.0.0.tgz", 1106 | "integrity": "sha1-W/PpXrnEG1c4SoBTM9qjtzTuMno=", 1107 | "dev": true 1108 | }, 1109 | "object-assign": { 1110 | "version": "4.1.1", 1111 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1112 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1113 | "dev": true 1114 | }, 1115 | "once": { 1116 | "version": "1.4.0", 1117 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1118 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1119 | "dev": true, 1120 | "requires": { 1121 | "wrappy": "1.0.2" 1122 | } 1123 | }, 1124 | "onetime": { 1125 | "version": "2.0.1", 1126 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1127 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1128 | "dev": true, 1129 | "requires": { 1130 | "mimic-fn": "1.1.0" 1131 | } 1132 | }, 1133 | "optimist": { 1134 | "version": "0.6.1", 1135 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1136 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1137 | "dev": true, 1138 | "requires": { 1139 | "minimist": "0.0.8", 1140 | "wordwrap": "0.0.3" 1141 | }, 1142 | "dependencies": { 1143 | "wordwrap": { 1144 | "version": "0.0.3", 1145 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1146 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1147 | "dev": true 1148 | } 1149 | } 1150 | }, 1151 | "optionator": { 1152 | "version": "0.8.2", 1153 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1154 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1155 | "dev": true, 1156 | "requires": { 1157 | "deep-is": "0.1.3", 1158 | "fast-levenshtein": "2.0.6", 1159 | "levn": "0.3.0", 1160 | "prelude-ls": "1.1.2", 1161 | "type-check": "0.3.2", 1162 | "wordwrap": "1.0.0" 1163 | } 1164 | }, 1165 | "os-tmpdir": { 1166 | "version": "1.0.2", 1167 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1168 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1169 | "dev": true 1170 | }, 1171 | "path-is-absolute": { 1172 | "version": "1.0.1", 1173 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1174 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1175 | "dev": true 1176 | }, 1177 | "path-is-inside": { 1178 | "version": "1.0.2", 1179 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1180 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1181 | "dev": true 1182 | }, 1183 | "pify": { 1184 | "version": "2.3.0", 1185 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1186 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1187 | "dev": true 1188 | }, 1189 | "pinkie": { 1190 | "version": "2.0.4", 1191 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1192 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1193 | "dev": true 1194 | }, 1195 | "pinkie-promise": { 1196 | "version": "2.0.1", 1197 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1198 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1199 | "dev": true, 1200 | "requires": { 1201 | "pinkie": "2.0.4" 1202 | } 1203 | }, 1204 | "pluralize": { 1205 | "version": "7.0.0", 1206 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1207 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1208 | "dev": true 1209 | }, 1210 | "prelude-ls": { 1211 | "version": "1.1.2", 1212 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1213 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1214 | "dev": true 1215 | }, 1216 | "process-nextick-args": { 1217 | "version": "1.0.7", 1218 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1219 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1220 | "dev": true 1221 | }, 1222 | "progress": { 1223 | "version": "2.0.0", 1224 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1225 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1226 | "dev": true 1227 | }, 1228 | "pseudomap": { 1229 | "version": "1.0.2", 1230 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1231 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1232 | "dev": true 1233 | }, 1234 | "readable-stream": { 1235 | "version": "2.3.3", 1236 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1237 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1238 | "dev": true, 1239 | "requires": { 1240 | "core-util-is": "1.0.2", 1241 | "inherits": "2.0.3", 1242 | "isarray": "1.0.0", 1243 | "process-nextick-args": "1.0.7", 1244 | "safe-buffer": "5.1.1", 1245 | "string_decoder": "1.0.3", 1246 | "util-deprecate": "1.0.2" 1247 | } 1248 | }, 1249 | "repeat-string": { 1250 | "version": "1.6.1", 1251 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1252 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1253 | "dev": true 1254 | }, 1255 | "require-uncached": { 1256 | "version": "1.0.3", 1257 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1258 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1259 | "dev": true, 1260 | "requires": { 1261 | "caller-path": "0.1.0", 1262 | "resolve-from": "1.0.1" 1263 | } 1264 | }, 1265 | "resolve-from": { 1266 | "version": "1.0.1", 1267 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1268 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1269 | "dev": true 1270 | }, 1271 | "restore-cursor": { 1272 | "version": "2.0.0", 1273 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1274 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1275 | "dev": true, 1276 | "requires": { 1277 | "onetime": "2.0.1", 1278 | "signal-exit": "3.0.2" 1279 | } 1280 | }, 1281 | "right-align": { 1282 | "version": "0.1.3", 1283 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1284 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1285 | "dev": true, 1286 | "optional": true, 1287 | "requires": { 1288 | "align-text": "0.1.4" 1289 | } 1290 | }, 1291 | "rimraf": { 1292 | "version": "2.6.2", 1293 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1294 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1295 | "dev": true, 1296 | "requires": { 1297 | "glob": "7.1.2" 1298 | } 1299 | }, 1300 | "run-async": { 1301 | "version": "2.3.0", 1302 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1303 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1304 | "dev": true, 1305 | "requires": { 1306 | "is-promise": "2.1.0" 1307 | } 1308 | }, 1309 | "rx-lite": { 1310 | "version": "4.0.8", 1311 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1312 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1313 | "dev": true 1314 | }, 1315 | "rx-lite-aggregates": { 1316 | "version": "4.0.8", 1317 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1318 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1319 | "dev": true, 1320 | "requires": { 1321 | "rx-lite": "4.0.8" 1322 | } 1323 | }, 1324 | "safe-buffer": { 1325 | "version": "5.1.1", 1326 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1327 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1328 | "dev": true 1329 | }, 1330 | "seedrandom": { 1331 | "version": "2.4.3", 1332 | "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", 1333 | "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=", 1334 | "dev": true 1335 | }, 1336 | "semver": { 1337 | "version": "5.4.1", 1338 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 1339 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 1340 | "dev": true 1341 | }, 1342 | "shebang-command": { 1343 | "version": "1.2.0", 1344 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1345 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1346 | "dev": true, 1347 | "requires": { 1348 | "shebang-regex": "1.0.0" 1349 | } 1350 | }, 1351 | "shebang-regex": { 1352 | "version": "1.0.0", 1353 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1354 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1355 | "dev": true 1356 | }, 1357 | "signal-exit": { 1358 | "version": "3.0.2", 1359 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1360 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1361 | "dev": true 1362 | }, 1363 | "slice-ansi": { 1364 | "version": "0.0.4", 1365 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 1366 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 1367 | "dev": true 1368 | }, 1369 | "source-map": { 1370 | "version": "0.5.7", 1371 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1372 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1373 | "dev": true 1374 | }, 1375 | "source-map-support": { 1376 | "version": "0.4.18", 1377 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1378 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1379 | "dev": true, 1380 | "requires": { 1381 | "source-map": "0.5.7" 1382 | } 1383 | }, 1384 | "sprintf-js": { 1385 | "version": "1.0.3", 1386 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1387 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1388 | "dev": true 1389 | }, 1390 | "string-width": { 1391 | "version": "2.1.1", 1392 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1393 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1394 | "dev": true, 1395 | "requires": { 1396 | "is-fullwidth-code-point": "2.0.0", 1397 | "strip-ansi": "4.0.0" 1398 | } 1399 | }, 1400 | "string_decoder": { 1401 | "version": "1.0.3", 1402 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1403 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1404 | "dev": true, 1405 | "requires": { 1406 | "safe-buffer": "5.1.1" 1407 | } 1408 | }, 1409 | "strip-ansi": { 1410 | "version": "4.0.0", 1411 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1412 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1413 | "dev": true, 1414 | "requires": { 1415 | "ansi-regex": "3.0.0" 1416 | }, 1417 | "dependencies": { 1418 | "ansi-regex": { 1419 | "version": "3.0.0", 1420 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1421 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1422 | "dev": true 1423 | } 1424 | } 1425 | }, 1426 | "strip-json-comments": { 1427 | "version": "2.0.1", 1428 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1429 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1430 | "dev": true 1431 | }, 1432 | "supports-color": { 1433 | "version": "2.0.0", 1434 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1435 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1436 | "dev": true 1437 | }, 1438 | "table": { 1439 | "version": "4.0.1", 1440 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", 1441 | "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", 1442 | "dev": true, 1443 | "requires": { 1444 | "ajv": "4.11.8", 1445 | "ajv-keywords": "1.5.1", 1446 | "chalk": "1.1.3", 1447 | "lodash": "4.17.4", 1448 | "slice-ansi": "0.0.4", 1449 | "string-width": "2.1.1" 1450 | }, 1451 | "dependencies": { 1452 | "ajv": { 1453 | "version": "4.11.8", 1454 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 1455 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 1456 | "dev": true, 1457 | "requires": { 1458 | "co": "4.6.0", 1459 | "json-stable-stringify": "1.0.1" 1460 | } 1461 | }, 1462 | "chalk": { 1463 | "version": "1.1.3", 1464 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1465 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1466 | "dev": true, 1467 | "requires": { 1468 | "ansi-styles": "2.2.1", 1469 | "escape-string-regexp": "1.0.5", 1470 | "has-ansi": "2.0.0", 1471 | "strip-ansi": "3.0.1", 1472 | "supports-color": "2.0.0" 1473 | } 1474 | }, 1475 | "strip-ansi": { 1476 | "version": "3.0.1", 1477 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1478 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1479 | "dev": true, 1480 | "requires": { 1481 | "ansi-regex": "2.1.1" 1482 | } 1483 | } 1484 | } 1485 | }, 1486 | "text-table": { 1487 | "version": "0.2.0", 1488 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1489 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1490 | "dev": true 1491 | }, 1492 | "through": { 1493 | "version": "2.3.8", 1494 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1495 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1496 | "dev": true 1497 | }, 1498 | "tmp": { 1499 | "version": "0.0.31", 1500 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", 1501 | "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", 1502 | "dev": true, 1503 | "requires": { 1504 | "os-tmpdir": "1.0.2" 1505 | } 1506 | }, 1507 | "topo": { 1508 | "version": "2.0.2", 1509 | "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", 1510 | "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", 1511 | "dev": true, 1512 | "requires": { 1513 | "hoek": "4.2.0" 1514 | } 1515 | }, 1516 | "tryit": { 1517 | "version": "1.0.3", 1518 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 1519 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 1520 | "dev": true 1521 | }, 1522 | "type-check": { 1523 | "version": "0.3.2", 1524 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1525 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1526 | "dev": true, 1527 | "requires": { 1528 | "prelude-ls": "1.1.2" 1529 | } 1530 | }, 1531 | "typedarray": { 1532 | "version": "0.0.6", 1533 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1534 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1535 | "dev": true 1536 | }, 1537 | "uglify-js": { 1538 | "version": "2.8.29", 1539 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 1540 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 1541 | "dev": true, 1542 | "optional": true, 1543 | "requires": { 1544 | "source-map": "0.5.7", 1545 | "uglify-to-browserify": "1.0.2", 1546 | "yargs": "3.10.0" 1547 | } 1548 | }, 1549 | "uglify-to-browserify": { 1550 | "version": "1.0.2", 1551 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1552 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1553 | "dev": true, 1554 | "optional": true 1555 | }, 1556 | "util-deprecate": { 1557 | "version": "1.0.2", 1558 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1559 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1560 | "dev": true 1561 | }, 1562 | "which": { 1563 | "version": "1.3.0", 1564 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 1565 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 1566 | "dev": true, 1567 | "requires": { 1568 | "isexe": "2.0.0" 1569 | } 1570 | }, 1571 | "window-size": { 1572 | "version": "0.1.0", 1573 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1574 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 1575 | "dev": true, 1576 | "optional": true 1577 | }, 1578 | "wordwrap": { 1579 | "version": "1.0.0", 1580 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1581 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1582 | "dev": true 1583 | }, 1584 | "wrappy": { 1585 | "version": "1.0.2", 1586 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1587 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1588 | "dev": true 1589 | }, 1590 | "write": { 1591 | "version": "0.2.1", 1592 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1593 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1594 | "dev": true, 1595 | "requires": { 1596 | "mkdirp": "0.5.1" 1597 | } 1598 | }, 1599 | "yallist": { 1600 | "version": "2.1.2", 1601 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1602 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1603 | "dev": true 1604 | }, 1605 | "yargs": { 1606 | "version": "3.10.0", 1607 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1608 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1609 | "dev": true, 1610 | "optional": true, 1611 | "requires": { 1612 | "camelcase": "1.2.1", 1613 | "cliui": "2.1.0", 1614 | "decamelize": "1.2.0", 1615 | "window-size": "0.1.0" 1616 | } 1617 | } 1618 | } 1619 | } 1620 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodesecurity-npm-utils", 3 | "version": "6.0.0", 4 | "author": "^lift security", 5 | "dependencies": {}, 6 | "devDependencies": { 7 | "code": "^4.1.0", 8 | "eslint": "^4.7.0", 9 | "eslint-config-nodesecurity": "^1.3.1", 10 | "eslint-plugin-hapi": "^4.0.0", 11 | "git-validate": "^2.1.4", 12 | "lab": "^14.2.2" 13 | }, 14 | "keywords": [ 15 | "npm", 16 | "package", 17 | "nsp", 18 | "security", 19 | "shrinkwrap" 20 | ], 21 | "license": "MIT", 22 | "main": "index.js", 23 | "pre-commit": [ 24 | "lint", 25 | "test" 26 | ], 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/nodesecurity/npm-utils.git" 30 | }, 31 | "scripts": { 32 | "test": "lab -a code -L -t 100", 33 | "lint": "eslint ." 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/fixtures.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const internals = {}; 4 | 5 | internals.shrinkwrap = { 6 | name: 'testmodule', 7 | version: '1.0.0', 8 | dependencies: { 9 | 'submodule-a': { 10 | version: '2.0.0', 11 | dependencies: { 12 | 'submodule-b': { 13 | version: '3.0.0' 14 | } 15 | } 16 | } 17 | } 18 | }; 19 | 20 | internals.multiversionShrinkwrap = { 21 | name: 'multiversion', 22 | version: '1.0.0', 23 | dependencies: { 24 | marked: { 25 | version: '0.3.4' 26 | }, 27 | 'meta-marked': { 28 | version: '0.2.1', 29 | dependencies: { 30 | marked: { 31 | version: '0.3.0' 32 | } 33 | } 34 | } 35 | } 36 | }; 37 | 38 | internals.multidependencyShrinkwrap = { 39 | name: 'multidependency', 40 | version: '1.0.0', 41 | dependencies: { 42 | marked: { 43 | version: '0.3.4' 44 | }, 45 | 'meta-marked': { 46 | version: '0.2.1', 47 | dependencies: { 48 | marked: { 49 | version: '0.3.4' 50 | } 51 | } 52 | } 53 | } 54 | }; 55 | 56 | module.exports = internals; 57 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const lab = exports.lab = require('lab').script(); 4 | const expect = require('code').expect; 5 | 6 | const describe = lab.describe; 7 | const it = lab.it; 8 | 9 | const NpmUtils = require('../'); 10 | const Fixtures = require('./fixtures'); 11 | 12 | describe('getShrinkwrapDependencies', () => { 13 | 14 | it('gets dependencies', () => { 15 | 16 | return NpmUtils.getShrinkwrapDependencies(Fixtures.shrinkwrap).then((results) => { 17 | 18 | expect(results).to.only.include(['testmodule@1.0.0', 'submodule-a@2.0.0', 'submodule-b@3.0.0']); 19 | 20 | expect(results['testmodule@1.0.0']).to.equal({ 21 | name: 'testmodule', version: '1.0.0', 22 | paths: [['testmodule@1.0.0']] 23 | }); 24 | 25 | expect(results['submodule-a@2.0.0']).to.equal({ 26 | name: 'submodule-a', version: '2.0.0', 27 | paths: [['testmodule@1.0.0', 'submodule-a@2.0.0']] 28 | }); 29 | 30 | expect(results['submodule-b@3.0.0']).to.equal({ 31 | name: 'submodule-b', version: '3.0.0', 32 | paths: [['testmodule@1.0.0', 'submodule-a@2.0.0', 'submodule-b@3.0.0']] 33 | }); 34 | }); 35 | }); 36 | 37 | it('shrinkwrap with multiple dependencies of same module', () => { 38 | 39 | return NpmUtils.getShrinkwrapDependencies(Fixtures.multiversionShrinkwrap).then((results) => { 40 | 41 | expect(results).to.only.include(['multiversion@1.0.0', 'marked@0.3.4', 'marked@0.3.0', 'meta-marked@0.2.1']); 42 | 43 | expect(results['multiversion@1.0.0']).to.equal({ 44 | name: 'multiversion',version: '1.0.0', 45 | paths: [['multiversion@1.0.0']] 46 | }); 47 | 48 | expect(results['marked@0.3.4']).to.equal({ 49 | name: 'marked', version: '0.3.4', 50 | paths: [['multiversion@1.0.0','marked@0.3.4']] 51 | }); 52 | 53 | expect(results['marked@0.3.0']).to.equal({ 54 | name: 'marked', version: '0.3.0', 55 | paths: [['multiversion@1.0.0', 'meta-marked@0.2.1', 'marked@0.3.0']] 56 | }); 57 | 58 | expect(results['meta-marked@0.2.1']).to.equal({ 59 | name: 'meta-marked', version: '0.2.1', 60 | paths: [['multiversion@1.0.0', 'meta-marked@0.2.1']] 61 | }); 62 | }); 63 | }); 64 | 65 | it('shrinkwrap with a dependency in multiple places', () => { 66 | 67 | return NpmUtils.getShrinkwrapDependencies(Fixtures.multidependencyShrinkwrap).then((results) => { 68 | 69 | expect(results).to.only.include(['multidependency@1.0.0', 'marked@0.3.4', 'meta-marked@0.2.1']); 70 | 71 | expect(results['multidependency@1.0.0']).to.equal({ 72 | name: 'multidependency',version: '1.0.0', 73 | paths: [['multidependency@1.0.0']] 74 | }); 75 | 76 | expect(results['marked@0.3.4']).to.equal({ 77 | name: 'marked', version: '0.3.4', 78 | paths: [['multidependency@1.0.0', 'marked@0.3.4'], ['multidependency@1.0.0', 'meta-marked@0.2.1', 'marked@0.3.4']] 79 | }); 80 | 81 | expect(results['meta-marked@0.2.1']).to.equal({ 82 | name: 'meta-marked', version: '0.2.1', 83 | paths: [['multidependency@1.0.0', 'meta-marked@0.2.1']] 84 | }); 85 | }); 86 | }); 87 | }); 88 | --------------------------------------------------------------------------------