├── .gitattributes ├── .gitignore ├── .gitmodules ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── README.md ├── images ├── 1.png ├── 2.png ├── 3.png └── 4.png ├── package-lock.json ├── package.json ├── src ├── corewren.ts ├── extension.ts ├── test │ ├── extension.test.ts │ └── index.ts └── wrenmanager.ts ├── tsconfig.json ├── tslint.json └── vsc-extension-quickstart.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set default behavior to automatically normalize line endings. 2 | * text=auto 3 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "wrenalyzer-ts"] 2 | path = src/wrenalyzer-ts 3 | url = https://github.com/sponge/wrenalyzer-ts 4 | [submodule "src/wrenalyzer-ts"] 5 | path = src/wrenalyzer-ts 6 | url = https://github.com/sponge/wrenalyzer-ts 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "eg2.tslint" 6 | ] 7 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "npm: watch" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "npm: watch" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off" 11 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | src/** 6 | .gitignore 7 | tsconfig.json 8 | vsc-extension-quickstart.md 9 | tslint.json -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to the "wren-language-provider" extension will be documented in this file. 3 | 4 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 5 | 6 | ## [Unreleased] 7 | - Initial release -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Wren Language Provider for Visual Studio Code 2 | 3 | [Available on the Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=sponge.wren-language-provider) 4 | 5 | This is a super basic VS Code extension that provides some autocompletion and function signature helpers for the [Wren](http://wren.io) scripting language. So far, this extension is more of a fun learning experience, and something that I could personally use to help remember function signatures. I'd love if someone else became inspired by this to improve it though! I've never written tools to deal with languages and ASTs, and it probably shows. On the upside, there's not a ton of code outside of the ported Wrenalyzer! 6 | 7 | ## Features 8 | 9 | - Parses the current file and all imports in that file into ASTs through a TypeScript port of [Wrenalyzer](https://github.com/munificent/wrenalyzer). 10 | - Provides autocompletion for class names, static methods, class methods, static fields, fields, and some variables on a per-file basis. 11 | - Basic autocomplete filtering based on whether static/instance methods, fields, class names are appropriate. 12 | - Provides function signature completion based on function name in current file and all imports. 13 | - Probably doesn't do all that great of a job. 14 | 15 | ## Screenshots 16 | 17 | ![Autocompleting members](images/1.png) 18 | ![Autocompleting members](images/2.png) 19 | ![Function signature completion](images/3.png) 20 | ![Function signature completion](images/4.png) 21 | 22 | ## Requirements 23 | 24 | This extension doesn't provide any syntax formatting, so grab one of the other Wren extensions available on the Extension Marketplace. 25 | 26 | ## Extension Settings 27 | 28 | This extension contributes the following settings: 29 | 30 | * `wren.additionalModuleDirectories`: an array of relative paths to scan in addition to the script directory. -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sponge/wren-language-provider/9f9fb71f1eee659cd9aab6beae1986f9801a37ab/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sponge/wren-language-provider/9f9fb71f1eee659cd9aab6beae1986f9801a37ab/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sponge/wren-language-provider/9f9fb71f1eee659cd9aab6beae1986f9801a37ab/images/3.png -------------------------------------------------------------------------------- /images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sponge/wren-language-provider/9f9fb71f1eee659cd9aab6beae1986f9801a37ab/images/4.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wren-language-provider", 3 | "version": "0.0.5", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@types/bluebird": { 7 | "version": "3.5.23", 8 | "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.23.tgz", 9 | "integrity": "sha512-xlehmc6RT+wMEhy9ZqeqmozVmuFzTfsaV2NlfFFWhigy7n6sjMbUUB+SZBWK78lZgWHA4DBAdQvQxUvcB8N1tw==", 10 | "dev": true 11 | }, 12 | "@types/mocha": { 13 | "version": "2.2.48", 14 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", 15 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", 16 | "dev": true 17 | }, 18 | "@types/node": { 19 | "version": "8.10.26", 20 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.26.tgz", 21 | "integrity": "sha512-opk6bLLErLSwyVVJeSH5Ek7ZWOBSsN0JrvXTNVGLXLAXKB9xlTYajrplR44xVyMrmbut94H6uJ9jqzM/12jxkA==", 22 | "dev": true 23 | }, 24 | "ajv": { 25 | "version": "5.5.2", 26 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 27 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 28 | "dev": true 29 | }, 30 | "ansi-cyan": { 31 | "version": "0.1.1", 32 | "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", 33 | "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", 34 | "dev": true 35 | }, 36 | "ansi-red": { 37 | "version": "0.1.1", 38 | "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", 39 | "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", 40 | "dev": true 41 | }, 42 | "ansi-regex": { 43 | "version": "2.1.1", 44 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 45 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 46 | "dev": true 47 | }, 48 | "ansi-styles": { 49 | "version": "2.2.1", 50 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 51 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 52 | "dev": true 53 | }, 54 | "ansi-wrap": { 55 | "version": "0.1.0", 56 | "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", 57 | "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", 58 | "dev": true 59 | }, 60 | "argparse": { 61 | "version": "1.0.10", 62 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 63 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 64 | "dev": true 65 | }, 66 | "arr-diff": { 67 | "version": "1.1.0", 68 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", 69 | "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", 70 | "dev": true 71 | }, 72 | "arr-flatten": { 73 | "version": "1.1.0", 74 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 75 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 76 | "dev": true 77 | }, 78 | "arr-union": { 79 | "version": "2.1.0", 80 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", 81 | "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", 82 | "dev": true 83 | }, 84 | "array-differ": { 85 | "version": "1.0.0", 86 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", 87 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", 88 | "dev": true 89 | }, 90 | "array-slice": { 91 | "version": "0.2.3", 92 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", 93 | "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", 94 | "dev": true 95 | }, 96 | "array-union": { 97 | "version": "1.0.2", 98 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 99 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 100 | "dev": true 101 | }, 102 | "array-uniq": { 103 | "version": "1.0.3", 104 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 105 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 106 | "dev": true 107 | }, 108 | "array-unique": { 109 | "version": "0.2.1", 110 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 111 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 112 | "dev": true 113 | }, 114 | "arrify": { 115 | "version": "1.0.1", 116 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 117 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 118 | "dev": true 119 | }, 120 | "asn1": { 121 | "version": "0.2.4", 122 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 123 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 124 | "dev": true 125 | }, 126 | "assert-plus": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 129 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 130 | "dev": true 131 | }, 132 | "asynckit": { 133 | "version": "0.4.0", 134 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 135 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 136 | "dev": true 137 | }, 138 | "aws-sign2": { 139 | "version": "0.7.0", 140 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 141 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 142 | "dev": true 143 | }, 144 | "aws4": { 145 | "version": "1.8.0", 146 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 147 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 148 | "dev": true 149 | }, 150 | "babel-code-frame": { 151 | "version": "6.26.0", 152 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 153 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 154 | "dev": true, 155 | "dependencies": { 156 | "chalk": { 157 | "version": "1.1.3", 158 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 159 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 160 | "dev": true 161 | } 162 | } 163 | }, 164 | "balanced-match": { 165 | "version": "1.0.0", 166 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 167 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 168 | "dev": true 169 | }, 170 | "bcrypt-pbkdf": { 171 | "version": "1.0.2", 172 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 173 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 174 | "dev": true, 175 | "optional": true 176 | }, 177 | "block-stream": { 178 | "version": "0.0.9", 179 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 180 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 181 | "dev": true 182 | }, 183 | "bluebird": { 184 | "version": "3.5.1", 185 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 186 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", 187 | "dev": true 188 | }, 189 | "brace-expansion": { 190 | "version": "1.1.11", 191 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 192 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 193 | "dev": true 194 | }, 195 | "braces": { 196 | "version": "1.8.5", 197 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 198 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 199 | "dev": true 200 | }, 201 | "browser-stdout": { 202 | "version": "1.3.0", 203 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 204 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 205 | "dev": true 206 | }, 207 | "buffer-crc32": { 208 | "version": "0.2.13", 209 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 210 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 211 | "dev": true 212 | }, 213 | "buffer-from": { 214 | "version": "1.1.1", 215 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 216 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 217 | "dev": true 218 | }, 219 | "builtin-modules": { 220 | "version": "1.1.1", 221 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 222 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 223 | "dev": true 224 | }, 225 | "caseless": { 226 | "version": "0.12.0", 227 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 228 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 229 | "dev": true 230 | }, 231 | "chalk": { 232 | "version": "2.4.1", 233 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 234 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 235 | "dev": true, 236 | "dependencies": { 237 | "ansi-styles": { 238 | "version": "3.2.1", 239 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 240 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 241 | "dev": true 242 | }, 243 | "supports-color": { 244 | "version": "5.4.0", 245 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 246 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 247 | "dev": true 248 | } 249 | } 250 | }, 251 | "clone": { 252 | "version": "0.2.0", 253 | "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", 254 | "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", 255 | "dev": true 256 | }, 257 | "clone-buffer": { 258 | "version": "1.0.0", 259 | "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", 260 | "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", 261 | "dev": true 262 | }, 263 | "clone-stats": { 264 | "version": "0.0.1", 265 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", 266 | "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", 267 | "dev": true 268 | }, 269 | "cloneable-readable": { 270 | "version": "1.1.2", 271 | "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", 272 | "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", 273 | "dev": true 274 | }, 275 | "co": { 276 | "version": "4.6.0", 277 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 278 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 279 | "dev": true 280 | }, 281 | "color-convert": { 282 | "version": "1.9.2", 283 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", 284 | "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", 285 | "dev": true 286 | }, 287 | "color-name": { 288 | "version": "1.1.1", 289 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", 290 | "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", 291 | "dev": true 292 | }, 293 | "combined-stream": { 294 | "version": "1.0.6", 295 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 296 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 297 | "dev": true 298 | }, 299 | "commander": { 300 | "version": "2.17.1", 301 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 302 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 303 | "dev": true 304 | }, 305 | "concat-map": { 306 | "version": "0.0.1", 307 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 308 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 309 | "dev": true 310 | }, 311 | "convert-source-map": { 312 | "version": "1.5.0", 313 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", 314 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", 315 | "dev": true 316 | }, 317 | "core-util-is": { 318 | "version": "1.0.2", 319 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 320 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 321 | "dev": true 322 | }, 323 | "dashdash": { 324 | "version": "1.14.1", 325 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 326 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 327 | "dev": true 328 | }, 329 | "debug": { 330 | "version": "3.1.0", 331 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 332 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 333 | "dev": true 334 | }, 335 | "deep-assign": { 336 | "version": "1.0.0", 337 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", 338 | "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", 339 | "dev": true 340 | }, 341 | "delayed-stream": { 342 | "version": "1.0.0", 343 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 344 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 345 | "dev": true 346 | }, 347 | "diff": { 348 | "version": "3.5.0", 349 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 350 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 351 | "dev": true 352 | }, 353 | "duplexer": { 354 | "version": "0.1.1", 355 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 356 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 357 | "dev": true 358 | }, 359 | "duplexify": { 360 | "version": "3.6.0", 361 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", 362 | "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", 363 | "dev": true 364 | }, 365 | "ecc-jsbn": { 366 | "version": "0.1.2", 367 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 368 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 369 | "dev": true, 370 | "optional": true 371 | }, 372 | "end-of-stream": { 373 | "version": "1.4.1", 374 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 375 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 376 | "dev": true 377 | }, 378 | "escape-string-regexp": { 379 | "version": "1.0.5", 380 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 381 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 382 | "dev": true 383 | }, 384 | "esprima": { 385 | "version": "4.0.1", 386 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 387 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 388 | "dev": true 389 | }, 390 | "esutils": { 391 | "version": "2.0.2", 392 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 393 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 394 | "dev": true 395 | }, 396 | "event-stream": { 397 | "version": "3.3.4", 398 | "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 399 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 400 | "dev": true 401 | }, 402 | "expand-brackets": { 403 | "version": "0.1.5", 404 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 405 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 406 | "dev": true 407 | }, 408 | "expand-range": { 409 | "version": "1.8.2", 410 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 411 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 412 | "dev": true 413 | }, 414 | "extend": { 415 | "version": "3.0.2", 416 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 417 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 418 | "dev": true 419 | }, 420 | "extend-shallow": { 421 | "version": "1.1.4", 422 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", 423 | "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", 424 | "dev": true 425 | }, 426 | "extglob": { 427 | "version": "0.3.2", 428 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 429 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 430 | "dev": true, 431 | "dependencies": { 432 | "is-extglob": { 433 | "version": "1.0.0", 434 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 435 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 436 | "dev": true 437 | } 438 | } 439 | }, 440 | "extsprintf": { 441 | "version": "1.3.0", 442 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 443 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 444 | "dev": true 445 | }, 446 | "fast-deep-equal": { 447 | "version": "1.1.0", 448 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 449 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 450 | "dev": true 451 | }, 452 | "fast-json-stable-stringify": { 453 | "version": "2.0.0", 454 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 455 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 456 | "dev": true 457 | }, 458 | "fd-slicer": { 459 | "version": "1.1.0", 460 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 461 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 462 | "dev": true 463 | }, 464 | "filename-regex": { 465 | "version": "2.0.1", 466 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 467 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 468 | "dev": true 469 | }, 470 | "fill-range": { 471 | "version": "2.2.4", 472 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 473 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 474 | "dev": true 475 | }, 476 | "first-chunk-stream": { 477 | "version": "1.0.0", 478 | "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", 479 | "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", 480 | "dev": true 481 | }, 482 | "for-in": { 483 | "version": "1.0.2", 484 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 485 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 486 | "dev": true 487 | }, 488 | "for-own": { 489 | "version": "0.1.5", 490 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 491 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 492 | "dev": true 493 | }, 494 | "forever-agent": { 495 | "version": "0.6.1", 496 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 497 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 498 | "dev": true 499 | }, 500 | "form-data": { 501 | "version": "2.3.2", 502 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 503 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 504 | "dev": true 505 | }, 506 | "from": { 507 | "version": "0.1.7", 508 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 509 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", 510 | "dev": true 511 | }, 512 | "fs.realpath": { 513 | "version": "1.0.0", 514 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 515 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 516 | "dev": true 517 | }, 518 | "fstream": { 519 | "version": "1.0.11", 520 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 521 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 522 | "dev": true 523 | }, 524 | "getpass": { 525 | "version": "0.1.7", 526 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 527 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 528 | "dev": true 529 | }, 530 | "glob": { 531 | "version": "7.1.2", 532 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 533 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 534 | "dev": true 535 | }, 536 | "glob-base": { 537 | "version": "0.3.0", 538 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 539 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 540 | "dev": true, 541 | "dependencies": { 542 | "glob-parent": { 543 | "version": "2.0.0", 544 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 545 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 546 | "dev": true 547 | }, 548 | "is-extglob": { 549 | "version": "1.0.0", 550 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 551 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 552 | "dev": true 553 | }, 554 | "is-glob": { 555 | "version": "2.0.1", 556 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 557 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 558 | "dev": true 559 | } 560 | } 561 | }, 562 | "glob-parent": { 563 | "version": "3.1.0", 564 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 565 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 566 | "dev": true 567 | }, 568 | "glob-stream": { 569 | "version": "5.3.5", 570 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", 571 | "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", 572 | "dev": true, 573 | "dependencies": { 574 | "glob": { 575 | "version": "5.0.15", 576 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 577 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 578 | "dev": true 579 | }, 580 | "isarray": { 581 | "version": "0.0.1", 582 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 583 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 584 | "dev": true 585 | }, 586 | "readable-stream": { 587 | "version": "1.0.34", 588 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 589 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 590 | "dev": true 591 | }, 592 | "string_decoder": { 593 | "version": "0.10.31", 594 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 595 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 596 | "dev": true 597 | }, 598 | "through2": { 599 | "version": "0.6.5", 600 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 601 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 602 | "dev": true 603 | } 604 | } 605 | }, 606 | "graceful-fs": { 607 | "version": "4.1.11", 608 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 609 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 610 | "dev": true 611 | }, 612 | "growl": { 613 | "version": "1.10.3", 614 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 615 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 616 | "dev": true 617 | }, 618 | "gulp-chmod": { 619 | "version": "2.0.0", 620 | "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", 621 | "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", 622 | "dev": true 623 | }, 624 | "gulp-filter": { 625 | "version": "5.1.0", 626 | "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", 627 | "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", 628 | "dev": true 629 | }, 630 | "gulp-gunzip": { 631 | "version": "1.0.0", 632 | "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", 633 | "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", 634 | "dev": true, 635 | "dependencies": { 636 | "isarray": { 637 | "version": "0.0.1", 638 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 639 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 640 | "dev": true 641 | }, 642 | "readable-stream": { 643 | "version": "1.0.34", 644 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 645 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 646 | "dev": true 647 | }, 648 | "string_decoder": { 649 | "version": "0.10.31", 650 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 651 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 652 | "dev": true 653 | }, 654 | "through2": { 655 | "version": "0.6.5", 656 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 657 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 658 | "dev": true 659 | } 660 | } 661 | }, 662 | "gulp-remote-src-vscode": { 663 | "version": "0.5.0", 664 | "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", 665 | "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", 666 | "dev": true, 667 | "dependencies": { 668 | "clone": { 669 | "version": "2.1.2", 670 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 671 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 672 | "dev": true 673 | }, 674 | "clone-stats": { 675 | "version": "1.0.0", 676 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 677 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 678 | "dev": true 679 | }, 680 | "vinyl": { 681 | "version": "2.2.0", 682 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 683 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 684 | "dev": true 685 | } 686 | } 687 | }, 688 | "gulp-sourcemaps": { 689 | "version": "1.6.0", 690 | "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", 691 | "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", 692 | "dev": true, 693 | "dependencies": { 694 | "clone": { 695 | "version": "1.0.4", 696 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 697 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 698 | "dev": true 699 | }, 700 | "replace-ext": { 701 | "version": "0.0.1", 702 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 703 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 704 | "dev": true 705 | }, 706 | "vinyl": { 707 | "version": "1.2.0", 708 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 709 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 710 | "dev": true 711 | } 712 | } 713 | }, 714 | "gulp-symdest": { 715 | "version": "1.1.0", 716 | "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", 717 | "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", 718 | "dev": true 719 | }, 720 | "gulp-untar": { 721 | "version": "0.0.7", 722 | "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", 723 | "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", 724 | "dev": true, 725 | "dependencies": { 726 | "clone": { 727 | "version": "1.0.4", 728 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 729 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 730 | "dev": true 731 | }, 732 | "replace-ext": { 733 | "version": "0.0.1", 734 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 735 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 736 | "dev": true 737 | }, 738 | "vinyl": { 739 | "version": "1.2.0", 740 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 741 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 742 | "dev": true 743 | } 744 | } 745 | }, 746 | "gulp-vinyl-zip": { 747 | "version": "2.1.0", 748 | "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", 749 | "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", 750 | "dev": true, 751 | "dependencies": { 752 | "clone": { 753 | "version": "2.1.2", 754 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 755 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 756 | "dev": true 757 | }, 758 | "clone-stats": { 759 | "version": "1.0.0", 760 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 761 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 762 | "dev": true 763 | }, 764 | "queue": { 765 | "version": "4.4.2", 766 | "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", 767 | "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", 768 | "dev": true 769 | }, 770 | "vinyl": { 771 | "version": "2.2.0", 772 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 773 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 774 | "dev": true 775 | } 776 | } 777 | }, 778 | "har-schema": { 779 | "version": "2.0.0", 780 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 781 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 782 | "dev": true 783 | }, 784 | "har-validator": { 785 | "version": "5.1.0", 786 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 787 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 788 | "dev": true 789 | }, 790 | "has-ansi": { 791 | "version": "2.0.0", 792 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 793 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 794 | "dev": true 795 | }, 796 | "has-flag": { 797 | "version": "3.0.0", 798 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 799 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 800 | "dev": true 801 | }, 802 | "he": { 803 | "version": "1.1.1", 804 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 805 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 806 | "dev": true 807 | }, 808 | "http-signature": { 809 | "version": "1.2.0", 810 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 811 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 812 | "dev": true 813 | }, 814 | "inflight": { 815 | "version": "1.0.6", 816 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 817 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 818 | "dev": true 819 | }, 820 | "inherits": { 821 | "version": "2.0.3", 822 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 823 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 824 | "dev": true 825 | }, 826 | "is": { 827 | "version": "3.2.1", 828 | "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", 829 | "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", 830 | "dev": true 831 | }, 832 | "is-buffer": { 833 | "version": "1.1.6", 834 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 835 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 836 | "dev": true 837 | }, 838 | "is-dotfile": { 839 | "version": "1.0.3", 840 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 841 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 842 | "dev": true 843 | }, 844 | "is-equal-shallow": { 845 | "version": "0.1.3", 846 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 847 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 848 | "dev": true 849 | }, 850 | "is-extendable": { 851 | "version": "0.1.1", 852 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 853 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 854 | "dev": true 855 | }, 856 | "is-extglob": { 857 | "version": "2.1.1", 858 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 859 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 860 | "dev": true 861 | }, 862 | "is-glob": { 863 | "version": "3.1.0", 864 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 865 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 866 | "dev": true 867 | }, 868 | "is-number": { 869 | "version": "2.1.0", 870 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 871 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 872 | "dev": true, 873 | "dependencies": { 874 | "kind-of": { 875 | "version": "3.2.2", 876 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 877 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 878 | "dev": true 879 | } 880 | } 881 | }, 882 | "is-obj": { 883 | "version": "1.0.1", 884 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 885 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 886 | "dev": true 887 | }, 888 | "is-posix-bracket": { 889 | "version": "0.1.1", 890 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 891 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 892 | "dev": true 893 | }, 894 | "is-primitive": { 895 | "version": "2.0.0", 896 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 897 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 898 | "dev": true 899 | }, 900 | "is-stream": { 901 | "version": "1.1.0", 902 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 903 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 904 | "dev": true 905 | }, 906 | "is-typedarray": { 907 | "version": "1.0.0", 908 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 909 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 910 | "dev": true 911 | }, 912 | "is-utf8": { 913 | "version": "0.2.1", 914 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 915 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 916 | "dev": true 917 | }, 918 | "is-valid-glob": { 919 | "version": "0.3.0", 920 | "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", 921 | "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", 922 | "dev": true 923 | }, 924 | "isarray": { 925 | "version": "1.0.0", 926 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 927 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 928 | "dev": true 929 | }, 930 | "isobject": { 931 | "version": "2.1.0", 932 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 933 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 934 | "dev": true 935 | }, 936 | "isstream": { 937 | "version": "0.1.2", 938 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 939 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 940 | "dev": true 941 | }, 942 | "js-tokens": { 943 | "version": "3.0.2", 944 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 945 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 946 | "dev": true 947 | }, 948 | "js-yaml": { 949 | "version": "3.12.0", 950 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 951 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 952 | "dev": true 953 | }, 954 | "jsbn": { 955 | "version": "0.1.1", 956 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 957 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 958 | "dev": true, 959 | "optional": true 960 | }, 961 | "json-schema": { 962 | "version": "0.2.3", 963 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 964 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 965 | "dev": true 966 | }, 967 | "json-schema-traverse": { 968 | "version": "0.3.1", 969 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 970 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 971 | "dev": true 972 | }, 973 | "json-stable-stringify": { 974 | "version": "1.0.1", 975 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 976 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 977 | "dev": true 978 | }, 979 | "json-stringify-safe": { 980 | "version": "5.0.1", 981 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 982 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 983 | "dev": true 984 | }, 985 | "jsonify": { 986 | "version": "0.0.0", 987 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 988 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 989 | "dev": true 990 | }, 991 | "jsprim": { 992 | "version": "1.4.1", 993 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 994 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 995 | "dev": true 996 | }, 997 | "kind-of": { 998 | "version": "1.1.0", 999 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", 1000 | "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", 1001 | "dev": true 1002 | }, 1003 | "lazystream": { 1004 | "version": "1.0.0", 1005 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 1006 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 1007 | "dev": true 1008 | }, 1009 | "lodash.isequal": { 1010 | "version": "4.5.0", 1011 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1012 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", 1013 | "dev": true 1014 | }, 1015 | "map-stream": { 1016 | "version": "0.1.0", 1017 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 1018 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", 1019 | "dev": true 1020 | }, 1021 | "math-random": { 1022 | "version": "1.0.1", 1023 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 1024 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", 1025 | "dev": true 1026 | }, 1027 | "merge-stream": { 1028 | "version": "1.0.1", 1029 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", 1030 | "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", 1031 | "dev": true 1032 | }, 1033 | "micromatch": { 1034 | "version": "2.3.11", 1035 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1036 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1037 | "dev": true, 1038 | "dependencies": { 1039 | "arr-diff": { 1040 | "version": "2.0.0", 1041 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 1042 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 1043 | "dev": true 1044 | }, 1045 | "is-extglob": { 1046 | "version": "1.0.0", 1047 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1048 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1049 | "dev": true 1050 | }, 1051 | "is-glob": { 1052 | "version": "2.0.1", 1053 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1054 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1055 | "dev": true 1056 | }, 1057 | "kind-of": { 1058 | "version": "3.2.2", 1059 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1060 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1061 | "dev": true 1062 | } 1063 | } 1064 | }, 1065 | "mime-db": { 1066 | "version": "1.35.0", 1067 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", 1068 | "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", 1069 | "dev": true 1070 | }, 1071 | "mime-types": { 1072 | "version": "2.1.19", 1073 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", 1074 | "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", 1075 | "dev": true 1076 | }, 1077 | "minimatch": { 1078 | "version": "3.0.4", 1079 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1080 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1081 | "dev": true 1082 | }, 1083 | "minimist": { 1084 | "version": "0.0.8", 1085 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1086 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1087 | "dev": true 1088 | }, 1089 | "mkdirp": { 1090 | "version": "0.5.1", 1091 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1092 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1093 | "dev": true 1094 | }, 1095 | "mocha": { 1096 | "version": "4.1.0", 1097 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", 1098 | "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", 1099 | "dev": true, 1100 | "dependencies": { 1101 | "commander": { 1102 | "version": "2.11.0", 1103 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 1104 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 1105 | "dev": true 1106 | }, 1107 | "diff": { 1108 | "version": "3.3.1", 1109 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 1110 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 1111 | "dev": true 1112 | }, 1113 | "has-flag": { 1114 | "version": "2.0.0", 1115 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1116 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1117 | "dev": true 1118 | }, 1119 | "supports-color": { 1120 | "version": "4.4.0", 1121 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1122 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1123 | "dev": true 1124 | } 1125 | } 1126 | }, 1127 | "ms": { 1128 | "version": "2.0.0", 1129 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1130 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1131 | "dev": true 1132 | }, 1133 | "multimatch": { 1134 | "version": "2.1.0", 1135 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", 1136 | "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", 1137 | "dev": true 1138 | }, 1139 | "node.extend": { 1140 | "version": "1.1.6", 1141 | "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", 1142 | "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", 1143 | "dev": true 1144 | }, 1145 | "normalize-path": { 1146 | "version": "2.1.1", 1147 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1148 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1149 | "dev": true 1150 | }, 1151 | "oauth-sign": { 1152 | "version": "0.9.0", 1153 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1154 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1155 | "dev": true 1156 | }, 1157 | "object-assign": { 1158 | "version": "4.1.1", 1159 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1160 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1161 | "dev": true 1162 | }, 1163 | "object.omit": { 1164 | "version": "2.0.1", 1165 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1166 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1167 | "dev": true 1168 | }, 1169 | "once": { 1170 | "version": "1.4.0", 1171 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1172 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1173 | "dev": true 1174 | }, 1175 | "ordered-read-streams": { 1176 | "version": "0.3.0", 1177 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", 1178 | "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", 1179 | "dev": true 1180 | }, 1181 | "parse-glob": { 1182 | "version": "3.0.4", 1183 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1184 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1185 | "dev": true, 1186 | "dependencies": { 1187 | "is-extglob": { 1188 | "version": "1.0.0", 1189 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1190 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1191 | "dev": true 1192 | }, 1193 | "is-glob": { 1194 | "version": "2.0.1", 1195 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1196 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1197 | "dev": true 1198 | } 1199 | } 1200 | }, 1201 | "path-dirname": { 1202 | "version": "1.0.2", 1203 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1204 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", 1205 | "dev": true 1206 | }, 1207 | "path-is-absolute": { 1208 | "version": "1.0.1", 1209 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1210 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1211 | "dev": true 1212 | }, 1213 | "path-parse": { 1214 | "version": "1.0.6", 1215 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1216 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1217 | "dev": true 1218 | }, 1219 | "pause-stream": { 1220 | "version": "0.0.11", 1221 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 1222 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 1223 | "dev": true 1224 | }, 1225 | "pend": { 1226 | "version": "1.2.0", 1227 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1228 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1229 | "dev": true 1230 | }, 1231 | "performance-now": { 1232 | "version": "2.1.0", 1233 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1234 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1235 | "dev": true 1236 | }, 1237 | "plugin-error": { 1238 | "version": "0.1.2", 1239 | "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", 1240 | "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", 1241 | "dev": true 1242 | }, 1243 | "preserve": { 1244 | "version": "0.2.0", 1245 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1246 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1247 | "dev": true 1248 | }, 1249 | "process-nextick-args": { 1250 | "version": "2.0.0", 1251 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1252 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1253 | "dev": true 1254 | }, 1255 | "psl": { 1256 | "version": "1.1.29", 1257 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 1258 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", 1259 | "dev": true 1260 | }, 1261 | "punycode": { 1262 | "version": "1.4.1", 1263 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1264 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1265 | "dev": true 1266 | }, 1267 | "qs": { 1268 | "version": "6.5.2", 1269 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1270 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1271 | "dev": true 1272 | }, 1273 | "querystringify": { 1274 | "version": "2.0.0", 1275 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", 1276 | "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", 1277 | "dev": true 1278 | }, 1279 | "queue": { 1280 | "version": "3.1.0", 1281 | "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", 1282 | "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", 1283 | "dev": true 1284 | }, 1285 | "randomatic": { 1286 | "version": "3.1.0", 1287 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", 1288 | "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", 1289 | "dev": true, 1290 | "dependencies": { 1291 | "is-number": { 1292 | "version": "4.0.0", 1293 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 1294 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 1295 | "dev": true 1296 | }, 1297 | "kind-of": { 1298 | "version": "6.0.2", 1299 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1300 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 1301 | "dev": true 1302 | } 1303 | } 1304 | }, 1305 | "readable-stream": { 1306 | "version": "2.3.6", 1307 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1308 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1309 | "dev": true 1310 | }, 1311 | "regex-cache": { 1312 | "version": "0.4.3", 1313 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", 1314 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", 1315 | "dev": true 1316 | }, 1317 | "remove-trailing-separator": { 1318 | "version": "1.1.0", 1319 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1320 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1321 | "dev": true 1322 | }, 1323 | "repeat-element": { 1324 | "version": "1.1.2", 1325 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1326 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 1327 | "dev": true 1328 | }, 1329 | "repeat-string": { 1330 | "version": "1.6.1", 1331 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1332 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1333 | "dev": true 1334 | }, 1335 | "replace-ext": { 1336 | "version": "1.0.0", 1337 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", 1338 | "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", 1339 | "dev": true 1340 | }, 1341 | "request": { 1342 | "version": "2.88.0", 1343 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1344 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1345 | "dev": true 1346 | }, 1347 | "requires-port": { 1348 | "version": "1.0.0", 1349 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1350 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 1351 | "dev": true 1352 | }, 1353 | "resolve": { 1354 | "version": "1.8.1", 1355 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 1356 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 1357 | "dev": true 1358 | }, 1359 | "rimraf": { 1360 | "version": "2.6.2", 1361 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1362 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1363 | "dev": true 1364 | }, 1365 | "safe-buffer": { 1366 | "version": "5.1.2", 1367 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1368 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1369 | "dev": true 1370 | }, 1371 | "safer-buffer": { 1372 | "version": "2.1.2", 1373 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1374 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1375 | "dev": true 1376 | }, 1377 | "semver": { 1378 | "version": "5.5.0", 1379 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1380 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1381 | "dev": true 1382 | }, 1383 | "source-map": { 1384 | "version": "0.6.1", 1385 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1386 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1387 | "dev": true 1388 | }, 1389 | "source-map-support": { 1390 | "version": "0.5.8", 1391 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", 1392 | "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", 1393 | "dev": true 1394 | }, 1395 | "split": { 1396 | "version": "0.3.3", 1397 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 1398 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 1399 | "dev": true 1400 | }, 1401 | "sprintf-js": { 1402 | "version": "1.0.3", 1403 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1404 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1405 | "dev": true 1406 | }, 1407 | "sshpk": { 1408 | "version": "1.14.2", 1409 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 1410 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 1411 | "dev": true 1412 | }, 1413 | "stat-mode": { 1414 | "version": "0.2.2", 1415 | "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", 1416 | "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", 1417 | "dev": true 1418 | }, 1419 | "stream-combiner": { 1420 | "version": "0.0.4", 1421 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 1422 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 1423 | "dev": true 1424 | }, 1425 | "stream-shift": { 1426 | "version": "1.0.0", 1427 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 1428 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", 1429 | "dev": true 1430 | }, 1431 | "streamfilter": { 1432 | "version": "1.0.7", 1433 | "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", 1434 | "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", 1435 | "dev": true 1436 | }, 1437 | "streamifier": { 1438 | "version": "0.1.1", 1439 | "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", 1440 | "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", 1441 | "dev": true 1442 | }, 1443 | "string_decoder": { 1444 | "version": "1.1.1", 1445 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1446 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1447 | "dev": true 1448 | }, 1449 | "strip-ansi": { 1450 | "version": "3.0.1", 1451 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1452 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1453 | "dev": true 1454 | }, 1455 | "strip-bom": { 1456 | "version": "2.0.0", 1457 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1458 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1459 | "dev": true 1460 | }, 1461 | "strip-bom-stream": { 1462 | "version": "1.0.0", 1463 | "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", 1464 | "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", 1465 | "dev": true 1466 | }, 1467 | "supports-color": { 1468 | "version": "2.0.0", 1469 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1470 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1471 | "dev": true 1472 | }, 1473 | "tar": { 1474 | "version": "2.2.1", 1475 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 1476 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 1477 | "dev": true 1478 | }, 1479 | "through": { 1480 | "version": "2.3.8", 1481 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1482 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1483 | "dev": true 1484 | }, 1485 | "through2": { 1486 | "version": "2.0.3", 1487 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 1488 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 1489 | "dev": true 1490 | }, 1491 | "through2-filter": { 1492 | "version": "2.0.0", 1493 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", 1494 | "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", 1495 | "dev": true 1496 | }, 1497 | "to-absolute-glob": { 1498 | "version": "0.1.1", 1499 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", 1500 | "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", 1501 | "dev": true, 1502 | "dependencies": { 1503 | "extend-shallow": { 1504 | "version": "2.0.1", 1505 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1506 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1507 | "dev": true 1508 | } 1509 | } 1510 | }, 1511 | "tough-cookie": { 1512 | "version": "2.4.3", 1513 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1514 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1515 | "dev": true 1516 | }, 1517 | "tslib": { 1518 | "version": "1.9.3", 1519 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1520 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1521 | "dev": true 1522 | }, 1523 | "tslint": { 1524 | "version": "5.11.0", 1525 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", 1526 | "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", 1527 | "dev": true 1528 | }, 1529 | "tsutils": { 1530 | "version": "2.29.0", 1531 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1532 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1533 | "dev": true 1534 | }, 1535 | "tunnel-agent": { 1536 | "version": "0.6.0", 1537 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1538 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1539 | "dev": true 1540 | }, 1541 | "tweetnacl": { 1542 | "version": "0.14.5", 1543 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1544 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1545 | "dev": true, 1546 | "optional": true 1547 | }, 1548 | "typescript": { 1549 | "version": "2.9.2", 1550 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", 1551 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", 1552 | "dev": true 1553 | }, 1554 | "unique-stream": { 1555 | "version": "2.2.1", 1556 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", 1557 | "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", 1558 | "dev": true 1559 | }, 1560 | "url-parse": { 1561 | "version": "1.4.3", 1562 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", 1563 | "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", 1564 | "dev": true 1565 | }, 1566 | "util-deprecate": { 1567 | "version": "1.0.2", 1568 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1569 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1570 | "dev": true 1571 | }, 1572 | "uuid": { 1573 | "version": "3.3.2", 1574 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1575 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1576 | "dev": true 1577 | }, 1578 | "vali-date": { 1579 | "version": "1.0.0", 1580 | "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", 1581 | "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", 1582 | "dev": true 1583 | }, 1584 | "verror": { 1585 | "version": "1.10.0", 1586 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1587 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1588 | "dev": true 1589 | }, 1590 | "vinyl": { 1591 | "version": "0.4.6", 1592 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", 1593 | "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", 1594 | "dev": true 1595 | }, 1596 | "vinyl-fs": { 1597 | "version": "2.4.4", 1598 | "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", 1599 | "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", 1600 | "dev": true, 1601 | "dependencies": { 1602 | "clone": { 1603 | "version": "1.0.4", 1604 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 1605 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 1606 | "dev": true 1607 | }, 1608 | "replace-ext": { 1609 | "version": "0.0.1", 1610 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 1611 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 1612 | "dev": true 1613 | }, 1614 | "vinyl": { 1615 | "version": "1.2.0", 1616 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 1617 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 1618 | "dev": true 1619 | } 1620 | } 1621 | }, 1622 | "vinyl-source-stream": { 1623 | "version": "1.1.2", 1624 | "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", 1625 | "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", 1626 | "dev": true 1627 | }, 1628 | "vscode": { 1629 | "version": "1.1.21", 1630 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.21.tgz", 1631 | "integrity": "sha512-tJl9eL15ZMm6vzCYYeQ26sSYRuXGMGPsaeIAmG2rOOYRn01jdaDg6I4b9G5Ed6FISdmn6egpKThk4o4om8Ax/A==", 1632 | "dev": true 1633 | }, 1634 | "wrappy": { 1635 | "version": "1.0.2", 1636 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1637 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1638 | "dev": true 1639 | }, 1640 | "xtend": { 1641 | "version": "4.0.1", 1642 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1643 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 1644 | "dev": true 1645 | }, 1646 | "yauzl": { 1647 | "version": "2.10.0", 1648 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1649 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1650 | "dev": true 1651 | }, 1652 | "yazl": { 1653 | "version": "2.4.3", 1654 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", 1655 | "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", 1656 | "dev": true 1657 | } 1658 | } 1659 | } 1660 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wren-language-provider", 3 | "displayName": "Wren Language Provider", 4 | "description": "", 5 | "version": "0.0.5", 6 | "publisher": "sponge", 7 | "engines": { 8 | "vscode": "^1.26.0" 9 | }, 10 | "categories": [ 11 | "Other" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/sponge/wren-language-provider" 16 | }, 17 | "homepage": "https://github.com/sponge/wren-language-provider", 18 | "languages": [ 19 | { 20 | "id": "wren" 21 | } 22 | ], 23 | "activationEvents": [ 24 | "onLanguage:wren" 25 | ], 26 | "capabilities": { 27 | "signatureHelpProvider": { 28 | "triggerCharacters": [ 29 | "(" 30 | ] 31 | }, 32 | "completionProvider": { 33 | "resolveProvider": "true", 34 | "triggerCharacters": [ 35 | "." 36 | ] 37 | } 38 | }, 39 | "main": "./out/extension", 40 | "contributes": { 41 | "configuration": [ 42 | { 43 | "type": "object", 44 | "title": "Wren Configuration", 45 | "properties": { 46 | "wren.additionalModuleDirectories": { 47 | "type": "array", 48 | "default": "", 49 | "description": "Additional directory to scan for .wren files" 50 | } 51 | } 52 | } 53 | ] 54 | }, 55 | "scripts": { 56 | "vscode:prepublish": "npm run compile", 57 | "compile": "tsc -p ./", 58 | "watch": "tsc -watch -p ./", 59 | "postinstall": "node ./node_modules/vscode/bin/install", 60 | "test": "npm run compile && node ./node_modules/vscode/bin/test" 61 | }, 62 | "devDependencies": { 63 | "@types/bluebird": "^3.5.23", 64 | "@types/mocha": "^2.2.42", 65 | "@types/node": "^8.10.25", 66 | "bluebird": "^3.5.1", 67 | "tslint": "^5.8.0", 68 | "typescript": "^2.6.1", 69 | "vscode": "^1.1.21" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/corewren.ts: -------------------------------------------------------------------------------- 1 | // this is just a fake class definition typed out from the docs so we can use core modules 2 | const coreModules = ` 3 | class Class { 4 | name {} 5 | supertype {} 6 | } 7 | 8 | class Fiber { 9 | static abort(message) {} 10 | static current {} 11 | construct new(function) {} 12 | static suspend() {} 13 | static yield() {} 14 | static yield(value) {} 15 | 16 | call() {} 17 | call(value) {} 18 | error {} 19 | isDone {} 20 | try() {} 21 | transfer() {} 22 | transfer(value) {} 23 | transferError(error) {} 24 | } 25 | 26 | class Fn { 27 | construct new(function) {} 28 | 29 | arity {} 30 | call(args) {} 31 | } 32 | 33 | class List is Sequence { 34 | static filled(size, element) {} 35 | construct new() {} 36 | 37 | add(item) {} 38 | clear() {} 39 | count {} 40 | insert(index, item) {} 41 | removeAt(index) {} 42 | } 43 | 44 | class Map is Sequence { 45 | construct new() {} 46 | clear() {} 47 | containsKey(key) {} 48 | count {} 49 | keys {} 50 | remove(key) {} 51 | values {} 52 | } 53 | 54 | class Num { 55 | static fromString(value) {} 56 | static pi {} 57 | static largest {} 58 | static smallest {} 59 | 60 | abs {} 61 | acos {} 62 | asin {} 63 | atan {} 64 | atan(x) {} 65 | ceil {} 66 | cos {} 67 | floor {} 68 | isInfinity {} 69 | isInteger {} 70 | isNan {} 71 | log {} 72 | pow(power) {} 73 | round {} 74 | sin {} 75 | sqrt {} 76 | tan {} 77 | } 78 | 79 | class Object { 80 | static same(obj1, obj2) {} 81 | } 82 | 83 | class Sequence { 84 | all(predicate) {} 85 | any(predicate) {} 86 | contains(element) {} 87 | count {} 88 | count(predicate) {} 89 | each(function) {} 90 | isEmpty {} 91 | join(separator) {} 92 | join() {} 93 | map(transformation) {} 94 | reduce(function) {} 95 | reduce(seed, function) {} 96 | skip(count) {} 97 | take(count) {} 98 | toList {} 99 | where(predicate) {} 100 | } 101 | 102 | class String { 103 | static fromCodePoint(codePoint) {} 104 | bytes {} 105 | codePoints {} 106 | contains(other) {} 107 | count {} 108 | endsWith(suffix) {} 109 | indexOf(search) {} 110 | indexOf(search, start) {} 111 | replace(old, swap) {} 112 | split(separator) {} 113 | startsWith(prefix) {} 114 | trim() {} 115 | trim(chars) {} 116 | trimEnd() {} 117 | trimEnd(chars) {} 118 | trimStart() {} 119 | trimStart(chars) {} 120 | } 121 | 122 | class System { 123 | static clock {} 124 | static gc() {} 125 | static print() {} 126 | static print(object) {} 127 | static printAll(sequence) {} 128 | static write(object) {} 129 | } 130 | `; 131 | 132 | export { coreModules }; -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import * as vscode from 'vscode'; 3 | import WrenManager from './wrenmanager'; 4 | import * as path from 'path'; 5 | import * as fs from 'fs'; 6 | 7 | const WREN_MODE: vscode.DocumentFilter = { language: 'wren', scheme: 'file' }; 8 | 9 | const manager = new WrenManager(); 10 | 11 | // shows signature parameters 12 | class WrenSignatureHelpProvider implements vscode.SignatureHelpProvider { 13 | public provideSignatureHelp(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Promise { 14 | const currentLine = document.lineAt(position.line).text; 15 | 16 | return new Promise((resolve, reject) => { 17 | manager.updateFileIfNotExists(document); 18 | 19 | const info: any = manager.getLineInfo(currentLine, position); 20 | 21 | const help = new vscode.SignatureHelp(); 22 | help.activeParameter = info.currParam; 23 | help.activeSignature = 0; 24 | 25 | // if it looks like a static method call, only show static signatures 26 | if (info.identifiers.length === 2 && info.identifiers[1].isClassName) { 27 | if (manager.staticSignatures.has(info.identifiers[1].text)) { 28 | help.signatures = manager.staticSignatures.get(info.identifiers[1].text)! 29 | .filter((s: any) => s[0] === info.identifiers[0].text) 30 | .map((s: any) => s[1]); 31 | } 32 | } else { 33 | // filter out any functions that don't have the same name as whatever's directly to the left of the ( 34 | help.signatures = manager.signatures.filter((s: any) => s[0] === info.identifiers[0].text).map((s: any) => s[1]); 35 | } 36 | resolve(help); 37 | }); 38 | } 39 | 40 | } 41 | 42 | // auto complete symbol names 43 | class WrenCompletionItemProvider implements vscode.CompletionItemProvider { 44 | public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable { 45 | const currentLine = document.lineAt(position.line).text; 46 | 47 | return new Promise((resolve, reject) => { 48 | manager.updateFileIfNotExists(document); 49 | const info = manager.getLineInfo(currentLine, position); 50 | 51 | // some really basic filtering rules here just to knock a bunch of useless out. 52 | let results: vscode.CompletionItem[] = manager.completions 53 | // don't show classes if the line has any dots 54 | .filter((c: any) => info.foundDot ? c.kind !== vscode.CompletionItemKind.Class : true) 55 | // filter instance methods if the identifier is a class (first letter capitalized) 56 | .filter((c: any): boolean => { 57 | if (c.kind === vscode.CompletionItemKind.Method) { 58 | if (info.identifiers.length === 0) { 59 | return true; 60 | } 61 | 62 | return info.identifiers[0].isClassName ? false : true; 63 | } else { 64 | return true; 65 | } 66 | }); 67 | 68 | // add static members if it is a class reference 69 | if (info.identifiers.length && info.identifiers[0].isClassName) { 70 | if (manager.staticCompletions.has(info.identifiers[0].text)) { 71 | const methods = manager.staticCompletions.get(info.identifiers[0].text)!; 72 | results = results.concat(methods); 73 | } 74 | } else { 75 | // if we have variables for this file (we usually will) append them 76 | if (manager.variables.has(document.fileName)) { 77 | const variables = manager.variables.get(document.fileName)! 78 | // if there's been at least 1 dot, _field and __staticfields will never be valid 79 | .filter((v: any) => info.foundDot ? v.kind !== vscode.CompletionItemKind.Field : true); 80 | results = results.concat(variables); 81 | } 82 | } 83 | 84 | resolve(results); 85 | }); 86 | } 87 | } 88 | 89 | export function activate(ctx: vscode.ExtensionContext) { 90 | console.log('wren-language-provider active!'); 91 | 92 | ctx.subscriptions.push(vscode.languages.registerSignatureHelpProvider(WREN_MODE, new WrenSignatureHelpProvider(), '(', ',')); 93 | ctx.subscriptions.push(vscode.languages.registerCompletionItemProvider(WREN_MODE, new WrenCompletionItemProvider(), '.')); 94 | ctx.subscriptions.push(vscode.workspace.onDidSaveTextDocument((doc: vscode.TextDocument) => { 95 | // force a full reparse of the file on save 96 | if (doc.languageId !== "wren") { 97 | return; 98 | } 99 | 100 | manager.parseDocument(doc); 101 | })); 102 | 103 | const config = vscode.workspace.getConfiguration('wren'); 104 | // additionalModuleDirectories is an array of relative paths to search for wren scripts when reading imports 105 | for (let additionalPath of config.additionalModuleDirectories) { 106 | if (vscode.workspace.workspaceFolders === undefined) { 107 | 108 | } else { 109 | // multi-root workspaces. just add all workspaces that have the additional path 110 | for (let ws of vscode.workspace.workspaceFolders) { 111 | const scriptPath = path.join(ws.uri.fsPath, additionalPath); 112 | if (fs.existsSync(scriptPath)) { 113 | manager.addPathToSearch(scriptPath); 114 | } 115 | } 116 | } 117 | } 118 | } 119 | 120 | export function deactivate() { 121 | } -------------------------------------------------------------------------------- /src/test/extension.test.ts: -------------------------------------------------------------------------------- 1 | // 2 | // Note: This example test is leveraging the Mocha test framework. 3 | // Please refer to their documentation on https://mochajs.org/ for help. 4 | // 5 | 6 | // The module 'assert' provides assertion methods from node 7 | import * as assert from 'assert'; 8 | 9 | // You can import and use all API from the 'vscode' module 10 | // as well as import your extension to test it 11 | // import * as vscode from 'vscode'; 12 | // import * as myExtension from '../extension'; 13 | 14 | // Defines a Mocha test suite to group tests of similar kind together 15 | suite("Extension Tests", function () { 16 | 17 | // Defines a Mocha unit test 18 | test("Something 1", function() { 19 | assert.equal(-1, [1, 2, 3].indexOf(5)); 20 | assert.equal(-1, [1, 2, 3].indexOf(0)); 21 | }); 22 | }); -------------------------------------------------------------------------------- /src/test/index.ts: -------------------------------------------------------------------------------- 1 | // 2 | // PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING 3 | // 4 | // This file is providing the test runner to use when running extension tests. 5 | // By default the test runner in use is Mocha based. 6 | // 7 | // You can provide your own test runner if you want to override it by exporting 8 | // a function run(testRoot: string, clb: (error:Error) => void) that the extension 9 | // host can call to run the tests. The test runner is expected to use console.log 10 | // to report the results back to the caller. When the tests are finished, return 11 | // a possible error to the callback or null if none. 12 | 13 | import * as testRunner from 'vscode/lib/testrunner'; 14 | 15 | // You can directly control Mocha options by uncommenting the following lines 16 | // See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info 17 | testRunner.configure({ 18 | ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) 19 | useColors: true // colored output from test results 20 | }); 21 | 22 | module.exports = testRunner; -------------------------------------------------------------------------------- /src/wrenmanager.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import * as vscode from 'vscode'; 3 | 4 | import Lexer from './wrenalyzer-ts/lexer'; 5 | import Parser, { Module } from './wrenalyzer-ts/parser'; 6 | import Token from './wrenalyzer-ts/token'; 7 | import SourceFile from './wrenalyzer-ts/sourcefile'; 8 | import * as path from 'path'; 9 | import * as fs from 'fs'; 10 | import { coreModules } from './corewren'; 11 | 12 | class WrenManager { 13 | trees: Map = new Map(); // the full ast trees for each file 14 | variables: Map = new Map(); // all the variables for a file 15 | searchPaths: Array = []; // additional paths to search if current dir doesn't find a script 16 | pending: Set = new Set(); // filenames that have not yet resolved 17 | 18 | completions: Array = []; // list of all completions globally. TODO: split up per file? 19 | staticCompletions: Map> = new Map(); // static method completions so we can include only the proper ones 20 | signatures: [string, vscode.SignatureInformation][] = []; // [function name, [signatures]] globally, non unique function names 21 | staticSignatures: Map = new Map(); // class -> [function name, [signatures]] globally, non unique function names 22 | 23 | constructor() { 24 | // grab the string from corewren.ts to get all the core classes 25 | const sourceFile = new SourceFile("core", coreModules); 26 | this.parseFile(sourceFile); 27 | } 28 | 29 | // add a relative path, useful for global scripts that might not be in the current dir 30 | addPathToSearch(p: string): void { 31 | this.searchPaths.push(p); 32 | } 33 | 34 | // blank out everything and rebuild all generated data 35 | updateCompletionItems(): void { 36 | console.info("Regenerating completion items"); 37 | 38 | this.completions = []; 39 | this.staticCompletions = new Map(); 40 | this.signatures = []; 41 | this.staticSignatures = new Map(); 42 | this.variables = new Map(); 43 | 44 | const methodSet: Set = new Set(); // seen method names to prevent dupe completions 45 | const classSet: Set = new Set(); // seen class names to prevent dupe completions 46 | 47 | // for each ast, go through and grab everything we want to complete 48 | for (let e of this.trees.entries()) { 49 | const path: string = e[0]; 50 | const module: any = e[1]; 51 | 52 | const classVars: vscode.CompletionItem[] = []; // array of variables for this file 53 | this.variables.set(path, classVars); 54 | const uniqVars: Set = new Set(); // per-file, prevent duplicate variable names 55 | 56 | // for each class in the file, go through and grab everything 57 | module.statements.filter((o: any) => o.type === 'ClassStmt') 58 | .forEach((c: any) => { 59 | const staticMethodSet: Set = new Set(); // seen static method names to prevent dupe completion 60 | 61 | // if this is a new class, setup the completion for it 62 | if (!classSet.has(c.name.text)) { 63 | const item = new vscode.CompletionItem(c.name.text, vscode.CompletionItemKind.Class); 64 | item.detail = vscode.workspace.asRelativePath(c.name.source.path); 65 | this.completions.push(item); 66 | classSet.add(c.name.text); 67 | } 68 | 69 | // for every method, build up the method completion and variables inside 70 | for (let m of c.methods) { 71 | let prefix = ''; 72 | if (m.constructKeyword) { prefix += 'construct '; } 73 | if (m.foreignKeyword) { prefix += 'foreign '; } 74 | if (m.staticKeyword) { prefix += 'static '; } 75 | 76 | // get the list of param labels 77 | const params = m.parameters ? m.parameters.map((t: any) => t.text) : []; 78 | const label = `${prefix}${c.name.text}.${m.name.text}(${params.join(', ')})`; // Class.funcName(param1, param2, param3) 79 | 80 | // use the relative path if possible to save space in the thumbnail 81 | let documentation = vscode.workspace.asRelativePath(m.name.source.path); 82 | if (m.name.source.path !== 'core') { 83 | documentation += ` (line ${m.name.lineStart})`; 84 | } 85 | 86 | // setup the signature object 87 | const sig = new vscode.SignatureInformation(label, documentation); 88 | sig.parameters = params.map((p: any) => new vscode.ParameterInformation(p)); 89 | 90 | // we'll use the function name to filter this.signatures when requested 91 | if (m.staticKeyword || m.constructKeyword) { 92 | if (!this.staticSignatures.has(c.name.text)) { 93 | this.staticSignatures.set(c.name.text, []); 94 | } 95 | 96 | this.staticSignatures.get(c.name.text)!.push([m.name.text, sig]); 97 | } else { 98 | this.signatures.push([m.name.text, sig]); 99 | } 100 | 101 | // setup the autocomplete for the function itself, icon depending on static or not 102 | if (m.staticKeyword || m.constructKeyword) { 103 | if (!this.staticCompletions.has(c.name.text)) { 104 | this.staticCompletions.set(c.name.text, []); 105 | } 106 | if (!staticMethodSet.has(m.name.text)) { 107 | const item = new vscode.CompletionItem(m.name.text, vscode.CompletionItemKind.Function); 108 | item.detail = `${prefix}${c.name.text}.${m.name.text}`; 109 | this.staticCompletions.get(c.name.text)!.push(item); 110 | staticMethodSet.add(m.name.text); 111 | } 112 | } else { 113 | // this is a instance method 114 | if (!methodSet.has(m.name.text)) { 115 | const item = new vscode.CompletionItem(m.name.text, vscode.CompletionItemKind.Method); 116 | item.detail = `${prefix}${c.name.text}.${m.name.text}`; 117 | this.completions.push(item); 118 | methodSet.add(m.name.text); // FIXME: probably don't want this once we actually resolve classes right? we may have different functions that vary in foreign/static properties 119 | } 120 | } 121 | 122 | // grab any variables out of the body recursively 123 | // TODO: this seems to be incomplete. timer.wren, it only grabs var f, but not the var t inside the block arg 124 | // probably missing other things 125 | const className = c.name.text; 126 | const visitBody = (m: any) => { 127 | // if m.statements is undefined, the iterator will exception out 128 | if (!m.statements) { 129 | return; 130 | } 131 | 132 | for (let s of m.statements) { 133 | // look for more potential statements 134 | for (let prop of ['body', 'blockArgument', 'thenBranch', 'elseBranch']) { 135 | if (s[prop]) { 136 | visitBody(s[prop]); 137 | } 138 | } 139 | 140 | // if it's a "var a = 1" grab the name 141 | if (s.type === 'VarStmt') { 142 | if (uniqVars.has(s.name.text)) { 143 | continue; 144 | } 145 | uniqVars.add(s.name.text); 146 | const item = new vscode.CompletionItem(s.name.text, vscode.CompletionItemKind.Variable); 147 | item.detail = 'class ' + className; 148 | classVars.push(item); 149 | continue; 150 | } 151 | 152 | // there are a few types of assignments, some don't have names 153 | if (s.type === 'AssignmentExpr' && s.target.name && (s.target.name.type === 'field' || s.target.name.type === 'staticField')) { 154 | if (uniqVars.has(s.target.name.text)) { 155 | continue; 156 | } 157 | uniqVars.add(s.target.name.text); 158 | 159 | const item = new vscode.CompletionItem(s.target.name.text, vscode.CompletionItemKind.Field); 160 | item.detail = 'class ' + className; 161 | classVars.push(item); 162 | continue; 163 | } 164 | } 165 | }; 166 | 167 | // exception handler since this one has been tricky 168 | try { 169 | if (m.body) { 170 | visitBody(m.body); 171 | } 172 | } catch (err) { 173 | console.error(err); 174 | } 175 | 176 | } 177 | }); 178 | } 179 | } 180 | 181 | // take a module we've parsed, and recursively parse all the imports 182 | updateFileImports(start: Module): void { 183 | // find all imports and generate relative paths for them. exclude the built in optionals 184 | // since they'll never be found. 185 | // TODO: wren module loading has changed recently. rethink this once i've upgraded? 186 | const files = start.statements 187 | .filter((stmt: any) => stmt.type === 'ImportStmt' && stmt.path.text !== '"meta"' && stmt.path.text !== '"random"') 188 | .map((stmt: any) => { 189 | // we get strings with quotes around them, remove them 190 | let relPath = stmt.path.text.replace(/\"/g, ''); 191 | // append a ./ and .wren so we can find it on the fs 192 | if (relPath.startsWith('./') === false) { 193 | relPath = './' + relPath; 194 | } 195 | if (relPath.endsWith('.wren') === false) { 196 | relPath += '.wren'; 197 | } 198 | 199 | // return the relative path and the folder of the current script 200 | return [relPath, path.dirname(stmt.path.source.path)]; 201 | }); 202 | 203 | // loop through every file from an import 204 | for (let fileTuple of files) { 205 | const file = fileTuple[0]; 206 | 207 | let fpath: string = ''; // absolute path of the found file 208 | const testPaths = [fileTuple[1], ...this.searchPaths]; // paths to look for file in, first relative, then extra config locations 209 | let alreadyParsed = false; // if we're in the middle of, or are already parsing 210 | // for each path, look to see if the file is a dupe, otherwise check if the file exists on disk 211 | for (let testPath of testPaths) { 212 | const joinedPath = path.join(testPath, file); 213 | if (this.trees.has(joinedPath) || this.pending.has(joinedPath)) { 214 | alreadyParsed = true; // track this separately since it's expected 215 | break; 216 | } 217 | 218 | // TODO: is the synchronous api bad here? it's probably quick enough. 219 | if (fs.existsSync(joinedPath)) { 220 | fpath = path.join(testPath, file); 221 | break; 222 | } 223 | } 224 | 225 | // not an error 226 | if (alreadyParsed) { 227 | continue; 228 | } 229 | 230 | // couldn't find the import in any location, warn and move on 231 | if (fpath === '') { 232 | console.warn("couldn't find file in any path " + file); 233 | continue; 234 | } 235 | 236 | // we found a file, add it to the list of files we're waiting on 237 | this.pending.add(fpath); 238 | 239 | fs.readFile(fpath, (err, data) => { 240 | if (err) { 241 | console.warn("error reading file " + fpath); 242 | } else { 243 | this.parseFile(new SourceFile(fpath, data.toString())); 244 | } 245 | 246 | // trigger completion update, so we don't update if the last file was an error 247 | this.pending.delete(fpath); 248 | if (this.pending.size === 0) { 249 | console.log("Done reading and parsing files, updating completion items"); 250 | this.updateCompletionItems(); 251 | } 252 | }); 253 | } 254 | 255 | // after we've went through the files, and aren't waiting on any files to complete 256 | // (aka if a file without any imports happens) 257 | if (this.pending.size === 0) { 258 | console.log("No new imports, updating completion items"); 259 | this.updateCompletionItems(); 260 | } 261 | } 262 | 263 | // trigger an update if we don't have the current document 264 | updateFileIfNotExists(document: vscode.TextDocument): void { 265 | if (this.trees.has(document.fileName)) { 266 | return; 267 | } 268 | 269 | this.parseDocument(document); 270 | } 271 | 272 | // parse the ast, save it, and parse the imports 273 | parseFile(source: SourceFile): Module { 274 | console.log(`Parsing AST for ${source.path}`); 275 | 276 | const lexer = new Lexer(source); 277 | const parser = new Parser(lexer); 278 | const ast = parser.parseModule(); 279 | 280 | this.trees.set(source.path, ast); 281 | 282 | this.updateFileImports(ast); 283 | 284 | return ast; 285 | } 286 | 287 | // create a SourceFile from a vs document and parse it 288 | parseDocument(document: vscode.TextDocument): Module { 289 | const source = new SourceFile(document.fileName, document.getText()); 290 | const ast = this.parseFile(source); 291 | 292 | return ast; 293 | } 294 | 295 | // used for completion, we'll usually pass a single line into this and mess with tokens 296 | lexString(source: string): Token[] { 297 | const sf = new SourceFile('string', source); 298 | const lexer = new Lexer(sf); 299 | 300 | // generate an array of them instead of using the lexer api 301 | let token = lexer.readToken(); 302 | const tokens: Token[] = []; 303 | while (token.type !== Token.eof) { 304 | tokens.push(token); 305 | token = lexer.readToken(); 306 | } 307 | 308 | return tokens; 309 | } 310 | 311 | // return an object of whatever we need in the extension to try and filter results 312 | // and also to provide the argument completion 313 | getLineInfo(source: string, position: vscode.Position): any { 314 | const tokens = this.lexString(source).reverse(); 315 | 316 | // if we find a left parens, we're done parsing arguments 317 | let foundLeftParens = false; 318 | // used to highlight which param we're on 319 | let currParam = 0; 320 | // we've found a dot token, will be reset once we find a string. 321 | // used to identify ex Draw.rect => ['rect', 'Draw'] 322 | let foundDot = true; 323 | // this is kinda dumb but it's useful for the caller to know if there's been any dot 324 | // so we can know if we should show class names, etc 325 | let foundAtLeastOneDot = false; 326 | const identifiers: object[] = []; 327 | 328 | for (let token of tokens) { 329 | // we don't care about anything ahead of us yet 330 | if (token.columnStart > position.character) { 331 | continue; 332 | } 333 | 334 | if (token.type === Token.leftParen) { 335 | // don't count anymore params 336 | foundLeftParens = true; 337 | } else if (!foundLeftParens && token.type === Token.comma) { 338 | // we're inside a param list, figure out what param we're on 339 | currParam += 1; 340 | } else if (token.type === Token.dot) { 341 | // reset the identifier finder but note for the return value that there's been one 342 | foundDot = true; 343 | foundAtLeastOneDot = true; 344 | } else if (foundDot && token.type === Token.tname) { 345 | // if we've found a dot (or this is the first name token) push it to a list of identifiers 346 | // that we've found on this line 347 | identifiers.push({ 348 | text: token.text, 349 | isClassName: token.length && token.text[0].toUpperCase() === token.text[0], 350 | isField: token.length >= 2 && token.text[0] === '_' && token.text[1] !== '_', 351 | isStaticField: token.length >= 2 && token.text[0] === '_' && token.text[1] === '_' 352 | }); 353 | // reset so we need to find another dot first 354 | // this might not be necessary? 355 | foundDot = false; 356 | } 357 | 358 | //console.log(token); 359 | } 360 | console.log(`foundLeftParens: ${foundLeftParens}, currParam: ${currParam}, foundDot: ${foundDot}, identifiers: ${JSON.stringify(identifiers)}`); 361 | return { foundLeftParens, currParam, foundDot: foundAtLeastOneDot, identifiers }; 362 | } 363 | } 364 | 365 | export default WrenManager; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | /* Strict Type-Checking Option */ 12 | "strict": true, /* enable all strict type-checking options */ 13 | /* Additional Checks */ 14 | "noUnusedLocals": true /* Report errors on unused locals. */ 15 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 16 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 17 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 18 | }, 19 | "exclude": [ 20 | "node_modules", 21 | ".vscode-test" 22 | ] 23 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-string-throw": true, 4 | "no-unused-expression": true, 5 | "no-duplicate-variable": true, 6 | "curly": true, 7 | "class-name": true, 8 | "semicolon": [ 9 | true, 10 | "always" 11 | ], 12 | "triple-equals": true 13 | }, 14 | "defaultSeverity": "warning" 15 | } -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | * This folder contains all of the files necessary for your extension. 5 | * `package.json` - this is the manifest file in which you declare your extension and command. 6 | The sample plugin registers a command and defines its title and command name. With this information 7 | VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. 8 | * `src/extension.ts` - this is the main file where you will provide the implementation of your command. 9 | The file exports one function, `activate`, which is called the very first time your extension is 10 | activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 11 | We pass the function containing the implementation of the command as the second parameter to 12 | `registerCommand`. 13 | 14 | ## Get up and running straight away 15 | * Press `F5` to open a new window with your extension loaded. 16 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 17 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 18 | * Find output from your extension in the debug console. 19 | 20 | ## Make changes 21 | * You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. 22 | * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. 23 | 24 | ## Explore the API 25 | * You can open the full set of our API when you open the file `node_modules/vscode/vscode.d.ts`. 26 | 27 | ## Run tests 28 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Launch Tests`. 29 | * Press `F5` to run the tests in a new window with your extension loaded. 30 | * See the output of the test result in the debug console. 31 | * Make changes to `test/extension.test.ts` or create new test files inside the `test` folder. 32 | * By convention, the test runner will only consider files matching the name pattern `**.test.ts`. 33 | * You can create folders inside the `test` folder to structure your tests any way you want. 34 | --------------------------------------------------------------------------------