├── .codeclimate.yml ├── .gitignore ├── .snyk ├── LICENSE ├── README.md ├── bin └── setup ├── circle.yml ├── index.js ├── main.js ├── package-lock.json ├── package.json ├── src ├── client.py ├── log.js ├── nlp.js ├── py │ ├── __init__.py │ └── nlp.py └── start-io.js └── test ├── mocha.opts └── test.js /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | engines: 2 | duplication: 3 | enabled: true 4 | config: 5 | languages: 6 | - javascript 7 | - python 8 | fixme: 9 | enabled: true 10 | eslint: 11 | enabled: true 12 | checks: 13 | no-process-exit: 14 | enabled: false 15 | radon: 16 | enabled: true 17 | config: 18 | threshold: "C" 19 | pep8: 20 | enabled: true 21 | 22 | ratings: 23 | paths: 24 | - "**.js" 25 | - "**.jsx" 26 | - "**.py" 27 | 28 | exclude_paths: 29 | - test/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build and Release Folders 2 | bin-debug/ 3 | bin-release/ 4 | node_modules/ 5 | coverage/ 6 | logs/ 7 | npm-debug.log* 8 | 9 | # Python 10 | pyenv/ 11 | __pycache__/ 12 | *.py[cod] 13 | *$py.class 14 | 15 | # Other files and folders 16 | .settings/ 17 | .tmp/ 18 | .vscode 19 | .prettierrc 20 | 21 | # System files 22 | .DS_Store 23 | -------------------------------------------------------------------------------- /.snyk: -------------------------------------------------------------------------------- 1 | # Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. 2 | version: v1.7.1 3 | ignore: {} 4 | # patches apply the minimum changes required to fix a vulnerability 5 | patch: 6 | 'npm:debug:20170905': 7 | - poly-socketio > socket.io-client > engine.io-client > debug: 8 | patched: '2017-09-30T07:19:03.165Z' 9 | - poly-socketio > socket.io > debug: 10 | patched: '2017-09-30T07:19:03.165Z' 11 | - poly-socketio > socket.io > socket.io-adapter > debug: 12 | patched: '2017-09-30T07:19:03.165Z' 13 | - poly-socketio > socket.io > socket.io-client > debug: 14 | patched: '2017-09-30T07:19:03.165Z' 15 | - poly-socketio > socket.io-client > debug: 16 | patched: '2017-09-30T07:19:03.165Z' 17 | - poly-socketio > socket.io > engine.io > debug: 18 | patched: '2017-09-30T07:19:03.165Z' 19 | - poly-socketio > socket.io > socket.io-client > engine.io-client > debug: 20 | patched: '2017-09-30T07:19:03.165Z' 21 | - poly-socketio > socket.io > socket.io-parser > debug: 22 | patched: '2017-09-30T07:19:03.165Z' 23 | - poly-socketio > socket.io-client > socket.io-parser > debug: 24 | patched: '2017-09-30T07:19:03.165Z' 25 | - poly-socketio > socket.io > socket.io-adapter > socket.io-parser > debug: 26 | patched: '2017-09-30T07:19:03.165Z' 27 | - poly-socketio > socket.io > socket.io-client > socket.io-parser > debug: 28 | patched: '2017-09-30T07:19:03.165Z' 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Wah Loon Keng 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spacy-nlp [![npm version](https://badge.fury.io/js/spacy-nlp.svg)](https://badge.fury.io/js/spacy-nlp) [![CircleCI](https://circleci.com/gh/kengz/spacy-nlp.svg?style=shield)](https://circleci.com/gh/kengz/spacy-nlp) [![Code Climate](https://codeclimate.com/github/kengz/spacy-nlp/badges/gpa.svg)](https://codeclimate.com/github/kengz/spacy-nlp) [![Test Coverage](https://codeclimate.com/github/kengz/spacy-nlp/badges/coverage.svg)](https://codeclimate.com/github/kengz/spacy-nlp/coverage) 2 | 3 | Expose Spacy nlp text parsing to Nodejs (and other languages) via socketIO 4 | 5 | 6 | 7 | - [Installation](#installation) 8 | - [Usage](#usage) 9 | - [Methods](#methods) 10 | - [Syntax Parsing](#syntax-parsing) 11 | - [Noun Parsing](#noun-parsing) 12 | - [Verb Parsing](#verb-parsing) 13 | - [Adjective Parsing](#adjective-parsing) 14 | - [Named Entity Parsing](#named-entity-parsing) 15 | - [Date Parsing](#date-parsing) 16 | - [Time Parsing](#time-parsing) 17 | - [Helpers](#helpers) 18 | - [Splitting Large Text](#splitting-large-text) 19 | - [Duplicate Removal](#duplicate-removal) 20 | - [Top n Words in a String](#top-n-words-in-a-string) 21 | 22 | 23 | 24 | ## Installation 25 | 26 | ```shell 27 | # install spacy in python3 28 | python3 -m pip install -U socketIO-client-nexus 29 | python3 -m pip install -U spacy==2.1.3 30 | python3 -m spacy download en_core_web_md 31 | 32 | # install this npm package 33 | npm i --save spacy-nlp 34 | ``` 35 | 36 | ## Usage 37 | 38 | ```js 39 | const spacyNLP = require("spacy-nlp"); 40 | // default port 6466 41 | // start the server with the python client that exposes spacyIO (or use an existing socketIO server at IOPORT) 42 | var serverPromise = spacyNLP.server({ port: process.env.IOPORT }); 43 | // Loading spacy may take up to 15s 44 | ``` 45 | 46 | _Note that `python3` is preferred. If you use `python2`, at each run set the env var `USE_PY2=true`._ 47 | 48 | You'll see log like: 49 | 50 | ```shell 51 | [Sun Oct 09 2016 16:53:33 GMT-0400 (EDT)] INFO Starting poly-socketio server on port: 6466, expecting 1 IO clients 52 | [Sun Oct 09 2016 16:53:33 GMT-0400 (EDT)] INFO Starting socketIO client for python3 at 6466 53 | [Sun Oct 09 2016 16:53:44 GMT-0400 (EDT)] DEBUG cgkb-py mXjDqupv852zUeMPAAAA joined, 0 remains 54 | [Sun Oct 09 2016 16:53:44 GMT-0400 (EDT)] INFO All 1 IO clients have joined 55 | ``` 56 | 57 | Since it uses [`poly-socketio`](https://github.com/kengz/poly-socketio), there'll be one IO server, and one `global.client`(internal to this module) in the same process, no matter how many times `poly-socketio` is called. This resolves conflicts for cross-project usage. 58 | 59 | E.g. [`AIVA`](https://github.com/kengz/aiva) uses `poly-socketio` to start a server for its internal cross-language communication, and uses `spacy-nlp` too. `spacy-nlp` will automatically use the IO server and the `global.client` from `AIVA`. 60 | 61 | ## Methods 62 | 63 | ### Syntax Parsing 64 | 65 | Once it is ready, i.e. you can use the nodejs client `nlp` to parse texts: 66 | 67 | ```js 68 | const spacyNLP = require("spacy-nlp"); 69 | const nlp = spacyNLP.nlp; 70 | 71 | // Note you can pass multiple sentences concat in one string. 72 | nlp.parse("Bob Brought the pizza to Alice.").then(output => { 73 | console.log(output); 74 | console.log(JSON.stringify(output[0].parse_tree, null, 2)); 75 | }); 76 | 77 | // Store output into variable 78 | const result = await nlp.parse("Bob Brought the pizza to Alice."); 79 | ``` 80 | 81 | And the output is the syntax parse tree with POS tagging. For the `parse_tree`, `NE` means `Named Entity` for NER; `arc` of an object is incident on it. An arc points from `head` word to `modifier` word. See the explanation on [Tensorflow/syntaxnet](https://github.com/tensorflow/models/tree/master/syntaxnet#dependency-parsing-transition-based-parsing). 82 | 83 | ```shell 84 | [ { text: 'Bob Brought the pizza to Alice.', 85 | len: 7, 86 | tokens: [ 'Bob', 'Brought', 'the', 'pizza', 'to', 'Alice', '.' ], 87 | noun_phrases: [ 'Bob', 'the pizza', 'Alice' ], 88 | parse_tree: 89 | [ { word: 'Brought', 90 | lemma: 'bring', 91 | NE: '', 92 | POS_fine: 'VBD', 93 | POS_coarse: 'VERB', 94 | arc: 'ROOT', 95 | modifiers: 96 | [ { word: 'Bob', 97 | lemma: 'Bob', 98 | NE: 'PERSON', 99 | POS_fine: 'NNP', 100 | POS_coarse: 'PROPN', 101 | arc: 'nsubj', 102 | modifiers: [] }, 103 | { word: 'pizza', 104 | lemma: 'pizza', 105 | NE: '', 106 | POS_fine: 'NN', 107 | POS_coarse: 'NOUN', 108 | arc: 'dobj', 109 | modifiers: 110 | [ { word: 'the', 111 | lemma: 'the', 112 | NE: '', 113 | POS_fine: 'DT', 114 | POS_coarse: 'DET', 115 | arc: 'det', 116 | modifiers: [] } ] }, 117 | { word: 'to', 118 | lemma: 'to', 119 | NE: '', 120 | POS_fine: 'IN', 121 | POS_coarse: 'ADP', 122 | arc: 'prep', 123 | modifiers: 124 | [ { word: 'Alice', 125 | lemma: 'Alice', 126 | NE: 'PERSON', 127 | POS_fine: 'NNP', 128 | POS_coarse: 'PROPN', 129 | arc: 'pobj', 130 | modifiers: [] } ] }, 131 | { word: '.', 132 | lemma: '.', 133 | NE: '', 134 | POS_fine: '.', 135 | POS_coarse: 'PUNCT', 136 | arc: 'punct', 137 | modifiers: [] } ] } ], 138 | parse_list: 139 | [ { word: 'Bob', 140 | lemma: 'Bob', 141 | NE: 'PERSON', 142 | POS_fine: 'NNP', 143 | POS_coarse: 'PROPN' }, 144 | { word: 'Brought', 145 | lemma: 'bring', 146 | NE: '', 147 | POS_fine: 'VBD', 148 | POS_coarse: 'VERB' }, 149 | { word: 'the', 150 | lemma: 'the', 151 | NE: '', 152 | POS_fine: 'DT', 153 | POS_coarse: 'DET' }, 154 | { word: 'pizza', 155 | lemma: 'pizza', 156 | NE: '', 157 | POS_fine: 'NN', 158 | POS_coarse: 'NOUN' }, 159 | { word: 'to', 160 | lemma: 'to', 161 | NE: '', 162 | POS_fine: 'IN', 163 | POS_coarse: 'ADP' }, 164 | { word: 'Alice', 165 | lemma: 'Alice', 166 | NE: 'PERSON', 167 | POS_fine: 'NNP', 168 | POS_coarse: 'PROPN' }, 169 | { word: '.', 170 | lemma: '.', 171 | NE: '', 172 | POS_fine: '.', 173 | POS_coarse: 'PUNCT' } ] } ] 174 | ``` 175 | 176 | ### Noun Parsing 177 | 178 | ```js 179 | // Available options are count (returns the total count) and words (returns the parsed strings) You can specify one or both. 180 | const options = ["count"]; 181 | 182 | // Note you can pass multiple sentences concat in one string. 183 | nlp 184 | .parse_nouns( 185 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 186 | options 187 | ) 188 | .then(output => { 189 | console.log(output); 190 | }); 191 | 192 | // Store output into variable 193 | const result = await nlp.parse_nouns( 194 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 195 | options 196 | ); 197 | 198 | // 19 199 | ``` 200 | 201 | ### Verb Parsing 202 | 203 | ```js 204 | // Available options are count (returns the total count) and words (returns the parsed strings) You can specify one or both. 205 | const options = ["count"]; 206 | 207 | // Note you can pass multiple sentences concat in one string. 208 | nlp 209 | .parse_verbs( 210 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 211 | options 212 | ) 213 | .then(output => { 214 | console.log(output); 215 | }); 216 | 217 | // Store output into variable 218 | const result = await nlp.parse_verbs( 219 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 220 | options 221 | ); 222 | 223 | // 7 224 | ``` 225 | 226 | ### Adjective Parsing 227 | 228 | ```js 229 | // Available options are count (returns the total count) and words (returns the parsed strings) You can specify one or both. 230 | const options = ["count"]; 231 | 232 | // Note you can pass multiple sentences concat in one string. 233 | nlp 234 | .parse_adj( 235 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 236 | options 237 | ) 238 | .then(output => { 239 | console.log(output); 240 | }); 241 | 242 | // Store output into variable 243 | const result = await nlp.parse_adj( 244 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 245 | options 246 | ); 247 | 248 | // 8 249 | ``` 250 | 251 | ### Named Entity Parsing 252 | 253 | ```js 254 | // Available options are count (returns the total count) and words (returns the parsed strings) You can specify one or both. 255 | const options = ["count"]; 256 | 257 | // Note you can pass multiple sentences concat in one string. 258 | nlp 259 | .parse_named_entities( 260 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 261 | options 262 | ) 263 | .then(output => { 264 | console.log(output); 265 | }); 266 | 267 | // Store output into variable 268 | const result = await nlp.parse_named_entities( 269 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 270 | options 271 | ); 272 | 273 | // 8 274 | ``` 275 | 276 | ### Date Parsing 277 | 278 | ```js 279 | // Available options are count (returns the total count) and words (returns the parsed strings) You can specify one or both. 280 | const options = ["words"]; 281 | 282 | // Note you can pass multiple sentences concat in one string. 283 | nlp 284 | .parse_date( 285 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 286 | options 287 | ) 288 | .then(output => { 289 | console.log(output); 290 | }); 291 | 292 | // Store output into variable 293 | const result = await nlp.parse_date( 294 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 295 | options 296 | ); 297 | 298 | // ['22 June 1941', 'from 1939 to 1945'] 299 | ``` 300 | 301 | ### Time Parsing 302 | 303 | ```js 304 | // Available options are count (returns the total count) and words (returns the parsed strings) You can specify one or both. 305 | const options = ["count"]; 306 | 307 | // Note you can pass multiple sentences concat in one string. 308 | nlp 309 | .parse_time( 310 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 311 | options 312 | ) 313 | .then(output => { 314 | console.log(output); 315 | }); 316 | 317 | // Store output into variable 318 | const result = await nlp.parse_time( 319 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 320 | options 321 | ); 322 | 323 | // 0 324 | ``` 325 | 326 | ## Helpers 327 | 328 | The following helper functions are not asynchronous and will not return a promise. 329 | 330 | ### Splitting Large Text 331 | 332 | If you have very large text to process, it's best to split the text as Spacy has a max_length limit of 1,000,000 characters. 333 | 334 | ```js 335 | const text = 336 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945."; 337 | 338 | const textArray = nlp.split_text(text); 339 | 340 | // ["On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of", "war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often", "abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945."] 341 | ``` 342 | 343 | ### Duplicate Removal 344 | 345 | If you want to return an array of words, the result will include duplicate strings. To remove duplicates you can use `nlp.remove_duplicates`. 346 | 347 | ```js 348 | const text = 349 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945."; 350 | 351 | const verbArray = await nlp.parse_verbs(text); 352 | // ["war", "war", "war", "war", "war", "world", "world", "world", "axis", "axis", "ww2", "wwii", "land", "wehrmacht", "union", "powers", "attrition"] 353 | 354 | const result = nlp.remove_duplicates(verbArray); 355 | 356 | // ["war", "world", "axis", "ww2", "wwii", "land", "wehrmacht", "union", "powers", "attrition"] 357 | ``` 358 | 359 | ### Top n Words in a String 360 | 361 | ```js 362 | const text = 363 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945."; 364 | 365 | // Arguments are text and cutoff (Top n Words). Returns an array of objects. 366 | const result = nlp.top_words(text, 5); 367 | 368 | [ 369 | { word: "the", count: 6 }, 370 | { word: "of", count: 3 }, 371 | { word: "war", count: 3 }, 372 | { word: "Axis", count: 2 }, 373 | { word: "a", count: 2 } 374 | ]; 375 | ``` 376 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This script runs the same sequence as the CircleCI build 3 | 4 | if [ $(uname) == "Darwin" ]; then 5 | if which brew >/dev/null; then 6 | echo "Brew is already installed" 7 | else 8 | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 9 | fi 10 | fi 11 | 12 | # install nodejs 13 | if which node >/dev/null; then 14 | echo "Nodejs is already installed" 15 | else 16 | if [ $(uname) == "Darwin" ]; then 17 | brew install node 18 | else 19 | curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - 20 | sudo apt-get install -y nodejs 21 | fi 22 | fi 23 | 24 | # install python 25 | if which python3 >/dev/null; then 26 | echo "Python3 is already installed" 27 | else 28 | if [ $(uname) == "Darwin" ]; then 29 | brew install python3 30 | else 31 | sudo apt-get -y install python3-dev python3-pip python3-setuptools build-essential 32 | fi 33 | fi 34 | 35 | # install pip modules 36 | if python3 -m pip show spacy socketIO-client-nexus >/dev/null; then 37 | echo "Pip modules already installed" 38 | else 39 | python3 -m pip install -U socketIO-client-nexus 40 | python3 -m pip install -U spacy 41 | fi 42 | 43 | if python3 -m spacy info | grep en_core_web_md >/dev/null; then 44 | echo "spaCy model already installed" 45 | else 46 | python3 -m spacy download en_core_web_md 47 | fi 48 | 49 | # install npm modules 50 | if [ -d ./node_modules ]; then 51 | echo "Npm modules already installed" 52 | else 53 | npm install 54 | fi 55 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | python: 3 | version: 3.5.1 4 | node: 5 | version: 6 6 | environment: 7 | CODECLIMATE_REPO_TOKEN: 27bc491e0afef43347ae439a8e489f565a597493230aee70a460f19fb14bbdca 8 | 9 | dependencies: 10 | override: 11 | - pip install socketIO-client 12 | - pip install spacy 13 | - python -m spacy download en_core_web_md 14 | - npm install 15 | 16 | test: 17 | override: 18 | - npm test 19 | post: 20 | - cat ./coverage/lcov.info | ./node_modules/.bin/codeclimate-test-reporter 21 | 22 | general: 23 | branches: 24 | ignore: 25 | - gh-pages 26 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const server = require(path.join(__dirname, "src", "start-io")); 3 | const nlp = require(path.join(__dirname, "src", "nlp")); 4 | 5 | module.exports = { 6 | server: server, 7 | nlp: nlp 8 | }; 9 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const spacyNLP = require("./index.js"); 2 | 3 | const serverPromise = spacyNLP.server({ port: 9551 }); 4 | const nlpSpacy = spacyNLP.nlp; 5 | 6 | const options = ["words"]; 7 | 8 | setTimeout(() => { 9 | nlpSpacy 10 | .parse_nouns( 11 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 12 | options 13 | ) 14 | .then(output => { 15 | console.log(output); 16 | }); 17 | }, 15000); 18 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spacy-nlp", 3 | "version": "1.0.10", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@snyk/dep-graph": { 8 | "version": "1.4.0", 9 | "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.4.0.tgz", 10 | "integrity": "sha512-dz4Fo4L9sN0Rt8hMe+zMYZ4mAiljtyIeWvujLyCxhIT5iHSlceUYlba5TDsOFuKyuZKkuhVjORWY1oFEuRzCcA==", 11 | "requires": { 12 | "graphlib": "^2.1.5", 13 | "lodash": "^4", 14 | "source-map-support": "^0.5.9", 15 | "tslib": "^1.9.3" 16 | } 17 | }, 18 | "@snyk/gemfile": { 19 | "version": "1.2.0", 20 | "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", 21 | "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==" 22 | }, 23 | "@yarnpkg/lockfile": { 24 | "version": "1.1.0", 25 | "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", 26 | "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" 27 | }, 28 | "abbrev": { 29 | "version": "1.1.1", 30 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 31 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 32 | }, 33 | "accepts": { 34 | "version": "1.3.5", 35 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 36 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 37 | "requires": { 38 | "mime-types": "~2.1.18", 39 | "negotiator": "0.6.1" 40 | } 41 | }, 42 | "after": { 43 | "version": "0.8.2", 44 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 45 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 46 | }, 47 | "agent-base": { 48 | "version": "4.2.1", 49 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", 50 | "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", 51 | "requires": { 52 | "es6-promisify": "^5.0.0" 53 | } 54 | }, 55 | "ajv": { 56 | "version": "6.10.0", 57 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 58 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 59 | "dev": true, 60 | "requires": { 61 | "fast-deep-equal": "^2.0.1", 62 | "fast-json-stable-stringify": "^2.0.0", 63 | "json-schema-traverse": "^0.4.1", 64 | "uri-js": "^4.2.2" 65 | } 66 | }, 67 | "amdefine": { 68 | "version": "1.0.1", 69 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 70 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 71 | "dev": true, 72 | "optional": true 73 | }, 74 | "ansi-align": { 75 | "version": "2.0.0", 76 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 77 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 78 | "requires": { 79 | "string-width": "^2.0.0" 80 | } 81 | }, 82 | "ansi-escapes": { 83 | "version": "3.2.0", 84 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 85 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 86 | }, 87 | "ansi-regex": { 88 | "version": "3.0.0", 89 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 90 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 91 | }, 92 | "ansi-styles": { 93 | "version": "3.2.1", 94 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 95 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 96 | "requires": { 97 | "color-convert": "^1.9.0" 98 | } 99 | }, 100 | "ansicolors": { 101 | "version": "0.3.2", 102 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", 103 | "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" 104 | }, 105 | "archy": { 106 | "version": "1.0.0", 107 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 108 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" 109 | }, 110 | "argparse": { 111 | "version": "1.0.10", 112 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 113 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 114 | "requires": { 115 | "sprintf-js": "~1.0.2" 116 | } 117 | }, 118 | "array-flatten": { 119 | "version": "1.1.1", 120 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 121 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 122 | }, 123 | "arraybuffer.slice": { 124 | "version": "0.0.7", 125 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 126 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 127 | }, 128 | "asap": { 129 | "version": "2.0.6", 130 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 131 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 132 | }, 133 | "asn1": { 134 | "version": "0.2.4", 135 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 136 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 137 | "dev": true, 138 | "requires": { 139 | "safer-buffer": "~2.1.0" 140 | } 141 | }, 142 | "assert-plus": { 143 | "version": "1.0.0", 144 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 145 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 146 | "dev": true 147 | }, 148 | "assertion-error": { 149 | "version": "1.1.0", 150 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 151 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 152 | "dev": true 153 | }, 154 | "ast-types": { 155 | "version": "0.12.2", 156 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.2.tgz", 157 | "integrity": "sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==" 158 | }, 159 | "async": { 160 | "version": "1.5.2", 161 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 162 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 163 | }, 164 | "async-limiter": { 165 | "version": "1.0.0", 166 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 167 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 168 | }, 169 | "asynckit": { 170 | "version": "0.4.0", 171 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 172 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 173 | "dev": true 174 | }, 175 | "aws-sign2": { 176 | "version": "0.7.0", 177 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 178 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 179 | "dev": true 180 | }, 181 | "aws4": { 182 | "version": "1.8.0", 183 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 184 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 185 | "dev": true 186 | }, 187 | "backo2": { 188 | "version": "1.0.2", 189 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 190 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 191 | }, 192 | "balanced-match": { 193 | "version": "1.0.0", 194 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 195 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 196 | }, 197 | "base64-arraybuffer": { 198 | "version": "0.1.5", 199 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 200 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 201 | }, 202 | "base64id": { 203 | "version": "1.0.0", 204 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 205 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" 206 | }, 207 | "bcrypt-pbkdf": { 208 | "version": "1.0.2", 209 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 210 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 211 | "dev": true, 212 | "requires": { 213 | "tweetnacl": "^0.14.3" 214 | } 215 | }, 216 | "better-assert": { 217 | "version": "1.0.2", 218 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 219 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 220 | "requires": { 221 | "callsite": "1.0.0" 222 | } 223 | }, 224 | "blob": { 225 | "version": "0.0.5", 226 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 227 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 228 | }, 229 | "bluebird": { 230 | "version": "3.5.3", 231 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", 232 | "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" 233 | }, 234 | "body-parser": { 235 | "version": "1.18.3", 236 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 237 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 238 | "requires": { 239 | "bytes": "3.0.0", 240 | "content-type": "~1.0.4", 241 | "debug": "2.6.9", 242 | "depd": "~1.1.2", 243 | "http-errors": "~1.6.3", 244 | "iconv-lite": "0.4.23", 245 | "on-finished": "~2.3.0", 246 | "qs": "6.5.2", 247 | "raw-body": "2.3.3", 248 | "type-is": "~1.6.16" 249 | } 250 | }, 251 | "boxen": { 252 | "version": "1.3.0", 253 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", 254 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", 255 | "requires": { 256 | "ansi-align": "^2.0.0", 257 | "camelcase": "^4.0.0", 258 | "chalk": "^2.0.1", 259 | "cli-boxes": "^1.0.0", 260 | "string-width": "^2.0.0", 261 | "term-size": "^1.2.0", 262 | "widest-line": "^2.0.0" 263 | }, 264 | "dependencies": { 265 | "camelcase": { 266 | "version": "4.1.0", 267 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 268 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 269 | } 270 | } 271 | }, 272 | "brace-expansion": { 273 | "version": "1.1.11", 274 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 275 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 276 | "requires": { 277 | "balanced-match": "^1.0.0", 278 | "concat-map": "0.0.1" 279 | } 280 | }, 281 | "browser-stdout": { 282 | "version": "1.3.0", 283 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 284 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 285 | "dev": true 286 | }, 287 | "buffer-from": { 288 | "version": "1.1.1", 289 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 290 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 291 | }, 292 | "bytes": { 293 | "version": "3.0.0", 294 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 295 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 296 | }, 297 | "callsite": { 298 | "version": "1.0.0", 299 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 300 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" 301 | }, 302 | "camelcase": { 303 | "version": "2.1.1", 304 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 305 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 306 | }, 307 | "capture-stack-trace": { 308 | "version": "1.0.1", 309 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 310 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" 311 | }, 312 | "caseless": { 313 | "version": "0.12.0", 314 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 315 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 316 | "dev": true 317 | }, 318 | "chai": { 319 | "version": "3.5.0", 320 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 321 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 322 | "dev": true, 323 | "requires": { 324 | "assertion-error": "^1.0.1", 325 | "deep-eql": "^0.1.3", 326 | "type-detect": "^1.0.0" 327 | } 328 | }, 329 | "chai-as-promised": { 330 | "version": "7.1.1", 331 | "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", 332 | "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", 333 | "dev": true, 334 | "requires": { 335 | "check-error": "^1.0.2" 336 | } 337 | }, 338 | "chalk": { 339 | "version": "2.4.2", 340 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 341 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 342 | "requires": { 343 | "ansi-styles": "^3.2.1", 344 | "escape-string-regexp": "^1.0.5", 345 | "supports-color": "^5.3.0" 346 | } 347 | }, 348 | "chardet": { 349 | "version": "0.4.2", 350 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 351 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" 352 | }, 353 | "check-error": { 354 | "version": "1.0.2", 355 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 356 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 357 | "dev": true 358 | }, 359 | "ci-info": { 360 | "version": "1.6.0", 361 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", 362 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" 363 | }, 364 | "cli-boxes": { 365 | "version": "1.0.0", 366 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 367 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" 368 | }, 369 | "cli-cursor": { 370 | "version": "2.1.0", 371 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 372 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 373 | "requires": { 374 | "restore-cursor": "^2.0.0" 375 | } 376 | }, 377 | "cli-width": { 378 | "version": "2.2.0", 379 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 380 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 381 | }, 382 | "cliui": { 383 | "version": "3.2.0", 384 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 385 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 386 | "requires": { 387 | "string-width": "^1.0.1", 388 | "strip-ansi": "^3.0.1", 389 | "wrap-ansi": "^2.0.0" 390 | }, 391 | "dependencies": { 392 | "ansi-regex": { 393 | "version": "2.1.1", 394 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 395 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 396 | }, 397 | "is-fullwidth-code-point": { 398 | "version": "1.0.0", 399 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 400 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 401 | "requires": { 402 | "number-is-nan": "^1.0.0" 403 | } 404 | }, 405 | "string-width": { 406 | "version": "1.0.2", 407 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 408 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 409 | "requires": { 410 | "code-point-at": "^1.0.0", 411 | "is-fullwidth-code-point": "^1.0.0", 412 | "strip-ansi": "^3.0.0" 413 | } 414 | }, 415 | "strip-ansi": { 416 | "version": "3.0.1", 417 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 418 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 419 | "requires": { 420 | "ansi-regex": "^2.0.0" 421 | } 422 | } 423 | } 424 | }, 425 | "clone-deep": { 426 | "version": "0.3.0", 427 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", 428 | "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", 429 | "requires": { 430 | "for-own": "^1.0.0", 431 | "is-plain-object": "^2.0.1", 432 | "kind-of": "^3.2.2", 433 | "shallow-clone": "^0.1.2" 434 | } 435 | }, 436 | "co": { 437 | "version": "4.6.0", 438 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 439 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 440 | }, 441 | "code-point-at": { 442 | "version": "1.1.0", 443 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 444 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 445 | }, 446 | "codeclimate-test-reporter": { 447 | "version": "0.5.1", 448 | "resolved": "https://registry.npmjs.org/codeclimate-test-reporter/-/codeclimate-test-reporter-0.5.1.tgz", 449 | "integrity": "sha512-XCzmc8dH+R4orK11BCg5pBbXc35abxq9sept4YvUFRkFl9zb9MIVRrCKENe6U1TKAMTgvGJmrYyHn0y2lerpmg==", 450 | "dev": true, 451 | "requires": { 452 | "async": "~1.5.2", 453 | "commander": "2.9.0", 454 | "lcov-parse": "0.0.10", 455 | "request": "~2.88.0" 456 | } 457 | }, 458 | "color-convert": { 459 | "version": "1.9.3", 460 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 461 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 462 | "requires": { 463 | "color-name": "1.1.3" 464 | } 465 | }, 466 | "color-name": { 467 | "version": "1.1.3", 468 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 469 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 470 | }, 471 | "colors": { 472 | "version": "1.0.3", 473 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 474 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 475 | }, 476 | "combined-stream": { 477 | "version": "1.0.7", 478 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 479 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 480 | "dev": true, 481 | "requires": { 482 | "delayed-stream": "~1.0.0" 483 | } 484 | }, 485 | "commander": { 486 | "version": "2.9.0", 487 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 488 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 489 | "dev": true, 490 | "requires": { 491 | "graceful-readlink": ">= 1.0.0" 492 | } 493 | }, 494 | "component-bind": { 495 | "version": "1.0.0", 496 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 497 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 498 | }, 499 | "component-emitter": { 500 | "version": "1.2.1", 501 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 502 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 503 | }, 504 | "component-inherit": { 505 | "version": "0.0.3", 506 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 507 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 508 | }, 509 | "concat-map": { 510 | "version": "0.0.1", 511 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 512 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 513 | }, 514 | "configstore": { 515 | "version": "3.1.2", 516 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 517 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 518 | "requires": { 519 | "dot-prop": "^4.1.0", 520 | "graceful-fs": "^4.1.2", 521 | "make-dir": "^1.0.0", 522 | "unique-string": "^1.0.0", 523 | "write-file-atomic": "^2.0.0", 524 | "xdg-basedir": "^3.0.0" 525 | } 526 | }, 527 | "content-disposition": { 528 | "version": "0.5.2", 529 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 530 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 531 | }, 532 | "content-type": { 533 | "version": "1.0.4", 534 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 535 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 536 | }, 537 | "cookie": { 538 | "version": "0.3.1", 539 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 540 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 541 | }, 542 | "cookie-signature": { 543 | "version": "1.0.6", 544 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 545 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 546 | }, 547 | "core-util-is": { 548 | "version": "1.0.2", 549 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 550 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 551 | }, 552 | "create-error-class": { 553 | "version": "3.0.2", 554 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 555 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 556 | "requires": { 557 | "capture-stack-trace": "^1.0.0" 558 | } 559 | }, 560 | "cross-spawn": { 561 | "version": "6.0.5", 562 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 563 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 564 | "requires": { 565 | "nice-try": "^1.0.4", 566 | "path-key": "^2.0.1", 567 | "semver": "^5.5.0", 568 | "shebang-command": "^1.2.0", 569 | "which": "^1.2.9" 570 | } 571 | }, 572 | "crypto-random-string": { 573 | "version": "1.0.0", 574 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 575 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 576 | }, 577 | "cycle": { 578 | "version": "1.0.3", 579 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 580 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 581 | }, 582 | "dashdash": { 583 | "version": "1.14.1", 584 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 585 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 586 | "dev": true, 587 | "requires": { 588 | "assert-plus": "^1.0.0" 589 | } 590 | }, 591 | "data-uri-to-buffer": { 592 | "version": "1.2.0", 593 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", 594 | "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" 595 | }, 596 | "debug": { 597 | "version": "2.6.9", 598 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 599 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 600 | "requires": { 601 | "ms": "2.0.0" 602 | } 603 | }, 604 | "decamelize": { 605 | "version": "1.2.0", 606 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 607 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 608 | }, 609 | "deep-eql": { 610 | "version": "0.1.3", 611 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 612 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 613 | "dev": true, 614 | "requires": { 615 | "type-detect": "0.1.1" 616 | }, 617 | "dependencies": { 618 | "type-detect": { 619 | "version": "0.1.1", 620 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 621 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 622 | "dev": true 623 | } 624 | } 625 | }, 626 | "deep-extend": { 627 | "version": "0.6.0", 628 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 629 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 630 | }, 631 | "deep-is": { 632 | "version": "0.1.3", 633 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 634 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 635 | }, 636 | "degenerator": { 637 | "version": "1.0.4", 638 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", 639 | "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", 640 | "requires": { 641 | "ast-types": "0.x.x", 642 | "escodegen": "1.x.x", 643 | "esprima": "3.x.x" 644 | } 645 | }, 646 | "delayed-stream": { 647 | "version": "1.0.0", 648 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 649 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 650 | "dev": true 651 | }, 652 | "depd": { 653 | "version": "1.1.2", 654 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 655 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 656 | }, 657 | "destroy": { 658 | "version": "1.0.4", 659 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 660 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 661 | }, 662 | "diff": { 663 | "version": "4.0.1", 664 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 665 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" 666 | }, 667 | "dockerfile-ast": { 668 | "version": "0.0.12", 669 | "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.12.tgz", 670 | "integrity": "sha512-cIV8oXkAxpIuN5XgG0TGg07nLDgrj4olkfrdT77OTA3VypscsYHBUg/FjHxW9K3oA+CyH4Th/qtoMgTVpzSobw==", 671 | "requires": { 672 | "vscode-languageserver-types": "^3.5.0" 673 | } 674 | }, 675 | "dot-prop": { 676 | "version": "4.2.0", 677 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 678 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 679 | "requires": { 680 | "is-obj": "^1.0.0" 681 | } 682 | }, 683 | "duplexer3": { 684 | "version": "0.1.4", 685 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 686 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 687 | }, 688 | "ecc-jsbn": { 689 | "version": "0.1.2", 690 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 691 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 692 | "dev": true, 693 | "requires": { 694 | "jsbn": "~0.1.0", 695 | "safer-buffer": "^2.1.0" 696 | } 697 | }, 698 | "ee-first": { 699 | "version": "1.1.1", 700 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 701 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 702 | }, 703 | "email-validator": { 704 | "version": "2.0.4", 705 | "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", 706 | "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" 707 | }, 708 | "encodeurl": { 709 | "version": "1.0.2", 710 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 711 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 712 | }, 713 | "engine.io": { 714 | "version": "3.3.2", 715 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz", 716 | "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==", 717 | "requires": { 718 | "accepts": "~1.3.4", 719 | "base64id": "1.0.0", 720 | "cookie": "0.3.1", 721 | "debug": "~3.1.0", 722 | "engine.io-parser": "~2.1.0", 723 | "ws": "~6.1.0" 724 | }, 725 | "dependencies": { 726 | "debug": { 727 | "version": "3.1.0", 728 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 729 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 730 | "requires": { 731 | "ms": "2.0.0" 732 | } 733 | } 734 | } 735 | }, 736 | "engine.io-client": { 737 | "version": "3.3.2", 738 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", 739 | "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", 740 | "requires": { 741 | "component-emitter": "1.2.1", 742 | "component-inherit": "0.0.3", 743 | "debug": "~3.1.0", 744 | "engine.io-parser": "~2.1.1", 745 | "has-cors": "1.1.0", 746 | "indexof": "0.0.1", 747 | "parseqs": "0.0.5", 748 | "parseuri": "0.0.5", 749 | "ws": "~6.1.0", 750 | "xmlhttprequest-ssl": "~1.5.4", 751 | "yeast": "0.1.2" 752 | }, 753 | "dependencies": { 754 | "debug": { 755 | "version": "3.1.0", 756 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 757 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 758 | "requires": { 759 | "ms": "2.0.0" 760 | } 761 | } 762 | } 763 | }, 764 | "engine.io-parser": { 765 | "version": "2.1.3", 766 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", 767 | "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", 768 | "requires": { 769 | "after": "0.8.2", 770 | "arraybuffer.slice": "~0.0.7", 771 | "base64-arraybuffer": "0.1.5", 772 | "blob": "0.0.5", 773 | "has-binary2": "~1.0.2" 774 | } 775 | }, 776 | "es6-promise": { 777 | "version": "4.2.6", 778 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", 779 | "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" 780 | }, 781 | "es6-promisify": { 782 | "version": "5.0.0", 783 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 784 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 785 | "requires": { 786 | "es6-promise": "^4.0.3" 787 | } 788 | }, 789 | "escape-html": { 790 | "version": "1.0.3", 791 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 792 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 793 | }, 794 | "escape-string-regexp": { 795 | "version": "1.0.5", 796 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 797 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 798 | }, 799 | "escodegen": { 800 | "version": "1.11.1", 801 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", 802 | "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", 803 | "requires": { 804 | "esprima": "^3.1.3", 805 | "estraverse": "^4.2.0", 806 | "esutils": "^2.0.2", 807 | "optionator": "^0.8.1", 808 | "source-map": "~0.6.1" 809 | } 810 | }, 811 | "esprima": { 812 | "version": "3.1.3", 813 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 814 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 815 | }, 816 | "estraverse": { 817 | "version": "4.2.0", 818 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 819 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 820 | }, 821 | "esutils": { 822 | "version": "2.0.2", 823 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 824 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 825 | }, 826 | "etag": { 827 | "version": "1.8.1", 828 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 829 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 830 | }, 831 | "execa": { 832 | "version": "0.10.0", 833 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", 834 | "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", 835 | "requires": { 836 | "cross-spawn": "^6.0.0", 837 | "get-stream": "^3.0.0", 838 | "is-stream": "^1.1.0", 839 | "npm-run-path": "^2.0.0", 840 | "p-finally": "^1.0.0", 841 | "signal-exit": "^3.0.0", 842 | "strip-eof": "^1.0.0" 843 | } 844 | }, 845 | "express": { 846 | "version": "4.16.4", 847 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 848 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 849 | "requires": { 850 | "accepts": "~1.3.5", 851 | "array-flatten": "1.1.1", 852 | "body-parser": "1.18.3", 853 | "content-disposition": "0.5.2", 854 | "content-type": "~1.0.4", 855 | "cookie": "0.3.1", 856 | "cookie-signature": "1.0.6", 857 | "debug": "2.6.9", 858 | "depd": "~1.1.2", 859 | "encodeurl": "~1.0.2", 860 | "escape-html": "~1.0.3", 861 | "etag": "~1.8.1", 862 | "finalhandler": "1.1.1", 863 | "fresh": "0.5.2", 864 | "merge-descriptors": "1.0.1", 865 | "methods": "~1.1.2", 866 | "on-finished": "~2.3.0", 867 | "parseurl": "~1.3.2", 868 | "path-to-regexp": "0.1.7", 869 | "proxy-addr": "~2.0.4", 870 | "qs": "6.5.2", 871 | "range-parser": "~1.2.0", 872 | "safe-buffer": "5.1.2", 873 | "send": "0.16.2", 874 | "serve-static": "1.13.2", 875 | "setprototypeof": "1.1.0", 876 | "statuses": "~1.4.0", 877 | "type-is": "~1.6.16", 878 | "utils-merge": "1.0.1", 879 | "vary": "~1.1.2" 880 | } 881 | }, 882 | "extend": { 883 | "version": "3.0.2", 884 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 885 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 886 | }, 887 | "external-editor": { 888 | "version": "2.2.0", 889 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 890 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 891 | "requires": { 892 | "chardet": "^0.4.0", 893 | "iconv-lite": "^0.4.17", 894 | "tmp": "^0.0.33" 895 | } 896 | }, 897 | "extsprintf": { 898 | "version": "1.3.0", 899 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 900 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 901 | "dev": true 902 | }, 903 | "eyes": { 904 | "version": "0.1.8", 905 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 906 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 907 | }, 908 | "fast-deep-equal": { 909 | "version": "2.0.1", 910 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 911 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 912 | "dev": true 913 | }, 914 | "fast-json-stable-stringify": { 915 | "version": "2.0.0", 916 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 917 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 918 | "dev": true 919 | }, 920 | "fast-levenshtein": { 921 | "version": "2.0.6", 922 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 923 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 924 | }, 925 | "figures": { 926 | "version": "2.0.0", 927 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 928 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 929 | "requires": { 930 | "escape-string-regexp": "^1.0.5" 931 | } 932 | }, 933 | "file-uri-to-path": { 934 | "version": "1.0.0", 935 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 936 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 937 | }, 938 | "finalhandler": { 939 | "version": "1.1.1", 940 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 941 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 942 | "requires": { 943 | "debug": "2.6.9", 944 | "encodeurl": "~1.0.2", 945 | "escape-html": "~1.0.3", 946 | "on-finished": "~2.3.0", 947 | "parseurl": "~1.3.2", 948 | "statuses": "~1.4.0", 949 | "unpipe": "~1.0.0" 950 | } 951 | }, 952 | "for-in": { 953 | "version": "1.0.2", 954 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 955 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 956 | }, 957 | "for-own": { 958 | "version": "1.0.0", 959 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 960 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 961 | "requires": { 962 | "for-in": "^1.0.1" 963 | } 964 | }, 965 | "forever-agent": { 966 | "version": "0.6.1", 967 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 968 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 969 | "dev": true 970 | }, 971 | "form-data": { 972 | "version": "2.3.3", 973 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 974 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 975 | "dev": true, 976 | "requires": { 977 | "asynckit": "^0.4.0", 978 | "combined-stream": "^1.0.6", 979 | "mime-types": "^2.1.12" 980 | } 981 | }, 982 | "forwarded": { 983 | "version": "0.1.2", 984 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 985 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 986 | }, 987 | "fresh": { 988 | "version": "0.5.2", 989 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 990 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 991 | }, 992 | "fs.realpath": { 993 | "version": "1.0.0", 994 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 995 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 996 | "dev": true 997 | }, 998 | "ftp": { 999 | "version": "0.3.10", 1000 | "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", 1001 | "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", 1002 | "requires": { 1003 | "readable-stream": "1.1.x", 1004 | "xregexp": "2.0.0" 1005 | }, 1006 | "dependencies": { 1007 | "readable-stream": { 1008 | "version": "1.1.14", 1009 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1010 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1011 | "requires": { 1012 | "core-util-is": "~1.0.0", 1013 | "inherits": "~2.0.1", 1014 | "isarray": "0.0.1", 1015 | "string_decoder": "~0.10.x" 1016 | } 1017 | } 1018 | } 1019 | }, 1020 | "get-stream": { 1021 | "version": "3.0.0", 1022 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 1023 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 1024 | }, 1025 | "get-uri": { 1026 | "version": "2.0.2", 1027 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", 1028 | "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", 1029 | "requires": { 1030 | "data-uri-to-buffer": "1", 1031 | "debug": "2", 1032 | "extend": "3", 1033 | "file-uri-to-path": "1", 1034 | "ftp": "~0.3.10", 1035 | "readable-stream": "2" 1036 | } 1037 | }, 1038 | "getpass": { 1039 | "version": "0.1.7", 1040 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1041 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1042 | "dev": true, 1043 | "requires": { 1044 | "assert-plus": "^1.0.0" 1045 | } 1046 | }, 1047 | "glob": { 1048 | "version": "5.0.15", 1049 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1050 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1051 | "dev": true, 1052 | "requires": { 1053 | "inflight": "^1.0.4", 1054 | "inherits": "2", 1055 | "minimatch": "2 || 3", 1056 | "once": "^1.3.0", 1057 | "path-is-absolute": "^1.0.0" 1058 | } 1059 | }, 1060 | "global-dirs": { 1061 | "version": "0.1.1", 1062 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 1063 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1064 | "requires": { 1065 | "ini": "^1.3.4" 1066 | } 1067 | }, 1068 | "got": { 1069 | "version": "6.7.1", 1070 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 1071 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 1072 | "requires": { 1073 | "create-error-class": "^3.0.0", 1074 | "duplexer3": "^0.1.4", 1075 | "get-stream": "^3.0.0", 1076 | "is-redirect": "^1.0.0", 1077 | "is-retry-allowed": "^1.0.0", 1078 | "is-stream": "^1.0.0", 1079 | "lowercase-keys": "^1.0.0", 1080 | "safe-buffer": "^5.0.1", 1081 | "timed-out": "^4.0.0", 1082 | "unzip-response": "^2.0.1", 1083 | "url-parse-lax": "^1.0.0" 1084 | } 1085 | }, 1086 | "graceful-fs": { 1087 | "version": "4.1.15", 1088 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1089 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 1090 | }, 1091 | "graceful-readlink": { 1092 | "version": "1.0.1", 1093 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 1094 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 1095 | "dev": true 1096 | }, 1097 | "graphlib": { 1098 | "version": "2.1.7", 1099 | "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz", 1100 | "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==", 1101 | "requires": { 1102 | "lodash": "^4.17.5" 1103 | } 1104 | }, 1105 | "growl": { 1106 | "version": "1.9.2", 1107 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 1108 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 1109 | "dev": true 1110 | }, 1111 | "handlebars": { 1112 | "version": "4.1.1", 1113 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", 1114 | "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", 1115 | "dev": true, 1116 | "requires": { 1117 | "neo-async": "^2.6.0", 1118 | "optimist": "^0.6.1", 1119 | "source-map": "^0.6.1", 1120 | "uglify-js": "^3.1.4" 1121 | } 1122 | }, 1123 | "har-schema": { 1124 | "version": "2.0.0", 1125 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1126 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 1127 | "dev": true 1128 | }, 1129 | "har-validator": { 1130 | "version": "5.1.3", 1131 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1132 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1133 | "dev": true, 1134 | "requires": { 1135 | "ajv": "^6.5.5", 1136 | "har-schema": "^2.0.0" 1137 | } 1138 | }, 1139 | "has-binary2": { 1140 | "version": "1.0.3", 1141 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 1142 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 1143 | "requires": { 1144 | "isarray": "2.0.1" 1145 | }, 1146 | "dependencies": { 1147 | "isarray": { 1148 | "version": "2.0.1", 1149 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 1150 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 1151 | } 1152 | } 1153 | }, 1154 | "has-cors": { 1155 | "version": "1.1.0", 1156 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 1157 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 1158 | }, 1159 | "has-flag": { 1160 | "version": "3.0.0", 1161 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1162 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1163 | }, 1164 | "hosted-git-info": { 1165 | "version": "2.7.1", 1166 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 1167 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 1168 | }, 1169 | "http-errors": { 1170 | "version": "1.6.3", 1171 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1172 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1173 | "requires": { 1174 | "depd": "~1.1.2", 1175 | "inherits": "2.0.3", 1176 | "setprototypeof": "1.1.0", 1177 | "statuses": ">= 1.4.0 < 2" 1178 | } 1179 | }, 1180 | "http-proxy-agent": { 1181 | "version": "2.1.0", 1182 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 1183 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 1184 | "requires": { 1185 | "agent-base": "4", 1186 | "debug": "3.1.0" 1187 | }, 1188 | "dependencies": { 1189 | "debug": { 1190 | "version": "3.1.0", 1191 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1192 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1193 | "requires": { 1194 | "ms": "2.0.0" 1195 | } 1196 | } 1197 | } 1198 | }, 1199 | "http-signature": { 1200 | "version": "1.2.0", 1201 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1202 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1203 | "dev": true, 1204 | "requires": { 1205 | "assert-plus": "^1.0.0", 1206 | "jsprim": "^1.2.2", 1207 | "sshpk": "^1.7.0" 1208 | } 1209 | }, 1210 | "https-proxy-agent": { 1211 | "version": "2.2.1", 1212 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 1213 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 1214 | "requires": { 1215 | "agent-base": "^4.1.0", 1216 | "debug": "^3.1.0" 1217 | }, 1218 | "dependencies": { 1219 | "debug": { 1220 | "version": "3.2.6", 1221 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1222 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1223 | "requires": { 1224 | "ms": "^2.1.1" 1225 | } 1226 | }, 1227 | "ms": { 1228 | "version": "2.1.1", 1229 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1230 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1231 | } 1232 | } 1233 | }, 1234 | "iconv-lite": { 1235 | "version": "0.4.23", 1236 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 1237 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 1238 | "requires": { 1239 | "safer-buffer": ">= 2.1.2 < 3" 1240 | } 1241 | }, 1242 | "immediate": { 1243 | "version": "3.0.6", 1244 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1245 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" 1246 | }, 1247 | "import-lazy": { 1248 | "version": "2.1.0", 1249 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 1250 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 1251 | }, 1252 | "imurmurhash": { 1253 | "version": "0.1.4", 1254 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1255 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1256 | }, 1257 | "indexof": { 1258 | "version": "0.0.1", 1259 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1260 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 1261 | }, 1262 | "inflight": { 1263 | "version": "1.0.6", 1264 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1265 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1266 | "dev": true, 1267 | "requires": { 1268 | "once": "^1.3.0", 1269 | "wrappy": "1" 1270 | } 1271 | }, 1272 | "inherits": { 1273 | "version": "2.0.3", 1274 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1275 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1276 | }, 1277 | "ini": { 1278 | "version": "1.3.5", 1279 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1280 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1281 | }, 1282 | "inquirer": { 1283 | "version": "3.3.0", 1284 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 1285 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 1286 | "requires": { 1287 | "ansi-escapes": "^3.0.0", 1288 | "chalk": "^2.0.0", 1289 | "cli-cursor": "^2.1.0", 1290 | "cli-width": "^2.0.0", 1291 | "external-editor": "^2.0.4", 1292 | "figures": "^2.0.0", 1293 | "lodash": "^4.3.0", 1294 | "mute-stream": "0.0.7", 1295 | "run-async": "^2.2.0", 1296 | "rx-lite": "^4.0.8", 1297 | "rx-lite-aggregates": "^4.0.8", 1298 | "string-width": "^2.1.0", 1299 | "strip-ansi": "^4.0.0", 1300 | "through": "^2.3.6" 1301 | } 1302 | }, 1303 | "invert-kv": { 1304 | "version": "1.0.0", 1305 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1306 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1307 | }, 1308 | "ip": { 1309 | "version": "1.1.5", 1310 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 1311 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 1312 | }, 1313 | "ipaddr.js": { 1314 | "version": "1.8.0", 1315 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 1316 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 1317 | }, 1318 | "is-buffer": { 1319 | "version": "1.1.6", 1320 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1321 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1322 | }, 1323 | "is-ci": { 1324 | "version": "1.2.1", 1325 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", 1326 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", 1327 | "requires": { 1328 | "ci-info": "^1.5.0" 1329 | } 1330 | }, 1331 | "is-extendable": { 1332 | "version": "0.1.1", 1333 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1334 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1335 | }, 1336 | "is-fullwidth-code-point": { 1337 | "version": "2.0.0", 1338 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1339 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1340 | }, 1341 | "is-installed-globally": { 1342 | "version": "0.1.0", 1343 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 1344 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 1345 | "requires": { 1346 | "global-dirs": "^0.1.0", 1347 | "is-path-inside": "^1.0.0" 1348 | } 1349 | }, 1350 | "is-npm": { 1351 | "version": "1.0.0", 1352 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 1353 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" 1354 | }, 1355 | "is-number-like": { 1356 | "version": "1.0.8", 1357 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", 1358 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", 1359 | "requires": { 1360 | "lodash.isfinite": "^3.3.2" 1361 | } 1362 | }, 1363 | "is-obj": { 1364 | "version": "1.0.1", 1365 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1366 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 1367 | }, 1368 | "is-path-inside": { 1369 | "version": "1.0.1", 1370 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1371 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1372 | "requires": { 1373 | "path-is-inside": "^1.0.1" 1374 | } 1375 | }, 1376 | "is-plain-object": { 1377 | "version": "2.0.4", 1378 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1379 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1380 | "requires": { 1381 | "isobject": "^3.0.1" 1382 | } 1383 | }, 1384 | "is-promise": { 1385 | "version": "2.1.0", 1386 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1387 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 1388 | }, 1389 | "is-redirect": { 1390 | "version": "1.0.0", 1391 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 1392 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" 1393 | }, 1394 | "is-retry-allowed": { 1395 | "version": "1.1.0", 1396 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", 1397 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" 1398 | }, 1399 | "is-stream": { 1400 | "version": "1.1.0", 1401 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1402 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1403 | }, 1404 | "is-typedarray": { 1405 | "version": "1.0.0", 1406 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1407 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1408 | "dev": true 1409 | }, 1410 | "is-wsl": { 1411 | "version": "1.1.0", 1412 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 1413 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" 1414 | }, 1415 | "isarray": { 1416 | "version": "0.0.1", 1417 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1418 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1419 | }, 1420 | "isexe": { 1421 | "version": "2.0.0", 1422 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1423 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1424 | }, 1425 | "isobject": { 1426 | "version": "3.0.1", 1427 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1428 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1429 | }, 1430 | "isstream": { 1431 | "version": "0.1.2", 1432 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1433 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1434 | }, 1435 | "istanbul": { 1436 | "version": "0.4.5", 1437 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 1438 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 1439 | "dev": true, 1440 | "requires": { 1441 | "abbrev": "1.0.x", 1442 | "async": "1.x", 1443 | "escodegen": "1.8.x", 1444 | "esprima": "2.7.x", 1445 | "glob": "^5.0.15", 1446 | "handlebars": "^4.0.1", 1447 | "js-yaml": "3.x", 1448 | "mkdirp": "0.5.x", 1449 | "nopt": "3.x", 1450 | "once": "1.x", 1451 | "resolve": "1.1.x", 1452 | "supports-color": "^3.1.0", 1453 | "which": "^1.1.1", 1454 | "wordwrap": "^1.0.0" 1455 | }, 1456 | "dependencies": { 1457 | "abbrev": { 1458 | "version": "1.0.9", 1459 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 1460 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 1461 | "dev": true 1462 | }, 1463 | "escodegen": { 1464 | "version": "1.8.1", 1465 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 1466 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 1467 | "dev": true, 1468 | "requires": { 1469 | "esprima": "^2.7.1", 1470 | "estraverse": "^1.9.1", 1471 | "esutils": "^2.0.2", 1472 | "optionator": "^0.8.1", 1473 | "source-map": "~0.2.0" 1474 | } 1475 | }, 1476 | "esprima": { 1477 | "version": "2.7.3", 1478 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1479 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1480 | "dev": true 1481 | }, 1482 | "estraverse": { 1483 | "version": "1.9.3", 1484 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 1485 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 1486 | "dev": true 1487 | }, 1488 | "has-flag": { 1489 | "version": "1.0.0", 1490 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1491 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1492 | "dev": true 1493 | }, 1494 | "source-map": { 1495 | "version": "0.2.0", 1496 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 1497 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 1498 | "dev": true, 1499 | "optional": true, 1500 | "requires": { 1501 | "amdefine": ">=0.0.4" 1502 | } 1503 | }, 1504 | "supports-color": { 1505 | "version": "3.2.3", 1506 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 1507 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 1508 | "dev": true, 1509 | "requires": { 1510 | "has-flag": "^1.0.0" 1511 | } 1512 | } 1513 | } 1514 | }, 1515 | "js-yaml": { 1516 | "version": "3.13.0", 1517 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", 1518 | "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", 1519 | "requires": { 1520 | "argparse": "^1.0.7", 1521 | "esprima": "^4.0.0" 1522 | }, 1523 | "dependencies": { 1524 | "esprima": { 1525 | "version": "4.0.1", 1526 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1527 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 1528 | } 1529 | } 1530 | }, 1531 | "jsbn": { 1532 | "version": "0.1.1", 1533 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1534 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1535 | "dev": true 1536 | }, 1537 | "json-schema": { 1538 | "version": "0.2.3", 1539 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1540 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1541 | "dev": true 1542 | }, 1543 | "json-schema-traverse": { 1544 | "version": "0.4.1", 1545 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1546 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1547 | "dev": true 1548 | }, 1549 | "json-stringify-safe": { 1550 | "version": "5.0.1", 1551 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1552 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1553 | "dev": true 1554 | }, 1555 | "json3": { 1556 | "version": "3.3.2", 1557 | "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", 1558 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", 1559 | "dev": true 1560 | }, 1561 | "jsprim": { 1562 | "version": "1.4.1", 1563 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1564 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1565 | "dev": true, 1566 | "requires": { 1567 | "assert-plus": "1.0.0", 1568 | "extsprintf": "1.3.0", 1569 | "json-schema": "0.2.3", 1570 | "verror": "1.10.0" 1571 | } 1572 | }, 1573 | "jszip": { 1574 | "version": "3.2.1", 1575 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", 1576 | "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", 1577 | "requires": { 1578 | "lie": "~3.3.0", 1579 | "pako": "~1.0.2", 1580 | "readable-stream": "~2.3.6", 1581 | "set-immediate-shim": "~1.0.1" 1582 | } 1583 | }, 1584 | "kind-of": { 1585 | "version": "3.2.2", 1586 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1587 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1588 | "requires": { 1589 | "is-buffer": "^1.1.5" 1590 | } 1591 | }, 1592 | "latest-version": { 1593 | "version": "3.1.0", 1594 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 1595 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 1596 | "requires": { 1597 | "package-json": "^4.0.0" 1598 | } 1599 | }, 1600 | "lazy-cache": { 1601 | "version": "0.2.7", 1602 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", 1603 | "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" 1604 | }, 1605 | "lcid": { 1606 | "version": "1.0.0", 1607 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1608 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1609 | "requires": { 1610 | "invert-kv": "^1.0.0" 1611 | } 1612 | }, 1613 | "lcov-parse": { 1614 | "version": "0.0.10", 1615 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 1616 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 1617 | "dev": true 1618 | }, 1619 | "levn": { 1620 | "version": "0.3.0", 1621 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1622 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1623 | "requires": { 1624 | "prelude-ls": "~1.1.2", 1625 | "type-check": "~0.3.2" 1626 | } 1627 | }, 1628 | "lie": { 1629 | "version": "3.3.0", 1630 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 1631 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 1632 | "requires": { 1633 | "immediate": "~3.0.5" 1634 | } 1635 | }, 1636 | "lodash": { 1637 | "version": "4.17.11", 1638 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1639 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1640 | }, 1641 | "lodash._baseassign": { 1642 | "version": "3.2.0", 1643 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 1644 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 1645 | "dev": true, 1646 | "requires": { 1647 | "lodash._basecopy": "^3.0.0", 1648 | "lodash.keys": "^3.0.0" 1649 | } 1650 | }, 1651 | "lodash._basecopy": { 1652 | "version": "3.0.1", 1653 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 1654 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 1655 | "dev": true 1656 | }, 1657 | "lodash._basecreate": { 1658 | "version": "3.0.3", 1659 | "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", 1660 | "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", 1661 | "dev": true 1662 | }, 1663 | "lodash._getnative": { 1664 | "version": "3.9.1", 1665 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 1666 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 1667 | "dev": true 1668 | }, 1669 | "lodash._isiterateecall": { 1670 | "version": "3.0.9", 1671 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 1672 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 1673 | "dev": true 1674 | }, 1675 | "lodash.assign": { 1676 | "version": "4.2.0", 1677 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 1678 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" 1679 | }, 1680 | "lodash.assignin": { 1681 | "version": "4.2.0", 1682 | "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", 1683 | "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" 1684 | }, 1685 | "lodash.clone": { 1686 | "version": "4.5.0", 1687 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 1688 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" 1689 | }, 1690 | "lodash.clonedeep": { 1691 | "version": "4.5.0", 1692 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1693 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" 1694 | }, 1695 | "lodash.create": { 1696 | "version": "3.1.1", 1697 | "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", 1698 | "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", 1699 | "dev": true, 1700 | "requires": { 1701 | "lodash._baseassign": "^3.0.0", 1702 | "lodash._basecreate": "^3.0.0", 1703 | "lodash._isiterateecall": "^3.0.0" 1704 | } 1705 | }, 1706 | "lodash.flatten": { 1707 | "version": "4.4.0", 1708 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 1709 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 1710 | }, 1711 | "lodash.get": { 1712 | "version": "4.4.2", 1713 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 1714 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 1715 | }, 1716 | "lodash.isarguments": { 1717 | "version": "3.1.0", 1718 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 1719 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 1720 | "dev": true 1721 | }, 1722 | "lodash.isarray": { 1723 | "version": "3.0.4", 1724 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 1725 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 1726 | "dev": true 1727 | }, 1728 | "lodash.isfinite": { 1729 | "version": "3.3.2", 1730 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", 1731 | "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=" 1732 | }, 1733 | "lodash.keys": { 1734 | "version": "3.1.2", 1735 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 1736 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 1737 | "dev": true, 1738 | "requires": { 1739 | "lodash._getnative": "^3.0.0", 1740 | "lodash.isarguments": "^3.0.0", 1741 | "lodash.isarray": "^3.0.0" 1742 | } 1743 | }, 1744 | "lodash.set": { 1745 | "version": "4.3.2", 1746 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 1747 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" 1748 | }, 1749 | "lowercase-keys": { 1750 | "version": "1.0.1", 1751 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1752 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 1753 | }, 1754 | "lru-cache": { 1755 | "version": "4.1.5", 1756 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1757 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1758 | "requires": { 1759 | "pseudomap": "^1.0.2", 1760 | "yallist": "^2.1.2" 1761 | } 1762 | }, 1763 | "macos-release": { 1764 | "version": "2.1.0", 1765 | "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.1.0.tgz", 1766 | "integrity": "sha512-8TCbwvN1mfNxbBv0yBtfyIFMo3m1QsNbKHv7PYIp/abRBKVQBXN7ecu3aeGGgT18VC/Tf397LBDGZF9KBGJFFw==" 1767 | }, 1768 | "make-dir": { 1769 | "version": "1.3.0", 1770 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1771 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1772 | "requires": { 1773 | "pify": "^3.0.0" 1774 | } 1775 | }, 1776 | "media-typer": { 1777 | "version": "0.3.0", 1778 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1779 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1780 | }, 1781 | "merge-descriptors": { 1782 | "version": "1.0.1", 1783 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1784 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1785 | }, 1786 | "methods": { 1787 | "version": "1.1.2", 1788 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1789 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1790 | }, 1791 | "mime": { 1792 | "version": "1.4.1", 1793 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1794 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 1795 | }, 1796 | "mime-db": { 1797 | "version": "1.38.0", 1798 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 1799 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 1800 | }, 1801 | "mime-types": { 1802 | "version": "2.1.22", 1803 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 1804 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 1805 | "requires": { 1806 | "mime-db": "~1.38.0" 1807 | } 1808 | }, 1809 | "mimic-fn": { 1810 | "version": "1.2.0", 1811 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1812 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 1813 | }, 1814 | "minimatch": { 1815 | "version": "3.0.4", 1816 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1817 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1818 | "requires": { 1819 | "brace-expansion": "^1.1.7" 1820 | } 1821 | }, 1822 | "minimist": { 1823 | "version": "1.2.0", 1824 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1825 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1826 | }, 1827 | "mixin-object": { 1828 | "version": "2.0.1", 1829 | "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", 1830 | "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", 1831 | "requires": { 1832 | "for-in": "^0.1.3", 1833 | "is-extendable": "^0.1.1" 1834 | }, 1835 | "dependencies": { 1836 | "for-in": { 1837 | "version": "0.1.8", 1838 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", 1839 | "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" 1840 | } 1841 | } 1842 | }, 1843 | "mkdirp": { 1844 | "version": "0.5.1", 1845 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1846 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1847 | "dev": true, 1848 | "requires": { 1849 | "minimist": "0.0.8" 1850 | }, 1851 | "dependencies": { 1852 | "minimist": { 1853 | "version": "0.0.8", 1854 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1855 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1856 | "dev": true 1857 | } 1858 | } 1859 | }, 1860 | "mocha": { 1861 | "version": "3.1.0", 1862 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.1.0.tgz", 1863 | "integrity": "sha1-EvJW/qiF4WoeYnoXHWi+7w8tYYw=", 1864 | "dev": true, 1865 | "requires": { 1866 | "browser-stdout": "1.3.0", 1867 | "commander": "2.9.0", 1868 | "debug": "2.2.0", 1869 | "diff": "1.4.0", 1870 | "escape-string-regexp": "1.0.5", 1871 | "glob": "7.0.5", 1872 | "growl": "1.9.2", 1873 | "json3": "3.3.2", 1874 | "lodash.create": "3.1.1", 1875 | "mkdirp": "0.5.1", 1876 | "supports-color": "3.1.2" 1877 | }, 1878 | "dependencies": { 1879 | "debug": { 1880 | "version": "2.2.0", 1881 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1882 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1883 | "dev": true, 1884 | "requires": { 1885 | "ms": "0.7.1" 1886 | } 1887 | }, 1888 | "diff": { 1889 | "version": "1.4.0", 1890 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 1891 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 1892 | "dev": true 1893 | }, 1894 | "glob": { 1895 | "version": "7.0.5", 1896 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", 1897 | "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", 1898 | "dev": true, 1899 | "requires": { 1900 | "fs.realpath": "^1.0.0", 1901 | "inflight": "^1.0.4", 1902 | "inherits": "2", 1903 | "minimatch": "^3.0.2", 1904 | "once": "^1.3.0", 1905 | "path-is-absolute": "^1.0.0" 1906 | } 1907 | }, 1908 | "has-flag": { 1909 | "version": "1.0.0", 1910 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1911 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1912 | "dev": true 1913 | }, 1914 | "ms": { 1915 | "version": "0.7.1", 1916 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1917 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1918 | "dev": true 1919 | }, 1920 | "supports-color": { 1921 | "version": "3.1.2", 1922 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", 1923 | "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", 1924 | "dev": true, 1925 | "requires": { 1926 | "has-flag": "^1.0.0" 1927 | } 1928 | } 1929 | } 1930 | }, 1931 | "ms": { 1932 | "version": "2.0.0", 1933 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1934 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1935 | }, 1936 | "mute-stream": { 1937 | "version": "0.0.7", 1938 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1939 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 1940 | }, 1941 | "nconf": { 1942 | "version": "0.10.0", 1943 | "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", 1944 | "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", 1945 | "requires": { 1946 | "async": "^1.4.0", 1947 | "ini": "^1.3.0", 1948 | "secure-keys": "^1.0.0", 1949 | "yargs": "^3.19.0" 1950 | } 1951 | }, 1952 | "needle": { 1953 | "version": "2.2.4", 1954 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", 1955 | "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", 1956 | "requires": { 1957 | "debug": "^2.1.2", 1958 | "iconv-lite": "^0.4.4", 1959 | "sax": "^1.2.4" 1960 | } 1961 | }, 1962 | "negotiator": { 1963 | "version": "0.6.1", 1964 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1965 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1966 | }, 1967 | "neo-async": { 1968 | "version": "2.6.0", 1969 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", 1970 | "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", 1971 | "dev": true 1972 | }, 1973 | "netmask": { 1974 | "version": "1.0.6", 1975 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", 1976 | "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" 1977 | }, 1978 | "nice-try": { 1979 | "version": "1.0.5", 1980 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1981 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 1982 | }, 1983 | "nopt": { 1984 | "version": "3.0.6", 1985 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1986 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1987 | "dev": true, 1988 | "requires": { 1989 | "abbrev": "1" 1990 | } 1991 | }, 1992 | "npm-run-path": { 1993 | "version": "2.0.2", 1994 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1995 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1996 | "requires": { 1997 | "path-key": "^2.0.0" 1998 | } 1999 | }, 2000 | "number-is-nan": { 2001 | "version": "1.0.1", 2002 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2003 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2004 | }, 2005 | "oauth-sign": { 2006 | "version": "0.9.0", 2007 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2008 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 2009 | "dev": true 2010 | }, 2011 | "object-component": { 2012 | "version": "0.0.3", 2013 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 2014 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" 2015 | }, 2016 | "on-finished": { 2017 | "version": "2.3.0", 2018 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2019 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2020 | "requires": { 2021 | "ee-first": "1.1.1" 2022 | } 2023 | }, 2024 | "once": { 2025 | "version": "1.4.0", 2026 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2027 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2028 | "dev": true, 2029 | "requires": { 2030 | "wrappy": "1" 2031 | } 2032 | }, 2033 | "onetime": { 2034 | "version": "2.0.1", 2035 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 2036 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 2037 | "requires": { 2038 | "mimic-fn": "^1.0.0" 2039 | } 2040 | }, 2041 | "opn": { 2042 | "version": "5.5.0", 2043 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", 2044 | "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", 2045 | "requires": { 2046 | "is-wsl": "^1.1.0" 2047 | } 2048 | }, 2049 | "optimist": { 2050 | "version": "0.6.1", 2051 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 2052 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 2053 | "dev": true, 2054 | "requires": { 2055 | "minimist": "~0.0.1", 2056 | "wordwrap": "~0.0.2" 2057 | }, 2058 | "dependencies": { 2059 | "minimist": { 2060 | "version": "0.0.10", 2061 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 2062 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 2063 | "dev": true 2064 | }, 2065 | "wordwrap": { 2066 | "version": "0.0.3", 2067 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2068 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2069 | "dev": true 2070 | } 2071 | } 2072 | }, 2073 | "optionator": { 2074 | "version": "0.8.2", 2075 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 2076 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2077 | "requires": { 2078 | "deep-is": "~0.1.3", 2079 | "fast-levenshtein": "~2.0.4", 2080 | "levn": "~0.3.0", 2081 | "prelude-ls": "~1.1.2", 2082 | "type-check": "~0.3.2", 2083 | "wordwrap": "~1.0.0" 2084 | } 2085 | }, 2086 | "os-locale": { 2087 | "version": "1.4.0", 2088 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 2089 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2090 | "requires": { 2091 | "lcid": "^1.0.0" 2092 | } 2093 | }, 2094 | "os-name": { 2095 | "version": "3.0.0", 2096 | "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", 2097 | "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", 2098 | "requires": { 2099 | "macos-release": "^2.0.0", 2100 | "windows-release": "^3.1.0" 2101 | } 2102 | }, 2103 | "os-tmpdir": { 2104 | "version": "1.0.2", 2105 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2106 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 2107 | }, 2108 | "p-finally": { 2109 | "version": "1.0.0", 2110 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 2111 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 2112 | }, 2113 | "pac-proxy-agent": { 2114 | "version": "2.0.2", 2115 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", 2116 | "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", 2117 | "requires": { 2118 | "agent-base": "^4.2.0", 2119 | "debug": "^3.1.0", 2120 | "get-uri": "^2.0.0", 2121 | "http-proxy-agent": "^2.1.0", 2122 | "https-proxy-agent": "^2.2.1", 2123 | "pac-resolver": "^3.0.0", 2124 | "raw-body": "^2.2.0", 2125 | "socks-proxy-agent": "^3.0.0" 2126 | }, 2127 | "dependencies": { 2128 | "debug": { 2129 | "version": "3.2.6", 2130 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2131 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2132 | "requires": { 2133 | "ms": "^2.1.1" 2134 | } 2135 | }, 2136 | "ms": { 2137 | "version": "2.1.1", 2138 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2139 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2140 | } 2141 | } 2142 | }, 2143 | "pac-resolver": { 2144 | "version": "3.0.0", 2145 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", 2146 | "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", 2147 | "requires": { 2148 | "co": "^4.6.0", 2149 | "degenerator": "^1.0.4", 2150 | "ip": "^1.1.5", 2151 | "netmask": "^1.0.6", 2152 | "thunkify": "^2.1.2" 2153 | } 2154 | }, 2155 | "package-json": { 2156 | "version": "4.0.1", 2157 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 2158 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 2159 | "requires": { 2160 | "got": "^6.7.1", 2161 | "registry-auth-token": "^3.0.1", 2162 | "registry-url": "^3.0.3", 2163 | "semver": "^5.1.0" 2164 | } 2165 | }, 2166 | "pako": { 2167 | "version": "1.0.10", 2168 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 2169 | "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" 2170 | }, 2171 | "parseqs": { 2172 | "version": "0.0.5", 2173 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 2174 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 2175 | "requires": { 2176 | "better-assert": "~1.0.0" 2177 | } 2178 | }, 2179 | "parseuri": { 2180 | "version": "0.0.5", 2181 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 2182 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 2183 | "requires": { 2184 | "better-assert": "~1.0.0" 2185 | } 2186 | }, 2187 | "parseurl": { 2188 | "version": "1.3.2", 2189 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2190 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2191 | }, 2192 | "path-is-absolute": { 2193 | "version": "1.0.1", 2194 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2195 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2196 | "dev": true 2197 | }, 2198 | "path-is-inside": { 2199 | "version": "1.0.2", 2200 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2201 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 2202 | }, 2203 | "path-key": { 2204 | "version": "2.0.1", 2205 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2206 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 2207 | }, 2208 | "path-to-regexp": { 2209 | "version": "0.1.7", 2210 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2211 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2212 | }, 2213 | "performance-now": { 2214 | "version": "2.1.0", 2215 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2216 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 2217 | "dev": true 2218 | }, 2219 | "pify": { 2220 | "version": "3.0.0", 2221 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2222 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 2223 | }, 2224 | "pkginfo": { 2225 | "version": "0.3.1", 2226 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 2227 | "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" 2228 | }, 2229 | "poly-socketio": { 2230 | "version": "1.1.5", 2231 | "resolved": "https://registry.npmjs.org/poly-socketio/-/poly-socketio-1.1.5.tgz", 2232 | "integrity": "sha512-nCLB7HA9kQFqdtSEGEwxqWwjSkSZVa1wkMvEMHYKGKUt+4t66XK44fQb9rc4WsBOG819pty5TWnK4XreXnnLgg==", 2233 | "requires": { 2234 | "bluebird": "^3.4.6", 2235 | "express": "^4.14.0", 2236 | "lodash": "^4.16.4", 2237 | "randombytes": "^2.0.3", 2238 | "snyk": "^1.41.1", 2239 | "socket.io": "^2.0.2", 2240 | "socket.io-client": "^2.0.2", 2241 | "winston": "^2.2.0" 2242 | }, 2243 | "dependencies": { 2244 | "async": { 2245 | "version": "1.0.0", 2246 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 2247 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 2248 | }, 2249 | "winston": { 2250 | "version": "2.4.4", 2251 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", 2252 | "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", 2253 | "requires": { 2254 | "async": "~1.0.0", 2255 | "colors": "1.0.x", 2256 | "cycle": "1.0.x", 2257 | "eyes": "0.1.x", 2258 | "isstream": "0.1.x", 2259 | "stack-trace": "0.0.x" 2260 | } 2261 | } 2262 | } 2263 | }, 2264 | "portscanner": { 2265 | "version": "2.2.0", 2266 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", 2267 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", 2268 | "requires": { 2269 | "async": "^2.6.0", 2270 | "is-number-like": "^1.0.3" 2271 | }, 2272 | "dependencies": { 2273 | "async": { 2274 | "version": "2.6.2", 2275 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", 2276 | "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", 2277 | "requires": { 2278 | "lodash": "^4.17.11" 2279 | } 2280 | } 2281 | } 2282 | }, 2283 | "prelude-ls": { 2284 | "version": "1.1.2", 2285 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2286 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 2287 | }, 2288 | "prepend-http": { 2289 | "version": "1.0.4", 2290 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 2291 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" 2292 | }, 2293 | "process-nextick-args": { 2294 | "version": "2.0.0", 2295 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 2296 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 2297 | }, 2298 | "promise": { 2299 | "version": "7.3.1", 2300 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 2301 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 2302 | "requires": { 2303 | "asap": "~2.0.3" 2304 | } 2305 | }, 2306 | "proxy-addr": { 2307 | "version": "2.0.4", 2308 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 2309 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 2310 | "requires": { 2311 | "forwarded": "~0.1.2", 2312 | "ipaddr.js": "1.8.0" 2313 | } 2314 | }, 2315 | "proxy-agent": { 2316 | "version": "2.3.1", 2317 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", 2318 | "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", 2319 | "requires": { 2320 | "agent-base": "^4.2.0", 2321 | "debug": "^3.1.0", 2322 | "http-proxy-agent": "^2.1.0", 2323 | "https-proxy-agent": "^2.2.1", 2324 | "lru-cache": "^4.1.2", 2325 | "pac-proxy-agent": "^2.0.1", 2326 | "proxy-from-env": "^1.0.0", 2327 | "socks-proxy-agent": "^3.0.0" 2328 | }, 2329 | "dependencies": { 2330 | "debug": { 2331 | "version": "3.2.6", 2332 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2333 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2334 | "requires": { 2335 | "ms": "^2.1.1" 2336 | } 2337 | }, 2338 | "ms": { 2339 | "version": "2.1.1", 2340 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2341 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2342 | } 2343 | } 2344 | }, 2345 | "proxy-from-env": { 2346 | "version": "1.0.0", 2347 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", 2348 | "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" 2349 | }, 2350 | "pseudomap": { 2351 | "version": "1.0.2", 2352 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2353 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 2354 | }, 2355 | "psl": { 2356 | "version": "1.1.31", 2357 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 2358 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", 2359 | "dev": true 2360 | }, 2361 | "punycode": { 2362 | "version": "2.1.1", 2363 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2364 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2365 | "dev": true 2366 | }, 2367 | "qs": { 2368 | "version": "6.5.2", 2369 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2370 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2371 | }, 2372 | "randombytes": { 2373 | "version": "2.1.0", 2374 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2375 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2376 | "requires": { 2377 | "safe-buffer": "^5.1.0" 2378 | } 2379 | }, 2380 | "range-parser": { 2381 | "version": "1.2.0", 2382 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2383 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2384 | }, 2385 | "raw-body": { 2386 | "version": "2.3.3", 2387 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 2388 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 2389 | "requires": { 2390 | "bytes": "3.0.0", 2391 | "http-errors": "1.6.3", 2392 | "iconv-lite": "0.4.23", 2393 | "unpipe": "1.0.0" 2394 | } 2395 | }, 2396 | "rc": { 2397 | "version": "1.2.8", 2398 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2399 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2400 | "requires": { 2401 | "deep-extend": "^0.6.0", 2402 | "ini": "~1.3.0", 2403 | "minimist": "^1.2.0", 2404 | "strip-json-comments": "~2.0.1" 2405 | } 2406 | }, 2407 | "readable-stream": { 2408 | "version": "2.3.6", 2409 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2410 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2411 | "requires": { 2412 | "core-util-is": "~1.0.0", 2413 | "inherits": "~2.0.3", 2414 | "isarray": "~1.0.0", 2415 | "process-nextick-args": "~2.0.0", 2416 | "safe-buffer": "~5.1.1", 2417 | "string_decoder": "~1.1.1", 2418 | "util-deprecate": "~1.0.1" 2419 | }, 2420 | "dependencies": { 2421 | "isarray": { 2422 | "version": "1.0.0", 2423 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2424 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2425 | }, 2426 | "string_decoder": { 2427 | "version": "1.1.1", 2428 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2429 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2430 | "requires": { 2431 | "safe-buffer": "~5.1.0" 2432 | } 2433 | } 2434 | } 2435 | }, 2436 | "recursive-readdir": { 2437 | "version": "2.2.2", 2438 | "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", 2439 | "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", 2440 | "requires": { 2441 | "minimatch": "3.0.4" 2442 | } 2443 | }, 2444 | "registry-auth-token": { 2445 | "version": "3.4.0", 2446 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", 2447 | "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", 2448 | "requires": { 2449 | "rc": "^1.1.6", 2450 | "safe-buffer": "^5.0.1" 2451 | } 2452 | }, 2453 | "registry-url": { 2454 | "version": "3.1.0", 2455 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 2456 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 2457 | "requires": { 2458 | "rc": "^1.0.1" 2459 | } 2460 | }, 2461 | "request": { 2462 | "version": "2.88.0", 2463 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 2464 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 2465 | "dev": true, 2466 | "requires": { 2467 | "aws-sign2": "~0.7.0", 2468 | "aws4": "^1.8.0", 2469 | "caseless": "~0.12.0", 2470 | "combined-stream": "~1.0.6", 2471 | "extend": "~3.0.2", 2472 | "forever-agent": "~0.6.1", 2473 | "form-data": "~2.3.2", 2474 | "har-validator": "~5.1.0", 2475 | "http-signature": "~1.2.0", 2476 | "is-typedarray": "~1.0.0", 2477 | "isstream": "~0.1.2", 2478 | "json-stringify-safe": "~5.0.1", 2479 | "mime-types": "~2.1.19", 2480 | "oauth-sign": "~0.9.0", 2481 | "performance-now": "^2.1.0", 2482 | "qs": "~6.5.2", 2483 | "safe-buffer": "^5.1.2", 2484 | "tough-cookie": "~2.4.3", 2485 | "tunnel-agent": "^0.6.0", 2486 | "uuid": "^3.3.2" 2487 | } 2488 | }, 2489 | "resolve": { 2490 | "version": "1.1.7", 2491 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 2492 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 2493 | "dev": true 2494 | }, 2495 | "restore-cursor": { 2496 | "version": "2.0.0", 2497 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2498 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2499 | "requires": { 2500 | "onetime": "^2.0.0", 2501 | "signal-exit": "^3.0.2" 2502 | } 2503 | }, 2504 | "run-async": { 2505 | "version": "2.3.0", 2506 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 2507 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2508 | "requires": { 2509 | "is-promise": "^2.1.0" 2510 | } 2511 | }, 2512 | "rx-lite": { 2513 | "version": "4.0.8", 2514 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 2515 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" 2516 | }, 2517 | "rx-lite-aggregates": { 2518 | "version": "4.0.8", 2519 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 2520 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 2521 | "requires": { 2522 | "rx-lite": "*" 2523 | } 2524 | }, 2525 | "safe-buffer": { 2526 | "version": "5.1.2", 2527 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2528 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2529 | }, 2530 | "safer-buffer": { 2531 | "version": "2.1.2", 2532 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2533 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2534 | }, 2535 | "sax": { 2536 | "version": "1.2.4", 2537 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2538 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 2539 | }, 2540 | "secure-keys": { 2541 | "version": "1.0.0", 2542 | "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", 2543 | "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" 2544 | }, 2545 | "semver": { 2546 | "version": "5.6.0", 2547 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 2548 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 2549 | }, 2550 | "semver-diff": { 2551 | "version": "2.1.0", 2552 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 2553 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 2554 | "requires": { 2555 | "semver": "^5.0.3" 2556 | } 2557 | }, 2558 | "send": { 2559 | "version": "0.16.2", 2560 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 2561 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 2562 | "requires": { 2563 | "debug": "2.6.9", 2564 | "depd": "~1.1.2", 2565 | "destroy": "~1.0.4", 2566 | "encodeurl": "~1.0.2", 2567 | "escape-html": "~1.0.3", 2568 | "etag": "~1.8.1", 2569 | "fresh": "0.5.2", 2570 | "http-errors": "~1.6.2", 2571 | "mime": "1.4.1", 2572 | "ms": "2.0.0", 2573 | "on-finished": "~2.3.0", 2574 | "range-parser": "~1.2.0", 2575 | "statuses": "~1.4.0" 2576 | } 2577 | }, 2578 | "serve-static": { 2579 | "version": "1.13.2", 2580 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 2581 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 2582 | "requires": { 2583 | "encodeurl": "~1.0.2", 2584 | "escape-html": "~1.0.3", 2585 | "parseurl": "~1.3.2", 2586 | "send": "0.16.2" 2587 | } 2588 | }, 2589 | "set-immediate-shim": { 2590 | "version": "1.0.1", 2591 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 2592 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" 2593 | }, 2594 | "setprototypeof": { 2595 | "version": "1.1.0", 2596 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2597 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 2598 | }, 2599 | "shallow-clone": { 2600 | "version": "0.1.2", 2601 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", 2602 | "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", 2603 | "requires": { 2604 | "is-extendable": "^0.1.1", 2605 | "kind-of": "^2.0.1", 2606 | "lazy-cache": "^0.2.3", 2607 | "mixin-object": "^2.0.1" 2608 | }, 2609 | "dependencies": { 2610 | "kind-of": { 2611 | "version": "2.0.1", 2612 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", 2613 | "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", 2614 | "requires": { 2615 | "is-buffer": "^1.0.2" 2616 | } 2617 | } 2618 | } 2619 | }, 2620 | "shebang-command": { 2621 | "version": "1.2.0", 2622 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2623 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2624 | "requires": { 2625 | "shebang-regex": "^1.0.0" 2626 | } 2627 | }, 2628 | "shebang-regex": { 2629 | "version": "1.0.0", 2630 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2631 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 2632 | }, 2633 | "signal-exit": { 2634 | "version": "3.0.2", 2635 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2636 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2637 | }, 2638 | "smart-buffer": { 2639 | "version": "1.1.15", 2640 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", 2641 | "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" 2642 | }, 2643 | "snyk": { 2644 | "version": "1.143.1", 2645 | "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.143.1.tgz", 2646 | "integrity": "sha512-/9jL2G32toCfws5sYa2x8PHkm9r2R9uFqlExa/MYSQx1WP9Q32sTkT+f9FTzSlyk6HUkMg/g6lgPIQ0lRQ44ig==", 2647 | "requires": { 2648 | "@snyk/dep-graph": "1.4.0", 2649 | "@snyk/gemfile": "1.2.0", 2650 | "abbrev": "^1.1.1", 2651 | "ansi-escapes": "^3.1.0", 2652 | "chalk": "^2.4.1", 2653 | "configstore": "^3.1.2", 2654 | "debug": "^3.1.0", 2655 | "diff": "^4.0.1", 2656 | "get-uri": "2.0.2", 2657 | "inquirer": "^3.0.0", 2658 | "lodash": "^4.17.11", 2659 | "needle": "^2.2.4", 2660 | "opn": "^5.4.0", 2661 | "os-name": "^3.0.0", 2662 | "proxy-agent": "2.3.1", 2663 | "proxy-from-env": "^1.0.0", 2664 | "recursive-readdir": "^2.2.2", 2665 | "semver": "^5.6.0", 2666 | "snyk-config": "2.2.1", 2667 | "snyk-docker-plugin": "1.22.0", 2668 | "snyk-go-plugin": "1.6.1", 2669 | "snyk-gradle-plugin": "2.3.1", 2670 | "snyk-module": "1.9.1", 2671 | "snyk-mvn-plugin": "2.0.1", 2672 | "snyk-nodejs-lockfile-parser": "1.11.0", 2673 | "snyk-nuget-plugin": "1.7.2", 2674 | "snyk-php-plugin": "1.5.2", 2675 | "snyk-policy": "1.13.3", 2676 | "snyk-python-plugin": "1.9.1", 2677 | "snyk-resolve": "1.0.1", 2678 | "snyk-resolve-deps": "4.0.3", 2679 | "snyk-sbt-plugin": "2.0.1", 2680 | "snyk-tree": "^1.0.0", 2681 | "snyk-try-require": "1.3.1", 2682 | "source-map-support": "^0.5.10", 2683 | "tempfile": "^2.0.0", 2684 | "then-fs": "^2.0.0", 2685 | "update-notifier": "^2.5.0", 2686 | "uuid": "^3.3.2" 2687 | }, 2688 | "dependencies": { 2689 | "debug": { 2690 | "version": "3.2.6", 2691 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2692 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2693 | "requires": { 2694 | "ms": "^2.1.1" 2695 | } 2696 | }, 2697 | "ms": { 2698 | "version": "2.1.1", 2699 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2700 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2701 | } 2702 | } 2703 | }, 2704 | "snyk-config": { 2705 | "version": "2.2.1", 2706 | "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.1.tgz", 2707 | "integrity": "sha512-eCsFKHHE4J2DpD/1NzAtCmkmVDK310OXRtmoW0RlLnld1ESprJ5A/QRJ5Zxx1JbA8gjuwERY5vfUFA8lEJeopA==", 2708 | "requires": { 2709 | "debug": "^3.1.0", 2710 | "lodash": "^4.17.11", 2711 | "nconf": "^0.10.0" 2712 | }, 2713 | "dependencies": { 2714 | "debug": { 2715 | "version": "3.2.6", 2716 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2717 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2718 | "requires": { 2719 | "ms": "^2.1.1" 2720 | } 2721 | }, 2722 | "ms": { 2723 | "version": "2.1.1", 2724 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2725 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2726 | } 2727 | } 2728 | }, 2729 | "snyk-docker-plugin": { 2730 | "version": "1.22.0", 2731 | "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.22.0.tgz", 2732 | "integrity": "sha512-bykxNtfeWQNFjF6gv8u8w+TOa4fdr+teLm+DkvYlWkdlvaw5m4yywRI5USve4X6S9p4G+Fw4/wfjXx7LgCcxrQ==", 2733 | "requires": { 2734 | "debug": "^3", 2735 | "dockerfile-ast": "0.0.12", 2736 | "semver": "^5.6.0", 2737 | "tslib": "^1" 2738 | }, 2739 | "dependencies": { 2740 | "debug": { 2741 | "version": "3.2.6", 2742 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2743 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2744 | "requires": { 2745 | "ms": "^2.1.1" 2746 | } 2747 | }, 2748 | "ms": { 2749 | "version": "2.1.1", 2750 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2751 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2752 | } 2753 | } 2754 | }, 2755 | "snyk-go-plugin": { 2756 | "version": "1.6.1", 2757 | "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.6.1.tgz", 2758 | "integrity": "sha512-hFOMyznfcMzF1HaZP18VmjQSqK/jBOowh0lpJY4UqmaQSZyJury3Ax+44O9oVUJi8lb8A4g7RVbxhlWl6bIqlA==", 2759 | "requires": { 2760 | "graphlib": "^2.1.1", 2761 | "tmp": "0.0.33", 2762 | "toml": "^2.3.2" 2763 | } 2764 | }, 2765 | "snyk-gradle-plugin": { 2766 | "version": "2.3.1", 2767 | "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.3.1.tgz", 2768 | "integrity": "sha512-546vvYw0dItj8hyamBO3tAGZSgUKMc/7gPnwv4vbfd6PgvX1S0+WlKM/hZ57iDJdMFbCWnbWjggRrBnvmw+jCA==", 2769 | "requires": { 2770 | "clone-deep": "^0.3.0" 2771 | } 2772 | }, 2773 | "snyk-module": { 2774 | "version": "1.9.1", 2775 | "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", 2776 | "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", 2777 | "requires": { 2778 | "debug": "^3.1.0", 2779 | "hosted-git-info": "^2.7.1" 2780 | }, 2781 | "dependencies": { 2782 | "debug": { 2783 | "version": "3.2.6", 2784 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2785 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2786 | "requires": { 2787 | "ms": "^2.1.1" 2788 | } 2789 | }, 2790 | "ms": { 2791 | "version": "2.1.1", 2792 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2793 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2794 | } 2795 | } 2796 | }, 2797 | "snyk-mvn-plugin": { 2798 | "version": "2.0.1", 2799 | "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.0.1.tgz", 2800 | "integrity": "sha512-TBrdcFXHdYuRYFCvpyUeFC+mCi6SOV3vdxgHrP7JRNnJwO8PYaKCObLJyhpRWa8IaHv/8CjJTmnEbWIh7BPHAA==" 2801 | }, 2802 | "snyk-nodejs-lockfile-parser": { 2803 | "version": "1.11.0", 2804 | "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.11.0.tgz", 2805 | "integrity": "sha512-eTdq5VcaHJwGoApejebTChi5hRcIDdNbO6lMwncS0zz9ZxXskoQ0C+VMdep8ELmJa0Gcz6es1sSkABPZs7frrg==", 2806 | "requires": { 2807 | "@yarnpkg/lockfile": "^1.0.2", 2808 | "graphlib": "^2.1.5", 2809 | "lodash": "^4.17.11", 2810 | "source-map-support": "^0.5.7", 2811 | "tslib": "^1.9.3", 2812 | "uuid": "^3.3.2" 2813 | } 2814 | }, 2815 | "snyk-nuget-plugin": { 2816 | "version": "1.7.2", 2817 | "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.7.2.tgz", 2818 | "integrity": "sha512-zmYD9veH7OeIqGnZHiGv8c8mKtmYrxo2o7P4lNUkpHdCMMsar7moRJxGgO9WlcIrwAGjIhMdP9fUvJ+jVDEteQ==", 2819 | "requires": { 2820 | "debug": "^3.1.0", 2821 | "jszip": "^3.1.5", 2822 | "lodash": "^4.17.10", 2823 | "snyk-paket-parser": "1.4.3", 2824 | "xml2js": "^0.4.17" 2825 | }, 2826 | "dependencies": { 2827 | "debug": { 2828 | "version": "3.2.6", 2829 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2830 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2831 | "requires": { 2832 | "ms": "^2.1.1" 2833 | } 2834 | }, 2835 | "ms": { 2836 | "version": "2.1.1", 2837 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2838 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2839 | } 2840 | } 2841 | }, 2842 | "snyk-paket-parser": { 2843 | "version": "1.4.3", 2844 | "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.4.3.tgz", 2845 | "integrity": "sha512-6m736zGVoeT/zS9KEtlmqTSPEPjAfLe8iYoQ3AwbyxDhzuLY49lTaV67MyZtGwjhi1x4KBe+XOgeWwyf6Avf/A==", 2846 | "requires": { 2847 | "tslib": "^1.9.3" 2848 | } 2849 | }, 2850 | "snyk-php-plugin": { 2851 | "version": "1.5.2", 2852 | "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.2.tgz", 2853 | "integrity": "sha512-s/s9s7mslHjLnzin2BNLGdy/s6tNBfJ4/T/d9JBjsjIwdJFaUKY/ciWwBLNaWt2Aqtyr3DiUcqg3j/pwTKhEDg==", 2854 | "requires": { 2855 | "debug": "^3.1.0", 2856 | "lodash": "^4.17.5" 2857 | }, 2858 | "dependencies": { 2859 | "debug": { 2860 | "version": "3.2.6", 2861 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2862 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2863 | "requires": { 2864 | "ms": "^2.1.1" 2865 | } 2866 | }, 2867 | "ms": { 2868 | "version": "2.1.1", 2869 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2870 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2871 | } 2872 | } 2873 | }, 2874 | "snyk-policy": { 2875 | "version": "1.13.3", 2876 | "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.3.tgz", 2877 | "integrity": "sha512-6J2a+Wt9zgvTtCwi4x8rLtkDQzFNPqubfIgs3aR35ZsEXPwI4XHGo0cxnJPDriqncp2JK72vnRpNfIZ7v0L1Mw==", 2878 | "requires": { 2879 | "debug": "^3.1.0", 2880 | "email-validator": "^2.0.4", 2881 | "js-yaml": "^3.12.0", 2882 | "lodash.clonedeep": "^4.5.0", 2883 | "semver": "^5.6.0", 2884 | "snyk-module": "^1.9.1", 2885 | "snyk-resolve": "^1.0.1", 2886 | "snyk-try-require": "^1.3.1", 2887 | "then-fs": "^2.0.0" 2888 | }, 2889 | "dependencies": { 2890 | "debug": { 2891 | "version": "3.2.6", 2892 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2893 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2894 | "requires": { 2895 | "ms": "^2.1.1" 2896 | } 2897 | }, 2898 | "ms": { 2899 | "version": "2.1.1", 2900 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2901 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2902 | } 2903 | } 2904 | }, 2905 | "snyk-python-plugin": { 2906 | "version": "1.9.1", 2907 | "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.9.1.tgz", 2908 | "integrity": "sha512-4R040DBK77NSfSy3rCndmrv85YlLrKZU1ct59oZSoGb1PYdCi8kXRuq50UpSgasp6YR0yJxT22T38hNOAjTtVw==", 2909 | "requires": { 2910 | "tmp": "0.0.33" 2911 | } 2912 | }, 2913 | "snyk-resolve": { 2914 | "version": "1.0.1", 2915 | "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", 2916 | "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", 2917 | "requires": { 2918 | "debug": "^3.1.0", 2919 | "then-fs": "^2.0.0" 2920 | }, 2921 | "dependencies": { 2922 | "debug": { 2923 | "version": "3.2.6", 2924 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2925 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2926 | "requires": { 2927 | "ms": "^2.1.1" 2928 | } 2929 | }, 2930 | "ms": { 2931 | "version": "2.1.1", 2932 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2933 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2934 | } 2935 | } 2936 | }, 2937 | "snyk-resolve-deps": { 2938 | "version": "4.0.3", 2939 | "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.0.3.tgz", 2940 | "integrity": "sha512-GP3VBrkz1iDDw2q8ftTqppHqzIAxmsUIoXR+FRWDKcipkKHXHJyUmtEo11QVT5fNRV0D0RCsssk2S5CTxTCu6A==", 2941 | "requires": { 2942 | "ansicolors": "^0.3.2", 2943 | "debug": "^3.2.5", 2944 | "lodash.assign": "^4.2.0", 2945 | "lodash.assignin": "^4.2.0", 2946 | "lodash.clone": "^4.5.0", 2947 | "lodash.flatten": "^4.4.0", 2948 | "lodash.get": "^4.4.2", 2949 | "lodash.set": "^4.3.2", 2950 | "lru-cache": "^4.0.0", 2951 | "semver": "^5.5.1", 2952 | "snyk-module": "^1.6.0", 2953 | "snyk-resolve": "^1.0.0", 2954 | "snyk-tree": "^1.0.0", 2955 | "snyk-try-require": "^1.1.1", 2956 | "then-fs": "^2.0.0" 2957 | }, 2958 | "dependencies": { 2959 | "debug": { 2960 | "version": "3.2.6", 2961 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2962 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2963 | "requires": { 2964 | "ms": "^2.1.1" 2965 | } 2966 | }, 2967 | "ms": { 2968 | "version": "2.1.1", 2969 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2970 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2971 | } 2972 | } 2973 | }, 2974 | "snyk-sbt-plugin": { 2975 | "version": "2.0.1", 2976 | "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.0.1.tgz", 2977 | "integrity": "sha512-AsGGMP0W3mlKygXUI5jjt54qWFttZEXT1A40+u21p8rZPXLZprwnd+QH9pZDd04d9W9aofGvON8NJeOn9KS39Q==" 2978 | }, 2979 | "snyk-tree": { 2980 | "version": "1.0.0", 2981 | "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", 2982 | "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", 2983 | "requires": { 2984 | "archy": "^1.0.0" 2985 | } 2986 | }, 2987 | "snyk-try-require": { 2988 | "version": "1.3.1", 2989 | "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", 2990 | "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", 2991 | "requires": { 2992 | "debug": "^3.1.0", 2993 | "lodash.clonedeep": "^4.3.0", 2994 | "lru-cache": "^4.0.0", 2995 | "then-fs": "^2.0.0" 2996 | }, 2997 | "dependencies": { 2998 | "debug": { 2999 | "version": "3.2.6", 3000 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 3001 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 3002 | "requires": { 3003 | "ms": "^2.1.1" 3004 | } 3005 | }, 3006 | "ms": { 3007 | "version": "2.1.1", 3008 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 3009 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 3010 | } 3011 | } 3012 | }, 3013 | "socket.io": { 3014 | "version": "2.2.0", 3015 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz", 3016 | "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==", 3017 | "requires": { 3018 | "debug": "~4.1.0", 3019 | "engine.io": "~3.3.1", 3020 | "has-binary2": "~1.0.2", 3021 | "socket.io-adapter": "~1.1.0", 3022 | "socket.io-client": "2.2.0", 3023 | "socket.io-parser": "~3.3.0" 3024 | }, 3025 | "dependencies": { 3026 | "debug": { 3027 | "version": "4.1.1", 3028 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 3029 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 3030 | "requires": { 3031 | "ms": "^2.1.1" 3032 | } 3033 | }, 3034 | "ms": { 3035 | "version": "2.1.1", 3036 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 3037 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 3038 | } 3039 | } 3040 | }, 3041 | "socket.io-adapter": { 3042 | "version": "1.1.1", 3043 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 3044 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" 3045 | }, 3046 | "socket.io-client": { 3047 | "version": "2.2.0", 3048 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", 3049 | "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", 3050 | "requires": { 3051 | "backo2": "1.0.2", 3052 | "base64-arraybuffer": "0.1.5", 3053 | "component-bind": "1.0.0", 3054 | "component-emitter": "1.2.1", 3055 | "debug": "~3.1.0", 3056 | "engine.io-client": "~3.3.1", 3057 | "has-binary2": "~1.0.2", 3058 | "has-cors": "1.1.0", 3059 | "indexof": "0.0.1", 3060 | "object-component": "0.0.3", 3061 | "parseqs": "0.0.5", 3062 | "parseuri": "0.0.5", 3063 | "socket.io-parser": "~3.3.0", 3064 | "to-array": "0.1.4" 3065 | }, 3066 | "dependencies": { 3067 | "debug": { 3068 | "version": "3.1.0", 3069 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 3070 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 3071 | "requires": { 3072 | "ms": "2.0.0" 3073 | } 3074 | } 3075 | } 3076 | }, 3077 | "socket.io-parser": { 3078 | "version": "3.3.0", 3079 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", 3080 | "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", 3081 | "requires": { 3082 | "component-emitter": "1.2.1", 3083 | "debug": "~3.1.0", 3084 | "isarray": "2.0.1" 3085 | }, 3086 | "dependencies": { 3087 | "debug": { 3088 | "version": "3.1.0", 3089 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 3090 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 3091 | "requires": { 3092 | "ms": "2.0.0" 3093 | } 3094 | }, 3095 | "isarray": { 3096 | "version": "2.0.1", 3097 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 3098 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 3099 | } 3100 | } 3101 | }, 3102 | "socks": { 3103 | "version": "1.1.10", 3104 | "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", 3105 | "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", 3106 | "requires": { 3107 | "ip": "^1.1.4", 3108 | "smart-buffer": "^1.0.13" 3109 | } 3110 | }, 3111 | "socks-proxy-agent": { 3112 | "version": "3.0.1", 3113 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", 3114 | "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", 3115 | "requires": { 3116 | "agent-base": "^4.1.0", 3117 | "socks": "^1.1.10" 3118 | } 3119 | }, 3120 | "source-map": { 3121 | "version": "0.6.1", 3122 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3123 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 3124 | }, 3125 | "source-map-support": { 3126 | "version": "0.5.11", 3127 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", 3128 | "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", 3129 | "requires": { 3130 | "buffer-from": "^1.0.0", 3131 | "source-map": "^0.6.0" 3132 | } 3133 | }, 3134 | "sprintf-js": { 3135 | "version": "1.0.3", 3136 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3137 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 3138 | }, 3139 | "sshpk": { 3140 | "version": "1.16.1", 3141 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 3142 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 3143 | "dev": true, 3144 | "requires": { 3145 | "asn1": "~0.2.3", 3146 | "assert-plus": "^1.0.0", 3147 | "bcrypt-pbkdf": "^1.0.0", 3148 | "dashdash": "^1.12.0", 3149 | "ecc-jsbn": "~0.1.1", 3150 | "getpass": "^0.1.1", 3151 | "jsbn": "~0.1.0", 3152 | "safer-buffer": "^2.0.2", 3153 | "tweetnacl": "~0.14.0" 3154 | } 3155 | }, 3156 | "stack-trace": { 3157 | "version": "0.0.10", 3158 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 3159 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 3160 | }, 3161 | "statuses": { 3162 | "version": "1.4.0", 3163 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 3164 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 3165 | }, 3166 | "string-width": { 3167 | "version": "2.1.1", 3168 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3169 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3170 | "requires": { 3171 | "is-fullwidth-code-point": "^2.0.0", 3172 | "strip-ansi": "^4.0.0" 3173 | } 3174 | }, 3175 | "string_decoder": { 3176 | "version": "0.10.31", 3177 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 3178 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 3179 | }, 3180 | "strip-ansi": { 3181 | "version": "4.0.0", 3182 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3183 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3184 | "requires": { 3185 | "ansi-regex": "^3.0.0" 3186 | } 3187 | }, 3188 | "strip-eof": { 3189 | "version": "1.0.0", 3190 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 3191 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 3192 | }, 3193 | "strip-json-comments": { 3194 | "version": "2.0.1", 3195 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3196 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 3197 | }, 3198 | "supports-color": { 3199 | "version": "5.5.0", 3200 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3201 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3202 | "requires": { 3203 | "has-flag": "^3.0.0" 3204 | } 3205 | }, 3206 | "temp-dir": { 3207 | "version": "1.0.0", 3208 | "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", 3209 | "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" 3210 | }, 3211 | "tempfile": { 3212 | "version": "2.0.0", 3213 | "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", 3214 | "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", 3215 | "requires": { 3216 | "temp-dir": "^1.0.0", 3217 | "uuid": "^3.0.1" 3218 | } 3219 | }, 3220 | "term-size": { 3221 | "version": "1.2.0", 3222 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 3223 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 3224 | "requires": { 3225 | "execa": "^0.7.0" 3226 | }, 3227 | "dependencies": { 3228 | "cross-spawn": { 3229 | "version": "5.1.0", 3230 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 3231 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 3232 | "requires": { 3233 | "lru-cache": "^4.0.1", 3234 | "shebang-command": "^1.2.0", 3235 | "which": "^1.2.9" 3236 | } 3237 | }, 3238 | "execa": { 3239 | "version": "0.7.0", 3240 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 3241 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 3242 | "requires": { 3243 | "cross-spawn": "^5.0.1", 3244 | "get-stream": "^3.0.0", 3245 | "is-stream": "^1.1.0", 3246 | "npm-run-path": "^2.0.0", 3247 | "p-finally": "^1.0.0", 3248 | "signal-exit": "^3.0.0", 3249 | "strip-eof": "^1.0.0" 3250 | } 3251 | } 3252 | } 3253 | }, 3254 | "then-fs": { 3255 | "version": "2.0.0", 3256 | "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", 3257 | "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", 3258 | "requires": { 3259 | "promise": ">=3.2 <8" 3260 | } 3261 | }, 3262 | "through": { 3263 | "version": "2.3.8", 3264 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3265 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 3266 | }, 3267 | "thunkify": { 3268 | "version": "2.1.2", 3269 | "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", 3270 | "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" 3271 | }, 3272 | "timed-out": { 3273 | "version": "4.0.1", 3274 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 3275 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 3276 | }, 3277 | "tmp": { 3278 | "version": "0.0.33", 3279 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 3280 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 3281 | "requires": { 3282 | "os-tmpdir": "~1.0.2" 3283 | } 3284 | }, 3285 | "to-array": { 3286 | "version": "0.1.4", 3287 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 3288 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 3289 | }, 3290 | "toml": { 3291 | "version": "2.3.6", 3292 | "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", 3293 | "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" 3294 | }, 3295 | "tough-cookie": { 3296 | "version": "2.4.3", 3297 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 3298 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 3299 | "dev": true, 3300 | "requires": { 3301 | "psl": "^1.1.24", 3302 | "punycode": "^1.4.1" 3303 | }, 3304 | "dependencies": { 3305 | "punycode": { 3306 | "version": "1.4.1", 3307 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3308 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 3309 | "dev": true 3310 | } 3311 | } 3312 | }, 3313 | "tslib": { 3314 | "version": "1.9.3", 3315 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 3316 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 3317 | }, 3318 | "tunnel-agent": { 3319 | "version": "0.6.0", 3320 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3321 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3322 | "dev": true, 3323 | "requires": { 3324 | "safe-buffer": "^5.0.1" 3325 | } 3326 | }, 3327 | "tweetnacl": { 3328 | "version": "0.14.5", 3329 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3330 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3331 | "dev": true 3332 | }, 3333 | "type-check": { 3334 | "version": "0.3.2", 3335 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3336 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3337 | "requires": { 3338 | "prelude-ls": "~1.1.2" 3339 | } 3340 | }, 3341 | "type-detect": { 3342 | "version": "1.0.0", 3343 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 3344 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 3345 | "dev": true 3346 | }, 3347 | "type-is": { 3348 | "version": "1.6.16", 3349 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 3350 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 3351 | "requires": { 3352 | "media-typer": "0.3.0", 3353 | "mime-types": "~2.1.18" 3354 | } 3355 | }, 3356 | "uglify-js": { 3357 | "version": "3.5.1", 3358 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.1.tgz", 3359 | "integrity": "sha512-kI+3c+KphOAKIikQsZoT2oDsVYH5qvhpTtFObfMCdhPAYnjSvmW4oTWMhvDD4jtAGHJwztlBXQgozGcq3Xw9oQ==", 3360 | "dev": true, 3361 | "optional": true, 3362 | "requires": { 3363 | "commander": "~2.19.0", 3364 | "source-map": "~0.6.1" 3365 | }, 3366 | "dependencies": { 3367 | "commander": { 3368 | "version": "2.19.0", 3369 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", 3370 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", 3371 | "dev": true, 3372 | "optional": true 3373 | } 3374 | } 3375 | }, 3376 | "unique-string": { 3377 | "version": "1.0.0", 3378 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 3379 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 3380 | "requires": { 3381 | "crypto-random-string": "^1.0.0" 3382 | } 3383 | }, 3384 | "unpipe": { 3385 | "version": "1.0.0", 3386 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3387 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3388 | }, 3389 | "unzip-response": { 3390 | "version": "2.0.1", 3391 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 3392 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" 3393 | }, 3394 | "update-notifier": { 3395 | "version": "2.5.0", 3396 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", 3397 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", 3398 | "requires": { 3399 | "boxen": "^1.2.1", 3400 | "chalk": "^2.0.1", 3401 | "configstore": "^3.0.0", 3402 | "import-lazy": "^2.1.0", 3403 | "is-ci": "^1.0.10", 3404 | "is-installed-globally": "^0.1.0", 3405 | "is-npm": "^1.0.0", 3406 | "latest-version": "^3.0.0", 3407 | "semver-diff": "^2.0.0", 3408 | "xdg-basedir": "^3.0.0" 3409 | } 3410 | }, 3411 | "uri-js": { 3412 | "version": "4.2.2", 3413 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 3414 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 3415 | "dev": true, 3416 | "requires": { 3417 | "punycode": "^2.1.0" 3418 | } 3419 | }, 3420 | "url-parse-lax": { 3421 | "version": "1.0.0", 3422 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 3423 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 3424 | "requires": { 3425 | "prepend-http": "^1.0.1" 3426 | } 3427 | }, 3428 | "util-deprecate": { 3429 | "version": "1.0.2", 3430 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3431 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3432 | }, 3433 | "utils-merge": { 3434 | "version": "1.0.1", 3435 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3436 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3437 | }, 3438 | "uuid": { 3439 | "version": "3.3.2", 3440 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 3441 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 3442 | }, 3443 | "vary": { 3444 | "version": "1.1.2", 3445 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3446 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3447 | }, 3448 | "verror": { 3449 | "version": "1.10.0", 3450 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3451 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3452 | "dev": true, 3453 | "requires": { 3454 | "assert-plus": "^1.0.0", 3455 | "core-util-is": "1.0.2", 3456 | "extsprintf": "^1.2.0" 3457 | } 3458 | }, 3459 | "vscode-languageserver-types": { 3460 | "version": "3.14.0", 3461 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", 3462 | "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" 3463 | }, 3464 | "which": { 3465 | "version": "1.3.1", 3466 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3467 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3468 | "requires": { 3469 | "isexe": "^2.0.0" 3470 | } 3471 | }, 3472 | "widest-line": { 3473 | "version": "2.0.1", 3474 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", 3475 | "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", 3476 | "requires": { 3477 | "string-width": "^2.1.1" 3478 | } 3479 | }, 3480 | "window-size": { 3481 | "version": "0.1.4", 3482 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 3483 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 3484 | }, 3485 | "windows-release": { 3486 | "version": "3.1.0", 3487 | "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", 3488 | "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", 3489 | "requires": { 3490 | "execa": "^0.10.0" 3491 | } 3492 | }, 3493 | "winston": { 3494 | "version": "2.2.0", 3495 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.2.0.tgz", 3496 | "integrity": "sha1-LIU92Hq1UqjoSF1yy7+aIobwKbc=", 3497 | "requires": { 3498 | "async": "~1.0.0", 3499 | "colors": "1.0.x", 3500 | "cycle": "1.0.x", 3501 | "eyes": "0.1.x", 3502 | "isstream": "0.1.x", 3503 | "pkginfo": "0.3.x", 3504 | "stack-trace": "0.0.x" 3505 | }, 3506 | "dependencies": { 3507 | "async": { 3508 | "version": "1.0.0", 3509 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 3510 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 3511 | } 3512 | } 3513 | }, 3514 | "wordwrap": { 3515 | "version": "1.0.0", 3516 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 3517 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 3518 | }, 3519 | "wrap-ansi": { 3520 | "version": "2.1.0", 3521 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 3522 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 3523 | "requires": { 3524 | "string-width": "^1.0.1", 3525 | "strip-ansi": "^3.0.1" 3526 | }, 3527 | "dependencies": { 3528 | "ansi-regex": { 3529 | "version": "2.1.1", 3530 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 3531 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 3532 | }, 3533 | "is-fullwidth-code-point": { 3534 | "version": "1.0.0", 3535 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 3536 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 3537 | "requires": { 3538 | "number-is-nan": "^1.0.0" 3539 | } 3540 | }, 3541 | "string-width": { 3542 | "version": "1.0.2", 3543 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3544 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3545 | "requires": { 3546 | "code-point-at": "^1.0.0", 3547 | "is-fullwidth-code-point": "^1.0.0", 3548 | "strip-ansi": "^3.0.0" 3549 | } 3550 | }, 3551 | "strip-ansi": { 3552 | "version": "3.0.1", 3553 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3554 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3555 | "requires": { 3556 | "ansi-regex": "^2.0.0" 3557 | } 3558 | } 3559 | } 3560 | }, 3561 | "wrappy": { 3562 | "version": "1.0.2", 3563 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3564 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3565 | "dev": true 3566 | }, 3567 | "write-file-atomic": { 3568 | "version": "2.4.2", 3569 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", 3570 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", 3571 | "requires": { 3572 | "graceful-fs": "^4.1.11", 3573 | "imurmurhash": "^0.1.4", 3574 | "signal-exit": "^3.0.2" 3575 | } 3576 | }, 3577 | "ws": { 3578 | "version": "6.1.4", 3579 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", 3580 | "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", 3581 | "requires": { 3582 | "async-limiter": "~1.0.0" 3583 | } 3584 | }, 3585 | "xdg-basedir": { 3586 | "version": "3.0.0", 3587 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 3588 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 3589 | }, 3590 | "xml2js": { 3591 | "version": "0.4.19", 3592 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 3593 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 3594 | "requires": { 3595 | "sax": ">=0.6.0", 3596 | "xmlbuilder": "~9.0.1" 3597 | } 3598 | }, 3599 | "xmlbuilder": { 3600 | "version": "9.0.7", 3601 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 3602 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" 3603 | }, 3604 | "xmlhttprequest-ssl": { 3605 | "version": "1.5.5", 3606 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 3607 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" 3608 | }, 3609 | "xregexp": { 3610 | "version": "2.0.0", 3611 | "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", 3612 | "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" 3613 | }, 3614 | "y18n": { 3615 | "version": "3.2.1", 3616 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 3617 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 3618 | }, 3619 | "yallist": { 3620 | "version": "2.1.2", 3621 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 3622 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 3623 | }, 3624 | "yargs": { 3625 | "version": "3.32.0", 3626 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 3627 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 3628 | "requires": { 3629 | "camelcase": "^2.0.1", 3630 | "cliui": "^3.0.3", 3631 | "decamelize": "^1.1.1", 3632 | "os-locale": "^1.4.0", 3633 | "string-width": "^1.0.1", 3634 | "window-size": "^0.1.4", 3635 | "y18n": "^3.2.0" 3636 | }, 3637 | "dependencies": { 3638 | "ansi-regex": { 3639 | "version": "2.1.1", 3640 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 3641 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 3642 | }, 3643 | "is-fullwidth-code-point": { 3644 | "version": "1.0.0", 3645 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 3646 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 3647 | "requires": { 3648 | "number-is-nan": "^1.0.0" 3649 | } 3650 | }, 3651 | "string-width": { 3652 | "version": "1.0.2", 3653 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3654 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3655 | "requires": { 3656 | "code-point-at": "^1.0.0", 3657 | "is-fullwidth-code-point": "^1.0.0", 3658 | "strip-ansi": "^3.0.0" 3659 | } 3660 | }, 3661 | "strip-ansi": { 3662 | "version": "3.0.1", 3663 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3664 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3665 | "requires": { 3666 | "ansi-regex": "^2.0.0" 3667 | } 3668 | } 3669 | } 3670 | }, 3671 | "yeast": { 3672 | "version": "0.1.2", 3673 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 3674 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 3675 | } 3676 | } 3677 | } 3678 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spacy-nlp", 3 | "version": "1.0.11", 4 | "description": "Expose Spacy nlp text parsing to Nodejs (and other languages) via socketIO", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node src/start-io.js", 8 | "test": "istanbul cover _mocha", 9 | "snyk-protect": "snyk protect", 10 | "prepublish": "npm run snyk-protect" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/kengz/spacy-nlp.git" 15 | }, 16 | "keywords": [ 17 | "spacy", 18 | "nlp", 19 | "parse", 20 | "parsing", 21 | "parser", 22 | "socketIO", 23 | "python", 24 | "POS", 25 | "NER", 26 | "syntaxnet" 27 | ], 28 | "author": "kengz kengzwl@gmail.com", 29 | "license": "MIT", 30 | "bugs": { 31 | "url": "https://github.com/kengz/spacy-nlp/issues" 32 | }, 33 | "homepage": "https://github.com/kengz/spacy-nlp#readme", 34 | "dependencies": { 35 | "bluebird": "^3.4.6", 36 | "lodash": "^4.16.4", 37 | "poly-socketio": "^1.1.1", 38 | "portscanner": "2.2.0", 39 | "snyk": "^1.41.1", 40 | "winston": "^2.2.0" 41 | }, 42 | "devDependencies": { 43 | "chai": "^3.5.0", 44 | "chai-as-promised": "7.1.1", 45 | "codeclimate-test-reporter": "0.5.1", 46 | "istanbul": "^0.4.5", 47 | "mocha": "^3.1.0" 48 | }, 49 | "snyk": true 50 | } 51 | -------------------------------------------------------------------------------- /src/client.py: -------------------------------------------------------------------------------- 1 | # The client for py; imports all py modules 2 | 3 | ########################################## 4 | # !Hack for SocketIO py client to work with unicode. 5 | # Overrides the recv_packet of WebsocketTransport, 6 | # changing from six.b to six.u when failing 7 | # !Awaiting module author to fix the issue from source 8 | import sys 9 | import os 10 | import six 11 | import socket 12 | import websocket 13 | from socketIO_client_nexus import SocketIO, WebsocketTransport 14 | from py import nlp 15 | 16 | 17 | def recv_packet_unicode(self): 18 | try: 19 | packet_text = self._connection.recv() 20 | except websocket.WebSocketTimeoutException as e: 21 | raise TimeoutError('recv timed out (%s)' % e) 22 | except websocket.SSLError as e: 23 | raise ConnectionError('recv disconnected by SSL (%s)' % e) 24 | except websocket.WebSocketConnectionClosedException as e: 25 | raise ConnectionError('recv disconnected (%s)' % e) 26 | except socket.error as e: 27 | raise ConnectionError('recv disconnected (%s)' % e) 28 | try: 29 | encoded = six.b(packet_text) 30 | except (UnicodeEncodeError): 31 | pass 32 | else: 33 | encoded = six.u(packet_text) 34 | engineIO_packet_type, engineIO_packet_data = parse_packet_text(encoded) 35 | yield engineIO_packet_type, engineIO_packet_data 36 | 37 | 38 | # Set the new recv_packet_unicode method 39 | WebsocketTransport.recv_packet = recv_packet_unicode 40 | 41 | # Hack ends 42 | ########################################## 43 | 44 | 45 | class dotdict(dict): 46 | 47 | """dot.notation access to dictionary attributes""" 48 | 49 | def __getattr__(self, attr): 50 | return self.get(attr) 51 | __setattr__ = dict.__setitem__ 52 | __delattr__ = dict.__delitem__ 53 | 54 | 55 | # the global object to access all modules (nested) in py/ 56 | lib_py = dotdict(globals()) 57 | 58 | 59 | def getAt(module, dotpath): 60 | '''Custom function to return the property of module at dotpath''' 61 | pathList = dotpath.split('.') 62 | prop = module 63 | while len(pathList): 64 | k = pathList.pop(0) 65 | try: 66 | prop = prop[k] 67 | except Exception: 68 | prop = getattr(prop, k) 69 | return prop 70 | 71 | # print(lib_py) 72 | # print(getAt(lib_py, "hello.sayHi")) 73 | # print(getAt(lib_py, "ai.nlp")) 74 | 75 | 76 | def correctReply(reply, msg): 77 | '''correct the reply JSON''' 78 | if type(reply) is not dict: 79 | reply = {"output": reply} 80 | # autofill if not already exist 81 | reply["to"] = reply.get("to") or msg.get("from") 82 | reply["from"] = reply.get("from") or ioid 83 | reply["hash"] = reply.get("hash") or msg.get("hash") 84 | return reply 85 | # correctReply({}, {"from": "your mom"}) 86 | 87 | 88 | # 1. Register the socket.io client 89 | ########################################## 90 | IOPORT = os.environ.get('IOPORT', '6466') 91 | client = SocketIO('localhost', int(IOPORT)) 92 | # the id of this script for io client registration 93 | ioid = 'cgkb-py' 94 | # first join for serialization 95 | client.emit('join', ioid) 96 | client.on('disconnect', client.disconnect) 97 | 98 | 99 | # 2. Write module methods and register as handlers 100 | ########################################## 101 | # done in your module scripts 102 | 103 | 104 | # 3. listener to handle incoming payload. 105 | ########################################## 106 | 107 | # The handle will call handlers using intent = method name 108 | def handle(msg): 109 | to = msg.get('to') # the target module, e.g. hello 110 | intent = msg.get('intent') # the module's function, e.g. sayHi() 111 | reply = None 112 | if to is not None and intent is not None: 113 | # try JSON or JSON.input as input 114 | try: 115 | reply = getAt(getAt(lib_py, to), intent)(msg) 116 | except: 117 | try: 118 | reply = getAt(getAt(lib_py, to), intent)( 119 | msg.get("input"), msg.get("options")) 120 | except: 121 | e = sys.exc_info()[0] 122 | print('py handle fails.', e) 123 | try: 124 | reply = getAt(getAt(lib_py, to), intent)( 125 | msg.get("input")) 126 | except: 127 | e = sys.exc_info()[0] 128 | print('py handle fails.', e) 129 | finally: 130 | # try JSON or made-JSON output 131 | reply = correctReply(reply, msg) 132 | if reply.get('to') is not None: 133 | client.emit('pass', reply) 134 | 135 | 136 | # add listener 137 | client.on('take', handle) 138 | 139 | # keep-alive 140 | client.wait() 141 | -------------------------------------------------------------------------------- /src/log.js: -------------------------------------------------------------------------------- 1 | const winston = require("winston"); 2 | 3 | /* istanbul ignore next */ 4 | logLevel = process.env["npm_config_debug"] ? "debug" : "info"; 5 | const log = 6 | global.log || 7 | new winston.Logger({ 8 | level: logLevel, 9 | transports: [ 10 | new winston.transports.Console({ 11 | formatter: options => { 12 | /* istanbul ignore next */ 13 | return `[${new Date()}] ${winston.config.colorize( 14 | options.level, 15 | options.level.toUpperCase() 16 | )} ${options.message || ""}`; 17 | } 18 | }) 19 | ] 20 | }); 21 | 22 | module.exports = log; 23 | -------------------------------------------------------------------------------- /src/nlp.js: -------------------------------------------------------------------------------- 1 | // assuming server is started and ready 2 | const polyIO = require("poly-socketio"); 3 | /* istanbul ignore next */ 4 | process.env.IOPORT = process.env.IOPORT || 6466; 5 | 6 | function parse(text) { 7 | polyIO.client({ port: process.env.IOPORT }); 8 | const msg = { 9 | input: text, 10 | to: "nlp.cgkb-py", 11 | intent: "parse" 12 | }; 13 | return global.client.pass(msg).then(reply => { 14 | return reply.output; 15 | }); 16 | } 17 | 18 | function parse_nouns(text, options) { 19 | polyIO.client({ port: process.env.IOPORT }); 20 | const msg = { 21 | input: [text], 22 | options: options, 23 | to: "nlp.cgkb-py", 24 | intent: "parse_nouns" 25 | }; 26 | return global.client.pass(msg).then(reply => { 27 | return reply.output; 28 | }); 29 | } 30 | 31 | function parse_verbs(text, options) { 32 | polyIO.client({ port: process.env.IOPORT }); 33 | const msg = { 34 | input: [text], 35 | options: options, 36 | to: "nlp.cgkb-py", 37 | intent: "parse_verbs" 38 | }; 39 | return global.client.pass(msg).then(reply => { 40 | return reply.output; 41 | }); 42 | } 43 | 44 | function parse_adj(text, options) { 45 | polyIO.client({ port: process.env.IOPORT }); 46 | const msg = { 47 | input: [text], 48 | options: options, 49 | to: "nlp.cgkb-py", 50 | intent: "parse_adj" 51 | }; 52 | return global.client.pass(msg).then(reply => { 53 | return reply.output; 54 | }); 55 | } 56 | 57 | function parse_named_entities(text, options) { 58 | polyIO.client({ port: process.env.IOPORT }); 59 | const msg = { 60 | input: [text], 61 | options: options, 62 | to: "nlp.cgkb-py", 63 | intent: "parse_named_entities" 64 | }; 65 | return global.client.pass(msg).then(reply => { 66 | return reply.output; 67 | }); 68 | } 69 | 70 | function parse_date(text, options) { 71 | polyIO.client({ port: process.env.IOPORT }); 72 | const msg = { 73 | input: [text], 74 | options: options, 75 | to: "nlp.cgkb-py", 76 | intent: "parse_date" 77 | }; 78 | return global.client.pass(msg).then(reply => { 79 | return reply.output; 80 | }); 81 | } 82 | 83 | function parse_time(text, options) { 84 | polyIO.client({ port: process.env.IOPORT }); 85 | const msg = { 86 | input: [text], 87 | options: options, 88 | to: "nlp.cgkb-py", 89 | intent: "parse_time" 90 | }; 91 | return global.client.pass(msg).then(reply => { 92 | return reply.output; 93 | }); 94 | } 95 | 96 | function split_text(text) { 97 | let wordArray = []; 98 | const tokens = text.split(" "); 99 | const n = Math.floor(tokens.length / 3); 100 | const n1 = tokens.slice(0, n).join(" "); 101 | const n2 = tokens.slice(n, n * 2).join(" "); 102 | const n3 = tokens.slice(n * 2, tokens.length).join(" "); 103 | wordArray.push(n1, n2, n3); 104 | return wordArray; 105 | } 106 | 107 | function remove_duplicates(input) { 108 | const filterResult = input.map(x => String(x).trim()); 109 | const finalResult = [...new Set(filterResult)]; 110 | return finalResult; 111 | } 112 | 113 | function top_words(string, cutOff) { 114 | const re = /'?\w[\w']*(?:-\w+)*'?/g; 115 | let words = string.match(re); 116 | let frequencies = {}; 117 | let word; 118 | 119 | for (let i = 0; i < words.length; i++) { 120 | word = words[i]; 121 | frequencies[word] = frequencies[word] || 0; 122 | frequencies[word]++; 123 | } 124 | const result = Object.keys(frequencies).map(key => [key, frequencies[key]]); 125 | 126 | const sortedResult = result.sort((a, b) => b[1] - a[1]).slice(0, cutOff); 127 | let finalResult = []; 128 | for (let x = 0; x < sortedResult.length; x++) { 129 | const resultObject = { 130 | word: sortedResult[x][0], 131 | count: sortedResult[x][1] 132 | }; 133 | finalResult.push(resultObject); 134 | } 135 | return finalResult; 136 | } 137 | 138 | module.exports = { 139 | parse: parse, 140 | parse_nouns: parse_nouns, 141 | parse_verbs: parse_verbs, 142 | parse_adj: parse_adj, 143 | parse_named_entities: parse_named_entities, 144 | parse_date: parse_date, 145 | parse_time: parse_time, 146 | split_text: split_text, 147 | remove_duplicates: remove_duplicates, 148 | top_words: top_words 149 | }; 150 | -------------------------------------------------------------------------------- /src/py/__init__.py: -------------------------------------------------------------------------------- 1 | # allow rel import to work when called from elsewhere 2 | import os 3 | import sys 4 | import glob 5 | from os.path import dirname, basename, isfile 6 | 7 | file_path = os.path.normpath(os.path.join(os.path.dirname(__file__))) 8 | sys.path.insert(0, file_path) 9 | 10 | pattern = "/*.py" 11 | modules = glob.glob(dirname(__file__) + pattern) 12 | __all__ = [basename(f)[:-3] for f in modules if isfile(f)] 13 | -------------------------------------------------------------------------------- /src/py/nlp.py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | import spacy # NLP with spaCy https://spacy.io 3 | nlp = spacy.load('en_core_web_md') # will take some time to load 4 | 5 | # Helper methods 6 | ########################################## 7 | 8 | 9 | def merge_ents(doc): 10 | '''Helper: merge adjacent entities into single tokens; modifies the doc.''' 11 | for ent in doc.ents: 12 | ent.merge(ent.root.tag_, ent.text, ent.label_) 13 | return doc 14 | 15 | 16 | def format_POS(token, light=False, flat=False): 17 | '''helper: form the POS output for a token''' 18 | subtree = OrderedDict([ 19 | ("word", token.text), 20 | ("lemma", token.lemma_), # trigger 21 | ("NE", token.ent_type_), # trigger 22 | ("POS_fine", token.tag_), 23 | ("POS_coarse", token.pos_), 24 | ("arc", token.dep_), 25 | ("modifiers", []) 26 | ]) 27 | if light: 28 | subtree.pop("lemma") 29 | subtree.pop("NE") 30 | if flat: 31 | subtree.pop("arc") 32 | subtree.pop("modifiers") 33 | return subtree 34 | 35 | 36 | def POS_tree_(root, light=False): 37 | ''' 38 | Helper: generate a POS tree for a root token. 39 | The doc must have merge_ents(doc) ran on it. 40 | ''' 41 | subtree = format_POS(root, light=light) 42 | for c in root.children: 43 | subtree["modifiers"].append(POS_tree_(c)) 44 | return subtree 45 | 46 | 47 | def parse_tree(doc, light=False): 48 | '''generate the POS tree for all sentences in a doc''' 49 | merge_ents(doc) # merge the entities into single tokens first 50 | return [POS_tree_(sent.root, light=light) for sent in doc.sents] 51 | 52 | 53 | def parse_list(doc, light=False): 54 | '''tag the doc first by NER (merged as tokens) then 55 | POS. Can be seen as the flat version of parse_tree''' 56 | merge_ents(doc) # merge the entities into single tokens first 57 | return [format_POS(token, light=light, flat=True) for token in doc] 58 | 59 | # s = "find me flights from New York to London next month" 60 | # doc = nlp(s) 61 | # parse_list(doc) 62 | 63 | 64 | # Primary methods 65 | ########################################## 66 | 67 | def parse_sentence(sentence): 68 | ''' 69 | Main method: parse an input sentence and return the nlp properties. 70 | ''' 71 | doc = nlp(sentence) 72 | reply = OrderedDict([ 73 | ("text", doc.text), 74 | ("len", len(doc)), 75 | ("tokens", [token.text for token in doc]), 76 | ("noun_phrases", [token.text for token in doc.noun_chunks]), 77 | ("parse_tree", parse_tree(doc)), 78 | ("parse_list", parse_list(doc)) 79 | ]) 80 | return reply 81 | 82 | # res = parse_sentence("find me flights from New York to London next month.") 83 | 84 | 85 | def parse(input): 86 | ''' 87 | parse for multi-sentences; split and apply parse in a list. 88 | ''' 89 | doc = nlp(input) 90 | return [parse_sentence(sent.text) for sent in doc.sents] 91 | 92 | # print(parse("Bob brought the pizza to Alice. I saw the man with glasses.")) 93 | 94 | 95 | def parse_nouns(input, options): 96 | nounCount = 0 97 | nounArray = [] 98 | resultArray = [] 99 | for doc in nlp.pipe(input, disable=['ner', 'parser', 'textcat']): 100 | for token in doc: 101 | if 'count' in options: 102 | if token.pos_ == 'NOUN': 103 | nounCount += 1 104 | if 'words' in options: 105 | if token.pos_ == 'NOUN': 106 | nounArray.append(token.text) 107 | if 'count' in options: 108 | inner = {} 109 | inner['type'] = 'count' 110 | inner['result'] = nounCount 111 | resultArray.append(inner) 112 | if 'words' in options: 113 | inner = {} 114 | inner['type'] = 'words' 115 | inner['result'] = nounArray 116 | resultArray.append(inner) 117 | return resultArray 118 | 119 | 120 | def parse_verbs(input, options): 121 | verbCount = 0 122 | verbArray = [] 123 | resultArray = [] 124 | for doc in nlp.pipe(input, disable=['ner', 'parser', 'textcat']): 125 | for token in doc: 126 | if 'count' in options: 127 | if token.pos_ == 'VERB': 128 | verbCount += 1 129 | if 'words' in options: 130 | if token.pos_ == 'VERB': 131 | verbArray.append(token.text) 132 | if 'count' in options: 133 | inner = {} 134 | inner['type'] = 'count' 135 | inner['result'] = verbCount 136 | resultArray.append(inner) 137 | if 'words' in options: 138 | inner = {} 139 | inner['type'] = 'words' 140 | inner['result'] = verbArray 141 | resultArray.append(inner) 142 | return resultArray 143 | 144 | 145 | def parse_adj(input, options): 146 | adjCount = 0 147 | adjArray = [] 148 | resultArray = [] 149 | for doc in nlp.pipe(input, disable=['ner', 'parser', 'textcat']): 150 | for token in doc: 151 | if 'count' in options: 152 | if token.pos_ == 'ADJ': 153 | adjCount += 1 154 | if 'words' in options: 155 | if token.pos_ == 'ADJ': 156 | adjArray.append(token.text) 157 | if 'count' in options: 158 | inner = {} 159 | inner['type'] = 'count' 160 | inner['result'] = adjCount 161 | resultArray.append(inner) 162 | if 'words' in options: 163 | inner = {} 164 | inner['type'] = 'words' 165 | inner['result'] = adjArray 166 | resultArray.append(inner) 167 | return resultArray 168 | 169 | 170 | def parse_named_entities(input, options): 171 | entCount = 0 172 | entArray = [] 173 | resultArray = [] 174 | for doc in nlp.pipe(input, disable=['textcat']): 175 | for ent in doc.ents: 176 | if 'count' in options: 177 | if ent.label_ not in {'DATE', 'TIME', 'ORDINAL', 'QUANTITY', 'PERCENT', 'CARDINAL', 'MONEY'}: 178 | entCount += 1 179 | if 'words' in options: 180 | if ent.label_ not in {'DATE', 'TIME', 'ORDINAL', 'QUANTITY', 'PERCENT', 'CARDINAL', 'MONEY'}: 181 | entArray.append(ent.text) 182 | if 'count' in options: 183 | inner = {} 184 | inner['type'] = 'count' 185 | inner['result'] = entCount 186 | resultArray.append(inner) 187 | if 'words' in options: 188 | inner = {} 189 | inner['type'] = 'words' 190 | inner['result'] = entArray 191 | resultArray.append(inner) 192 | return resultArray 193 | 194 | 195 | def parse_date(input, options): 196 | dateCount = 0 197 | dateArray = [] 198 | resultArray = [] 199 | for doc in nlp.pipe(input, disable=['textcat']): 200 | for ent in doc.ents: 201 | if 'count' in options: 202 | if ent.label_ == 'DATE': 203 | dateCount += 1 204 | if 'words' in options: 205 | if ent.label_ == 'DATE': 206 | dateArray.append(ent.text) 207 | if 'count' in options: 208 | inner = {} 209 | inner['type'] = 'count' 210 | inner['result'] = dateCount 211 | resultArray.append(inner) 212 | if 'words' in options: 213 | inner = {} 214 | inner['type'] = 'words' 215 | inner['result'] = dateArray 216 | resultArray.append(inner) 217 | return resultArray 218 | 219 | 220 | def parse_time(input, options): 221 | timeCount = 0 222 | timeArray = [] 223 | resultArray = [] 224 | for doc in nlp.pipe(input, disable=['textcat']): 225 | for ent in doc.ents: 226 | if 'count' in options: 227 | if ent.label_ == 'TIME': 228 | timeCount += 1 229 | if 'words' in options: 230 | if ent.label_ == 'TIME': 231 | timeArray.append(ent.text) 232 | if 'count' in options: 233 | inner = {} 234 | inner['type'] = 'count' 235 | inner['result'] = timeCount 236 | resultArray.append(inner) 237 | if 'words' in options: 238 | inner = {} 239 | inner['type'] = 'words' 240 | inner['result'] = timeArray 241 | resultArray.append(inner) 242 | return resultArray 243 | -------------------------------------------------------------------------------- /src/start-io.js: -------------------------------------------------------------------------------- 1 | // The socket.io server and polyglot clients. Called by scripts/_init.js 2 | const Promise = require("bluebird"); 3 | const { spawn } = require("child_process"); 4 | const _ = require("lodash"); 5 | const path = require("path"); 6 | const polyIO = require("poly-socketio"); 7 | const log = require(path.join(__dirname, "log")); 8 | const portscanner = require("portscanner"); 9 | /* istanbul ignore next */ 10 | const bashSrc = process.platform == "darwin" ? "~/.bash_profile" : "~/.bashrc"; 11 | /* istanbul ignore next */ 12 | const srcCmd = process.env.CI ? "" : `. ${bashSrc}`; 13 | Promise.promisifyAll(portscanner); 14 | process.env.IOPORT = process.env.IOPORT || 6466; 15 | 16 | // import other languages via child_process 17 | var ioClientCmds = { 18 | python3: { 19 | // install_dependency: "python -m pip install socketIO-client", 20 | client: path.join(__dirname, "client.py") 21 | } 22 | }; 23 | 24 | const CLIENT_COUNT = 1; // only py client is vital 25 | 26 | /** 27 | * Helper: called from within ioServer after its setup. 28 | * Start all polyglot ioClient processes using spawn. Kill them on error to prevent runaway processes, i.e. run all the io_import. processes. The io_import. im turn runs all the io clients of that language. 29 | */ 30 | /* istanbul ignore next */ 31 | function ioClient() { 32 | // the child processes,kill all on death 33 | var children = []; 34 | 35 | /* istanbul ignore next */ 36 | process.on("exit", () => { 37 | children.forEach(child => { 38 | child.kill(); 39 | }); 40 | log.info("Exit: killed ioClient.js children"); 41 | }); 42 | 43 | _.each(ioClientCmds, (cmds, lang) => { 44 | // spawn ioclients for other lang 45 | log.info(`Starting socketIO client for ${lang} at ${process.env.IOPORT}`); 46 | var cp = spawn( 47 | "/bin/sh", 48 | [ 49 | "-c", 50 | ` 51 | ${srcCmd} 52 | ${lang} ${cmds["client"]} 53 | ` 54 | ], 55 | { stdio: [process.stdin, process.stdout, "pipe"] } 56 | ); 57 | children.push(cp); 58 | 59 | /* istanbul ignore next */ 60 | cp.stderr.on("data", data => { 61 | log.error(`${data.toString("utf8")}`); 62 | cp.kill("SIGTERM"); // kill if err to prevent runover process 63 | }); 64 | }); 65 | } 66 | 67 | /** 68 | * The main method to start the io server then clients. 69 | * Calls server and client methods above. 70 | */ 71 | /* istanbul ignore next */ 72 | function ioStart() { 73 | portscanner 74 | .checkPortStatusAsync(process.env.IOPORT, "127.0.0.1") 75 | .then(status => { 76 | if (status === "closed") { 77 | // no poly socketIO server exists at port yet, start new 78 | return polyIO.server({ 79 | port: process.env.IOPORT, 80 | clientCount: CLIENT_COUNT, 81 | debug: process.env["npm_config_debug"] 82 | }); 83 | } else { 84 | return Promise.resolve(); 85 | } 86 | }) 87 | .then(ioClient); 88 | return (global.ioPromise || Promise.resolve()).delay(10); 89 | } 90 | 91 | /* istanbul ignore next */ 92 | const cleanExit = () => { 93 | process.exit(); 94 | }; 95 | process.on("SIGINT", cleanExit); // catch ctrl-c 96 | process.on("SIGTERM", cleanExit); // catch kill 97 | process.on("uncaughtException", e => log.error(`${e.message} ${e.stack}`)); 98 | 99 | // export for use by hubot 100 | module.exports = ioStart; 101 | 102 | // if this file is run directly by `node server.js` 103 | /* istanbul ignore next */ 104 | if (require.main === module) { 105 | ioStart(); 106 | } 107 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --reporter spec 2 | --ui tdd 3 | --recursive 4 | --colors 5 | --timeout 100000 -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const Promise = require("bluebird"); 2 | const chai = require("chai"); 3 | const chaiAsPromised = require("chai-as-promised"); 4 | chai.use(chaiAsPromised); 5 | const should = chai.should(); 6 | const spacyNLP = require("../index"); 7 | const nlpSpacy = spacyNLP.nlp; 8 | 9 | describe("start poly-socketio", () => { 10 | spacyNLP.server().then(() => { 11 | global.ioPromise.should.be.fulfilled; 12 | }); 13 | 14 | it("resolve global.ioPromise when all joined", () => { 15 | var globalClient = spacyNLP.nlp; 16 | return global.ioPromise; 17 | }); 18 | }); 19 | 20 | describe("parse", () => { 21 | it("parse text", async () => { 22 | const result = await nlpSpacy.parse("Bob Brought the pizza to Alice."); 23 | chai.assert.deepEqual(result, [ 24 | { 25 | text: "Bob Brought the pizza to Alice.", 26 | len: 7, 27 | tokens: ["Bob", "Brought", "the", "pizza", "to", "Alice", "."], 28 | noun_phrases: ["Bob", "the pizza", "Alice"], 29 | parse_tree: [ 30 | { 31 | word: "Brought", 32 | lemma: "bring", 33 | NE: "", 34 | POS_fine: "VBD", 35 | POS_coarse: "VERB", 36 | arc: "ROOT", 37 | modifiers: [ 38 | { 39 | word: "Bob", 40 | lemma: "Bob", 41 | NE: "PERSON", 42 | POS_fine: "NNP", 43 | POS_coarse: "PROPN", 44 | arc: "nsubj", 45 | modifiers: [] 46 | }, 47 | { 48 | word: "pizza", 49 | lemma: "pizza", 50 | NE: "", 51 | POS_fine: "NN", 52 | POS_coarse: "NOUN", 53 | arc: "dobj", 54 | modifiers: [ 55 | { 56 | word: "the", 57 | lemma: "the", 58 | NE: "", 59 | POS_fine: "DT", 60 | POS_coarse: "DET", 61 | arc: "det", 62 | modifiers: [] 63 | } 64 | ] 65 | }, 66 | { 67 | word: "to", 68 | lemma: "to", 69 | NE: "", 70 | POS_fine: "IN", 71 | POS_coarse: "ADP", 72 | arc: "prep", 73 | modifiers: [ 74 | { 75 | word: "Alice", 76 | lemma: "Alice", 77 | NE: "PERSON", 78 | POS_fine: "NNP", 79 | POS_coarse: "PROPN", 80 | arc: "pobj", 81 | modifiers: [] 82 | } 83 | ] 84 | }, 85 | { 86 | word: ".", 87 | lemma: ".", 88 | NE: "", 89 | POS_fine: ".", 90 | POS_coarse: "PUNCT", 91 | arc: "punct", 92 | modifiers: [] 93 | } 94 | ] 95 | } 96 | ], 97 | parse_list: [ 98 | { 99 | word: "Bob", 100 | lemma: "Bob", 101 | NE: "PERSON", 102 | POS_fine: "NNP", 103 | POS_coarse: "PROPN" 104 | }, 105 | { 106 | word: "Brought", 107 | lemma: "bring", 108 | NE: "", 109 | POS_fine: "VBD", 110 | POS_coarse: "VERB" 111 | }, 112 | { 113 | word: "the", 114 | lemma: "the", 115 | NE: "", 116 | POS_fine: "DT", 117 | POS_coarse: "DET" 118 | }, 119 | { 120 | word: "pizza", 121 | lemma: "pizza", 122 | NE: "", 123 | POS_fine: "NN", 124 | POS_coarse: "NOUN" 125 | }, 126 | { 127 | word: "to", 128 | lemma: "to", 129 | NE: "", 130 | POS_fine: "IN", 131 | POS_coarse: "ADP" 132 | }, 133 | { 134 | word: "Alice", 135 | lemma: "Alice", 136 | NE: "PERSON", 137 | POS_fine: "NNP", 138 | POS_coarse: "PROPN" 139 | }, 140 | { word: ".", lemma: ".", NE: "", POS_fine: ".", POS_coarse: "PUNCT" } 141 | ] 142 | } 143 | ]); 144 | }); 145 | }); 146 | 147 | describe("parse nouns", () => { 148 | it("parse nouns with words as an option", async () => { 149 | const options = ["words"]; 150 | const result = await nlpSpacy.parse_nouns( 151 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 152 | options 153 | ); 154 | chai.assert.deepEqual(result, [ 155 | { 156 | type: "words", 157 | result: [ 158 | "powers", 159 | "invasion", 160 | "land", 161 | "theatre", 162 | "war", 163 | "history", 164 | "war", 165 | "attrition", 166 | "war" 167 | ] 168 | } 169 | ]); 170 | }); 171 | 172 | it("parse nouns with count as an option", async () => { 173 | const options = ["count"]; 174 | const result = await nlpSpacy.parse_nouns( 175 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 176 | options 177 | ); 178 | chai.assert.deepEqual(result, [ 179 | { 180 | type: "count", 181 | result: 9 182 | } 183 | ]); 184 | }); 185 | }); 186 | 187 | describe("parse verbs", () => { 188 | it("parse verbs with words as an option", async () => { 189 | const options = ["words"]; 190 | const result = await nlpSpacy.parse_verbs( 191 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 192 | options 193 | ); 194 | chai.assert.deepEqual(result, [ 195 | { 196 | type: "words", 197 | result: [ 198 | "launched", 199 | "opening", 200 | "trapped", 201 | "abbreviated", 202 | "known", 203 | "was", 204 | "lasted" 205 | ] 206 | } 207 | ]); 208 | }); 209 | 210 | it("parse verbs with count as an option", async () => { 211 | const options = ["count"]; 212 | const result = await nlpSpacy.parse_verbs( 213 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 214 | options 215 | ); 216 | chai.assert.deepEqual(result, [ 217 | { 218 | type: "count", 219 | result: 7 220 | } 221 | ]); 222 | }); 223 | }); 224 | 225 | describe("parse adjectives", () => { 226 | it("parse adjectives with words as an option", async () => { 227 | const options = ["words"]; 228 | const result = await nlpSpacy.parse_adj( 229 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 230 | options 231 | ); 232 | chai.assert.deepEqual(result, [ 233 | { 234 | type: "words", 235 | result: ["largest", "German", "global"] 236 | } 237 | ]); 238 | }); 239 | 240 | it("parse adjectives with count as an option", async () => { 241 | const options = ["count"]; 242 | const result = await nlpSpacy.parse_adj( 243 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 244 | options 245 | ); 246 | chai.assert.deepEqual(result, [ 247 | { 248 | type: "count", 249 | result: 3 250 | } 251 | ]); 252 | }); 253 | }); 254 | 255 | describe("parse named entities", () => { 256 | it("parse named entities with words as an option", async () => { 257 | const options = ["words"]; 258 | const result = await nlpSpacy.parse_named_entities( 259 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 260 | options 261 | ); 262 | chai.assert.deepEqual(result, [ 263 | { 264 | type: "words", 265 | result: [ 266 | "European", 267 | "the Soviet Union", 268 | "Axis", 269 | "German", 270 | "Wehrmacht", 271 | "World War II", 272 | "WWII", 273 | "WW2", 274 | "the Second World War" 275 | ] 276 | } 277 | ]); 278 | }); 279 | 280 | it("parse named entities with count as an option", async () => { 281 | const options = ["count"]; 282 | const result = await nlpSpacy.parse_named_entities( 283 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 284 | options 285 | ); 286 | chai.assert.deepEqual(result, [ 287 | { 288 | type: "count", 289 | result: 9 290 | } 291 | ]); 292 | }); 293 | }); 294 | 295 | describe("parse dates", () => { 296 | it("parse dates with words as an option", async () => { 297 | const options = ["words"]; 298 | const result = await nlpSpacy.parse_date( 299 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 300 | options 301 | ); 302 | chai.assert.deepEqual(result, [ 303 | { 304 | type: "words", 305 | result: ["22 June 1941", "from 1939 to 1945"] 306 | } 307 | ]); 308 | }); 309 | 310 | it("parse dates with count as an option", async () => { 311 | const options = ["count"]; 312 | const result = await nlpSpacy.parse_date( 313 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 314 | options 315 | ); 316 | chai.assert.deepEqual(result, [ 317 | { 318 | type: "count", 319 | result: 2 320 | } 321 | ]); 322 | }); 323 | }); 324 | 325 | describe("parse time", () => { 326 | it("parse time with words as an option", async () => { 327 | const options = ["words"]; 328 | const result = await nlpSpacy.parse_time( 329 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 330 | options 331 | ); 332 | chai.assert.deepEqual(result, [ 333 | { 334 | type: "words", 335 | result: [] 336 | } 337 | ]); 338 | }); 339 | 340 | it("parse time with count as an option", async () => { 341 | const options = ["count"]; 342 | const result = await nlpSpacy.parse_time( 343 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945.", 344 | options 345 | ); 346 | chai.assert.deepEqual(result, [ 347 | { 348 | type: "count", 349 | result: 0 350 | } 351 | ]); 352 | }); 353 | }); 354 | 355 | describe("split text", () => { 356 | it("split text into 3 chuncks", () => { 357 | const result = nlpSpacy.split_text( 358 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945." 359 | ); 360 | chai.assert.deepEqual(result, [ 361 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of", 362 | "war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often", 363 | "abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945." 364 | ]); 365 | }); 366 | }); 367 | 368 | describe("remove duplicates", () => { 369 | it("remove dupliates from an array", () => { 370 | const result = nlpSpacy.remove_duplicates([ 371 | "war", 372 | "war", 373 | "war", 374 | "war", 375 | "war", 376 | "world", 377 | "world", 378 | "world", 379 | "axis", 380 | "axis", 381 | "ww2", 382 | "wwii", 383 | "land", 384 | "wehrmacht", 385 | "union", 386 | "powers", 387 | "attrition" 388 | ]); 389 | chai.assert.deepEqual(result, [ 390 | "war", 391 | "world", 392 | "axis", 393 | "ww2", 394 | "wwii", 395 | "land", 396 | "wehrmacht", 397 | "union", 398 | "powers", 399 | "attrition" 400 | ]); 401 | }); 402 | 403 | describe("get top words", () => { 404 | it("get the 5 top words in a string", () => { 405 | const text = 406 | "On 22 June 1941, the European Axis powers launched an invasion of the Soviet Union, opening the largest land theatre of war in history, which trapped the Axis, most crucially the German Wehrmacht, into a war of attrition. World War II (often abbreviated to WWII or WW2), also known as the Second World War, was a global war that lasted from 1939 to 1945."; 407 | 408 | const result = nlpSpacy.top_words(text, 5); 409 | 410 | chai.assert.deepEqual(result, [ 411 | { word: "the", count: 6 }, 412 | { word: "of", count: 3 }, 413 | { word: "war", count: 3 }, 414 | { word: "Axis", count: 2 }, 415 | { word: "a", count: 2 } 416 | ]); 417 | }); 418 | }); 419 | }); 420 | --------------------------------------------------------------------------------