├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── README.md ├── package-lock.json ├── package.json ├── screenshots ├── ss1.png └── vid.gif ├── src ├── extension.ts ├── test │ ├── extension.test.ts │ └── index.ts └── webview.ts ├── tsconfig.json ├── tslint.json ├── ui ├── index.html ├── logo-192.png ├── logo-512.png ├── so.js └── style.css └── vsc-extension-quickstart.md /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | -------------------------------------------------------------------------------- /.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 | "ms-vscode.vscode-typescript-tslint-plugin" 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 | "name": "Run Extension", 9 | "type": "extensionHost", 10 | "request": "launch", 11 | "runtimeExecutable": "${execPath}", 12 | "args": [ 13 | "--extensionDevelopmentPath=${workspaceFolder}" 14 | ], 15 | "outFiles": [ 16 | "${workspaceFolder}/out/**/*.js" 17 | ], 18 | "preLaunchTask": "npm: watch" 19 | }, 20 | { 21 | "name": "Extension Tests", 22 | "type": "extensionHost", 23 | "request": "launch", 24 | "runtimeExecutable": "${execPath}", 25 | "args": [ 26 | "--extensionDevelopmentPath=${workspaceFolder}", 27 | "--extensionTestsPath=${workspaceFolder}/out/test" 28 | ], 29 | "outFiles": [ 30 | "${workspaceFolder}/out/test/**/*.js" 31 | ], 32 | "preLaunchTask": "npm: watch" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /.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 | } 21 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | src/** 5 | .gitignore 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/tslint.json 9 | **/*.map 10 | **/*.ts -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "integrated-stackoverflow" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## [Unreleased] 8 | 9 | - Initial release -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ? Integrated Stackoverflow 2 | 3 | Get stackoverflow answers right into your text editor and search for solutions easily. 4 | 5 | Just press ***`CTRL + K S`*** to open search bar into your text editor and search for your error 6 | 7 | [![Current version of Integrated Stackoverflow](https://vsmarketplacebadge.apphb.com/version-short/saurabh.integrated-stackoverflow.svg)](https://marketplace.visualstudio.com/items?itemName=saurabh.integrated-stackoverflow) [![Downloads](https://vsmarketplacebadge.apphb.com/downloads/saurabh.integrated-stackoverflow.svg)](https://marketplace.visualstudio.com/items?itemName=saurabh.integrated-stackoverflow) [![Rating](https://vsmarketplacebadge.apphb.com/rating-short/saurabh.integrated-stackoverflow.svg)](https://marketplace.visualstudio.com/items?itemName=saurabh.integrated-stackoverflow) 8 | 9 | Visit Marketplace 10 | 11 | ## Usage 12 | Press ***`CTRL + K S`*** to open stackoverflow searchbar, Paste/Type your error and press enter. 13 | 14 | 15 | ## Snapshots 16 | ![](screenshots/ss1.png) 17 | 18 | ![](screenshots/vid.gif) 19 | 20 | ## Contribution 21 | - Check for the issues on https://github.com/saurabhdaware/vscode-integrated-stackoverflow/issues 22 | - Fork the project 23 | - Finish your changes and make Pull Request to Master branch of https://github.com/saurabhdaware/vscode-integrated-stackoverflow 24 | 25 | ## Local Development 26 | - Fork this project 27 | - `git clone https://github.com/{your username}/vscode-integrated-stackoverflow` 28 | - `cd vscode-integrated-stackoverflow` 29 | - `npm install` 30 | - Open the project in Visual Studio Code and press `Ctrl + f5` to start Extension host. 31 | 32 | ## Release Notes 33 | 34 | ### 1.0.x 35 | 36 | Initial Release of Integrated Stackoverflow and Minor Updates. 37 | 38 | 39 | ---- 40 | 41 | ***Dont forget to star my github repository https://github.com/saurabhdaware/vscode-integrated-stackoverflow*** 42 | 43 | ***Enjoy 🎉*** -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "integrated-stackoverflow", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@types/mocha": { 28 | "version": "2.2.48", 29 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", 30 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", 31 | "dev": true 32 | }, 33 | "@types/node": { 34 | "version": "10.14.9", 35 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.9.tgz", 36 | "integrity": "sha512-NelG/dSahlXYtSoVPErrp06tYFrvzj8XLWmKA+X8x0W//4MqbUyZu++giUG/v0bjAT6/Qxa8IjodrfdACyb0Fg==", 37 | "dev": true 38 | }, 39 | "agent-base": { 40 | "version": "4.3.0", 41 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 42 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 43 | "dev": true, 44 | "requires": { 45 | "es6-promisify": "^5.0.0" 46 | } 47 | }, 48 | "ajv": { 49 | "version": "6.10.0", 50 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 51 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 52 | "dev": true, 53 | "requires": { 54 | "fast-deep-equal": "^2.0.1", 55 | "fast-json-stable-stringify": "^2.0.0", 56 | "json-schema-traverse": "^0.4.1", 57 | "uri-js": "^4.2.2" 58 | } 59 | }, 60 | "ansi-styles": { 61 | "version": "3.2.1", 62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 63 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 64 | "dev": true, 65 | "requires": { 66 | "color-convert": "^1.9.0" 67 | } 68 | }, 69 | "argparse": { 70 | "version": "1.0.10", 71 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 72 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 73 | "dev": true, 74 | "requires": { 75 | "sprintf-js": "~1.0.2" 76 | } 77 | }, 78 | "asn1": { 79 | "version": "0.2.4", 80 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 81 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 82 | "dev": true, 83 | "requires": { 84 | "safer-buffer": "~2.1.0" 85 | } 86 | }, 87 | "assert-plus": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 90 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 91 | "dev": true 92 | }, 93 | "asynckit": { 94 | "version": "0.4.0", 95 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 96 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 97 | "dev": true 98 | }, 99 | "aws-sign2": { 100 | "version": "0.7.0", 101 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 102 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 103 | "dev": true 104 | }, 105 | "aws4": { 106 | "version": "1.8.0", 107 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 108 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 109 | "dev": true 110 | }, 111 | "balanced-match": { 112 | "version": "1.0.0", 113 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 114 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 115 | "dev": true 116 | }, 117 | "bcrypt-pbkdf": { 118 | "version": "1.0.2", 119 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 120 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 121 | "dev": true, 122 | "requires": { 123 | "tweetnacl": "^0.14.3" 124 | } 125 | }, 126 | "brace-expansion": { 127 | "version": "1.1.11", 128 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 129 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 130 | "dev": true, 131 | "requires": { 132 | "balanced-match": "^1.0.0", 133 | "concat-map": "0.0.1" 134 | } 135 | }, 136 | "browser-stdout": { 137 | "version": "1.3.0", 138 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 139 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 140 | "dev": true 141 | }, 142 | "buffer-from": { 143 | "version": "1.1.1", 144 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 145 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 146 | "dev": true 147 | }, 148 | "builtin-modules": { 149 | "version": "1.1.1", 150 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 151 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 152 | "dev": true 153 | }, 154 | "caseless": { 155 | "version": "0.12.0", 156 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 157 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 158 | "dev": true 159 | }, 160 | "chalk": { 161 | "version": "2.4.2", 162 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 163 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 164 | "dev": true, 165 | "requires": { 166 | "ansi-styles": "^3.2.1", 167 | "escape-string-regexp": "^1.0.5", 168 | "supports-color": "^5.3.0" 169 | } 170 | }, 171 | "color-convert": { 172 | "version": "1.9.3", 173 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 174 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 175 | "dev": true, 176 | "requires": { 177 | "color-name": "1.1.3" 178 | } 179 | }, 180 | "color-name": { 181 | "version": "1.1.3", 182 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 183 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 184 | "dev": true 185 | }, 186 | "combined-stream": { 187 | "version": "1.0.8", 188 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 189 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 190 | "dev": true, 191 | "requires": { 192 | "delayed-stream": "~1.0.0" 193 | } 194 | }, 195 | "commander": { 196 | "version": "2.20.0", 197 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 198 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 199 | "dev": true 200 | }, 201 | "concat-map": { 202 | "version": "0.0.1", 203 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 204 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 205 | "dev": true 206 | }, 207 | "core-util-is": { 208 | "version": "1.0.2", 209 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 210 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 211 | "dev": true 212 | }, 213 | "dashdash": { 214 | "version": "1.14.1", 215 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 216 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 217 | "dev": true, 218 | "requires": { 219 | "assert-plus": "^1.0.0" 220 | } 221 | }, 222 | "debug": { 223 | "version": "3.1.0", 224 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 225 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 226 | "dev": true, 227 | "requires": { 228 | "ms": "2.0.0" 229 | } 230 | }, 231 | "delayed-stream": { 232 | "version": "1.0.0", 233 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 234 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 235 | "dev": true 236 | }, 237 | "diff": { 238 | "version": "3.5.0", 239 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 240 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 241 | "dev": true 242 | }, 243 | "ecc-jsbn": { 244 | "version": "0.1.2", 245 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 246 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 247 | "dev": true, 248 | "requires": { 249 | "jsbn": "~0.1.0", 250 | "safer-buffer": "^2.1.0" 251 | } 252 | }, 253 | "es6-promise": { 254 | "version": "4.2.8", 255 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 256 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 257 | "dev": true 258 | }, 259 | "es6-promisify": { 260 | "version": "5.0.0", 261 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 262 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 263 | "dev": true, 264 | "requires": { 265 | "es6-promise": "^4.0.3" 266 | } 267 | }, 268 | "escape-string-regexp": { 269 | "version": "1.0.5", 270 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 271 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 272 | "dev": true 273 | }, 274 | "esprima": { 275 | "version": "4.0.1", 276 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 277 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 278 | "dev": true 279 | }, 280 | "esutils": { 281 | "version": "2.0.2", 282 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 283 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 284 | "dev": true 285 | }, 286 | "extend": { 287 | "version": "3.0.2", 288 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 289 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 290 | "dev": true 291 | }, 292 | "extsprintf": { 293 | "version": "1.3.0", 294 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 295 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 296 | "dev": true 297 | }, 298 | "fast-deep-equal": { 299 | "version": "2.0.1", 300 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 301 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 302 | "dev": true 303 | }, 304 | "fast-json-stable-stringify": { 305 | "version": "2.0.0", 306 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 307 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 308 | "dev": true 309 | }, 310 | "forever-agent": { 311 | "version": "0.6.1", 312 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 313 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 314 | "dev": true 315 | }, 316 | "form-data": { 317 | "version": "2.3.3", 318 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 319 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 320 | "dev": true, 321 | "requires": { 322 | "asynckit": "^0.4.0", 323 | "combined-stream": "^1.0.6", 324 | "mime-types": "^2.1.12" 325 | } 326 | }, 327 | "fs.realpath": { 328 | "version": "1.0.0", 329 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 330 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 331 | "dev": true 332 | }, 333 | "getpass": { 334 | "version": "0.1.7", 335 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 336 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 337 | "dev": true, 338 | "requires": { 339 | "assert-plus": "^1.0.0" 340 | } 341 | }, 342 | "glob": { 343 | "version": "7.1.4", 344 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 345 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 346 | "dev": true, 347 | "requires": { 348 | "fs.realpath": "^1.0.0", 349 | "inflight": "^1.0.4", 350 | "inherits": "2", 351 | "minimatch": "^3.0.4", 352 | "once": "^1.3.0", 353 | "path-is-absolute": "^1.0.0" 354 | } 355 | }, 356 | "growl": { 357 | "version": "1.10.3", 358 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 359 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 360 | "dev": true 361 | }, 362 | "har-schema": { 363 | "version": "2.0.0", 364 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 365 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 366 | "dev": true 367 | }, 368 | "har-validator": { 369 | "version": "5.1.3", 370 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 371 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 372 | "dev": true, 373 | "requires": { 374 | "ajv": "^6.5.5", 375 | "har-schema": "^2.0.0" 376 | } 377 | }, 378 | "has-flag": { 379 | "version": "3.0.0", 380 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 381 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 382 | "dev": true 383 | }, 384 | "he": { 385 | "version": "1.1.1", 386 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 387 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 388 | "dev": true 389 | }, 390 | "http-proxy-agent": { 391 | "version": "2.1.0", 392 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 393 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 394 | "dev": true, 395 | "requires": { 396 | "agent-base": "4", 397 | "debug": "3.1.0" 398 | } 399 | }, 400 | "http-signature": { 401 | "version": "1.2.0", 402 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 403 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 404 | "dev": true, 405 | "requires": { 406 | "assert-plus": "^1.0.0", 407 | "jsprim": "^1.2.2", 408 | "sshpk": "^1.7.0" 409 | } 410 | }, 411 | "https-proxy-agent": { 412 | "version": "2.2.1", 413 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 414 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 415 | "dev": true, 416 | "requires": { 417 | "agent-base": "^4.1.0", 418 | "debug": "^3.1.0" 419 | } 420 | }, 421 | "inflight": { 422 | "version": "1.0.6", 423 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 424 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 425 | "dev": true, 426 | "requires": { 427 | "once": "^1.3.0", 428 | "wrappy": "1" 429 | } 430 | }, 431 | "inherits": { 432 | "version": "2.0.3", 433 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 434 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 435 | "dev": true 436 | }, 437 | "is-typedarray": { 438 | "version": "1.0.0", 439 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 440 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 441 | "dev": true 442 | }, 443 | "isstream": { 444 | "version": "0.1.2", 445 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 446 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 447 | "dev": true 448 | }, 449 | "js-tokens": { 450 | "version": "4.0.0", 451 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 452 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 453 | "dev": true 454 | }, 455 | "js-yaml": { 456 | "version": "3.13.1", 457 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 458 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 459 | "dev": true, 460 | "requires": { 461 | "argparse": "^1.0.7", 462 | "esprima": "^4.0.0" 463 | } 464 | }, 465 | "jsbn": { 466 | "version": "0.1.1", 467 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 468 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 469 | "dev": true 470 | }, 471 | "json-schema": { 472 | "version": "0.2.3", 473 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 474 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 475 | "dev": true 476 | }, 477 | "json-schema-traverse": { 478 | "version": "0.4.1", 479 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 480 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 481 | "dev": true 482 | }, 483 | "json-stringify-safe": { 484 | "version": "5.0.1", 485 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 486 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 487 | "dev": true 488 | }, 489 | "jsprim": { 490 | "version": "1.4.1", 491 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 492 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 493 | "dev": true, 494 | "requires": { 495 | "assert-plus": "1.0.0", 496 | "extsprintf": "1.3.0", 497 | "json-schema": "0.2.3", 498 | "verror": "1.10.0" 499 | } 500 | }, 501 | "mime-db": { 502 | "version": "1.40.0", 503 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 504 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", 505 | "dev": true 506 | }, 507 | "mime-types": { 508 | "version": "2.1.24", 509 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 510 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 511 | "dev": true, 512 | "requires": { 513 | "mime-db": "1.40.0" 514 | } 515 | }, 516 | "minimatch": { 517 | "version": "3.0.4", 518 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 519 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 520 | "dev": true, 521 | "requires": { 522 | "brace-expansion": "^1.1.7" 523 | } 524 | }, 525 | "minimist": { 526 | "version": "0.0.8", 527 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 528 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 529 | "dev": true 530 | }, 531 | "mkdirp": { 532 | "version": "0.5.1", 533 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 534 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 535 | "dev": true, 536 | "requires": { 537 | "minimist": "0.0.8" 538 | } 539 | }, 540 | "mocha": { 541 | "version": "4.1.0", 542 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", 543 | "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", 544 | "dev": true, 545 | "requires": { 546 | "browser-stdout": "1.3.0", 547 | "commander": "2.11.0", 548 | "debug": "3.1.0", 549 | "diff": "3.3.1", 550 | "escape-string-regexp": "1.0.5", 551 | "glob": "7.1.2", 552 | "growl": "1.10.3", 553 | "he": "1.1.1", 554 | "mkdirp": "0.5.1", 555 | "supports-color": "4.4.0" 556 | }, 557 | "dependencies": { 558 | "commander": { 559 | "version": "2.11.0", 560 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 561 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 562 | "dev": true 563 | }, 564 | "diff": { 565 | "version": "3.3.1", 566 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 567 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 568 | "dev": true 569 | }, 570 | "glob": { 571 | "version": "7.1.2", 572 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 573 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 574 | "dev": true, 575 | "requires": { 576 | "fs.realpath": "^1.0.0", 577 | "inflight": "^1.0.4", 578 | "inherits": "2", 579 | "minimatch": "^3.0.4", 580 | "once": "^1.3.0", 581 | "path-is-absolute": "^1.0.0" 582 | } 583 | }, 584 | "has-flag": { 585 | "version": "2.0.0", 586 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 587 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 588 | "dev": true 589 | }, 590 | "supports-color": { 591 | "version": "4.4.0", 592 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 593 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 594 | "dev": true, 595 | "requires": { 596 | "has-flag": "^2.0.0" 597 | } 598 | } 599 | } 600 | }, 601 | "ms": { 602 | "version": "2.0.0", 603 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 604 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 605 | "dev": true 606 | }, 607 | "oauth-sign": { 608 | "version": "0.9.0", 609 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 610 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 611 | "dev": true 612 | }, 613 | "once": { 614 | "version": "1.4.0", 615 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 616 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 617 | "dev": true, 618 | "requires": { 619 | "wrappy": "1" 620 | } 621 | }, 622 | "path-is-absolute": { 623 | "version": "1.0.1", 624 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 625 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 626 | "dev": true 627 | }, 628 | "path-parse": { 629 | "version": "1.0.6", 630 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 631 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 632 | "dev": true 633 | }, 634 | "performance-now": { 635 | "version": "2.1.0", 636 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 637 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 638 | "dev": true 639 | }, 640 | "psl": { 641 | "version": "1.1.32", 642 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", 643 | "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", 644 | "dev": true 645 | }, 646 | "punycode": { 647 | "version": "2.1.1", 648 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 649 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 650 | "dev": true 651 | }, 652 | "qs": { 653 | "version": "6.5.2", 654 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 655 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 656 | "dev": true 657 | }, 658 | "querystringify": { 659 | "version": "2.1.1", 660 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", 661 | "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", 662 | "dev": true 663 | }, 664 | "request": { 665 | "version": "2.88.0", 666 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 667 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 668 | "dev": true, 669 | "requires": { 670 | "aws-sign2": "~0.7.0", 671 | "aws4": "^1.8.0", 672 | "caseless": "~0.12.0", 673 | "combined-stream": "~1.0.6", 674 | "extend": "~3.0.2", 675 | "forever-agent": "~0.6.1", 676 | "form-data": "~2.3.2", 677 | "har-validator": "~5.1.0", 678 | "http-signature": "~1.2.0", 679 | "is-typedarray": "~1.0.0", 680 | "isstream": "~0.1.2", 681 | "json-stringify-safe": "~5.0.1", 682 | "mime-types": "~2.1.19", 683 | "oauth-sign": "~0.9.0", 684 | "performance-now": "^2.1.0", 685 | "qs": "~6.5.2", 686 | "safe-buffer": "^5.1.2", 687 | "tough-cookie": "~2.4.3", 688 | "tunnel-agent": "^0.6.0", 689 | "uuid": "^3.3.2" 690 | } 691 | }, 692 | "requires-port": { 693 | "version": "1.0.0", 694 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 695 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 696 | "dev": true 697 | }, 698 | "resolve": { 699 | "version": "1.11.0", 700 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", 701 | "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", 702 | "dev": true, 703 | "requires": { 704 | "path-parse": "^1.0.6" 705 | } 706 | }, 707 | "safe-buffer": { 708 | "version": "5.1.2", 709 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 710 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 711 | "dev": true 712 | }, 713 | "safer-buffer": { 714 | "version": "2.1.2", 715 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 716 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 717 | "dev": true 718 | }, 719 | "semver": { 720 | "version": "5.7.0", 721 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 722 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 723 | "dev": true 724 | }, 725 | "source-map": { 726 | "version": "0.6.1", 727 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 728 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 729 | "dev": true 730 | }, 731 | "source-map-support": { 732 | "version": "0.5.12", 733 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", 734 | "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", 735 | "dev": true, 736 | "requires": { 737 | "buffer-from": "^1.0.0", 738 | "source-map": "^0.6.0" 739 | } 740 | }, 741 | "sprintf-js": { 742 | "version": "1.0.3", 743 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 744 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 745 | "dev": true 746 | }, 747 | "sshpk": { 748 | "version": "1.16.1", 749 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 750 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 751 | "dev": true, 752 | "requires": { 753 | "asn1": "~0.2.3", 754 | "assert-plus": "^1.0.0", 755 | "bcrypt-pbkdf": "^1.0.0", 756 | "dashdash": "^1.12.0", 757 | "ecc-jsbn": "~0.1.1", 758 | "getpass": "^0.1.1", 759 | "jsbn": "~0.1.0", 760 | "safer-buffer": "^2.0.2", 761 | "tweetnacl": "~0.14.0" 762 | } 763 | }, 764 | "supports-color": { 765 | "version": "5.5.0", 766 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 767 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 768 | "dev": true, 769 | "requires": { 770 | "has-flag": "^3.0.0" 771 | } 772 | }, 773 | "tough-cookie": { 774 | "version": "2.4.3", 775 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 776 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 777 | "dev": true, 778 | "requires": { 779 | "psl": "^1.1.24", 780 | "punycode": "^1.4.1" 781 | }, 782 | "dependencies": { 783 | "punycode": { 784 | "version": "1.4.1", 785 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 786 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 787 | "dev": true 788 | } 789 | } 790 | }, 791 | "tslib": { 792 | "version": "1.10.0", 793 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 794 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 795 | "dev": true 796 | }, 797 | "tslint": { 798 | "version": "5.17.0", 799 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.17.0.tgz", 800 | "integrity": "sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==", 801 | "dev": true, 802 | "requires": { 803 | "@babel/code-frame": "^7.0.0", 804 | "builtin-modules": "^1.1.1", 805 | "chalk": "^2.3.0", 806 | "commander": "^2.12.1", 807 | "diff": "^3.2.0", 808 | "glob": "^7.1.1", 809 | "js-yaml": "^3.13.1", 810 | "minimatch": "^3.0.4", 811 | "mkdirp": "^0.5.1", 812 | "resolve": "^1.3.2", 813 | "semver": "^5.3.0", 814 | "tslib": "^1.8.0", 815 | "tsutils": "^2.29.0" 816 | } 817 | }, 818 | "tsutils": { 819 | "version": "2.29.0", 820 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 821 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 822 | "dev": true, 823 | "requires": { 824 | "tslib": "^1.8.1" 825 | } 826 | }, 827 | "tunnel-agent": { 828 | "version": "0.6.0", 829 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 830 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 831 | "dev": true, 832 | "requires": { 833 | "safe-buffer": "^5.0.1" 834 | } 835 | }, 836 | "tweetnacl": { 837 | "version": "0.14.5", 838 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 839 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 840 | "dev": true 841 | }, 842 | "typescript": { 843 | "version": "3.5.2", 844 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", 845 | "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", 846 | "dev": true 847 | }, 848 | "uri-js": { 849 | "version": "4.2.2", 850 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 851 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 852 | "dev": true, 853 | "requires": { 854 | "punycode": "^2.1.0" 855 | } 856 | }, 857 | "url-parse": { 858 | "version": "1.4.7", 859 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", 860 | "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", 861 | "dev": true, 862 | "requires": { 863 | "querystringify": "^2.1.1", 864 | "requires-port": "^1.0.0" 865 | } 866 | }, 867 | "uuid": { 868 | "version": "3.3.2", 869 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 870 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 871 | "dev": true 872 | }, 873 | "verror": { 874 | "version": "1.10.0", 875 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 876 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 877 | "dev": true, 878 | "requires": { 879 | "assert-plus": "^1.0.0", 880 | "core-util-is": "1.0.2", 881 | "extsprintf": "^1.2.0" 882 | } 883 | }, 884 | "vscode": { 885 | "version": "1.1.34", 886 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.34.tgz", 887 | "integrity": "sha512-GuT3tCT2N5Qp26VG4C+iGmWMgg/MuqtY5G5TSOT3U/X6pgjM9LFulJEeqpyf6gdzpI4VyU3ZN/lWPo54UFPuQg==", 888 | "dev": true, 889 | "requires": { 890 | "glob": "^7.1.2", 891 | "mocha": "^4.0.1", 892 | "request": "^2.88.0", 893 | "semver": "^5.4.1", 894 | "source-map-support": "^0.5.0", 895 | "url-parse": "^1.4.4", 896 | "vscode-test": "^0.4.1" 897 | } 898 | }, 899 | "vscode-test": { 900 | "version": "0.4.3", 901 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 902 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 903 | "dev": true, 904 | "requires": { 905 | "http-proxy-agent": "^2.1.0", 906 | "https-proxy-agent": "^2.2.1" 907 | } 908 | }, 909 | "wrappy": { 910 | "version": "1.0.2", 911 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 912 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 913 | "dev": true 914 | } 915 | } 916 | } 917 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "integrated-stackoverflow", 3 | "displayName": "Integrated Stackoverflow", 4 | "description": "Get stackoverflow answers right into your text editor and search for solutions easily", 5 | "version": "1.0.1", 6 | "publisher": "saurabh", 7 | "author": { 8 | "name": "saurabhdaware" 9 | }, 10 | "icon": "ui/logo-512.png", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/saurabhdaware/vscode-integrated-stackoverflow.git" 14 | }, 15 | "license": "MIT", 16 | "homepage": "https://github.com/saurabhdaware/vscode-integrated-stackoverflow/blob/master/README.md", 17 | "bugs": { 18 | "url": "https://github.com/saurabhdaware/vscode-integrated-stackoverflow/issues", 19 | "email": "saurabhdaware99@gmail.com" 20 | }, 21 | "keywords": [ 22 | "Stackoverflow", 23 | "Integrated Stackoverflow", 24 | "Search Bugs", 25 | "Bugs", 26 | "Stackoverflow answers" 27 | ], 28 | "engines": { 29 | "vscode": "^1.35.0" 30 | }, 31 | "categories": [ 32 | "Other" 33 | ], 34 | "activationEvents": [ 35 | "onCommand:extension.soView" 36 | ], 37 | "main": "./out/extension.js", 38 | "contributes": { 39 | "keybindings":[ 40 | { 41 | "command": "extension.soView", 42 | "key": "ctrl+k s" 43 | } 44 | ], 45 | "commands": [ 46 | { 47 | "command": "extension.soView", 48 | "title": "Open StackOverflow Search" 49 | } 50 | ] 51 | }, 52 | "scripts": { 53 | "vscode:prepublish": "npm run compile", 54 | "compile": "tsc -p ./", 55 | "watch": "tsc -watch -p ./", 56 | "postinstall": "node ./node_modules/vscode/bin/install", 57 | "test": "npm run compile && node ./node_modules/vscode/bin/test" 58 | }, 59 | "devDependencies": { 60 | "typescript": "^3.3.1", 61 | "vscode": "^1.1.28", 62 | "tslint": "^5.12.1", 63 | "@types/node": "^10.12.21", 64 | "@types/mocha": "^2.2.42" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /screenshots/ss1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saurabhdaware/vscode-integrated-stackoverflow/84ae45610d950430176ea0fca032b55308e8cc72/screenshots/ss1.png -------------------------------------------------------------------------------- /screenshots/vid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saurabhdaware/vscode-integrated-stackoverflow/84ae45610d950430176ea0fca032b55308e8cc72/screenshots/vid.gif -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | // The module 'vscode' contains the VS Code extensibility API 2 | // Import the module and reference it with the alias vscode in your code below 3 | import * as vscode from 'vscode'; 4 | import {getHtmlContent} from './webview'; 5 | // this method is called when your extension is activated 6 | // your extension is activated the very first time the command is executed 7 | export function activate(context: vscode.ExtensionContext) { 8 | let stackOverdlowView = vscode.commands.registerCommand('extension.soView',() => { 9 | // Gotta play with this API :) 10 | // https://api.stackexchange.com/2.2/search/advanced?order=desc&sort=relevance&q=get+date+in+javascript&answers=1&site=stackoverflow 11 | // Create and show panel 12 | const panel = vscode.window.createWebviewPanel( 13 | 'stackOverflow', 14 | 'StackOverflow View', 15 | vscode.ViewColumn.Two, 16 | { 17 | enableScripts: true 18 | } 19 | ); 20 | 21 | // And set its HTML content 22 | panel.webview.html = getHtmlContent(); 23 | }) 24 | context.subscriptions.push(stackOverdlowView); 25 | 26 | let disposable = vscode.commands.registerCommand('extension.helloWorld', () => { 27 | // The code you place here will be executed every time your command is executed 28 | 29 | // Display a message box to the user 30 | vscode.window.showInformationMessage('Hello World!'); 31 | }); 32 | context.subscriptions.push(disposable); 33 | } 34 | 35 | // this method is called when your extension is deactivated 36 | export function deactivate() {} 37 | -------------------------------------------------------------------------------- /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(testsRoot: string, clb: (error: Error, failures?: number) => void): void 9 | // that the extension 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 configuring the test runner below 16 | // See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options 17 | // for more info 18 | testRunner.configure({ 19 | ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) 20 | useColors: true // colored output from test results 21 | }); 22 | 23 | module.exports = testRunner; -------------------------------------------------------------------------------- /src/webview.ts: -------------------------------------------------------------------------------- 1 | // I've only included HTML in this and CSS and JS files are linked externally 2 | // If you are here to contribute to the UI just edit the files in /ui folder and test it from index.html and then create a pull request 3 | // I will take the files from ui folder and will host it over cdn 4 | const html = ` 5 | 6 | 7 | 8 | 9 | 10 | Integrated Stackoverflow Search 11 | 12 | 13 | 14 | 19 | 20 | 21 |
22 | 23 |
24 | 25 | 26 |
27 |
28 | 29 |
30 |
31 | 32 | 33 | 34 | `; 35 | 36 | 37 | export function getHtmlContent() { 38 | console.log(html); 39 | return html; 40 | } -------------------------------------------------------------------------------- /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": true /* enable all strict type-checking options */ 12 | /* Additional Checks */ 13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | ".vscode-test" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /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 | } 16 | -------------------------------------------------------------------------------- /ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Integrated Stackoverflow Search 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 |
18 |
19 | 20 |
21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /ui/logo-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saurabhdaware/vscode-integrated-stackoverflow/84ae45610d950430176ea0fca032b55308e8cc72/ui/logo-192.png -------------------------------------------------------------------------------- /ui/logo-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saurabhdaware/vscode-integrated-stackoverflow/84ae45610d950430176ea0fca032b55308e8cc72/ui/logo-512.png -------------------------------------------------------------------------------- /ui/so.js: -------------------------------------------------------------------------------- 1 | let searchbar = document.getElementById('search'); 2 | searchbar.focus(); 3 | 4 | 5 | const copyToClipboard = str => { 6 | const el = document.createElement('textarea'); 7 | el.value = str; 8 | el.setAttribute('readonly', ''); 9 | el.style.position = 'absolute'; 10 | el.style.left = '-9999px'; 11 | document.body.appendChild(el); 12 | el.select(); 13 | document.execCommand('copy'); 14 | document.body.removeChild(el); 15 | }; 16 | 17 | function renderCopyButtons(){ 18 | document.querySelectorAll('pre > code').forEach(code => { 19 | code.innerHTML += '' 20 | }) 21 | } 22 | 23 | function createAnswerCard(answers,question){ 24 | let ans = answers.slice(0,2); 25 | let cards = ''; 26 | for(let i in ans){ 27 | cards += '

Q: '+question.title+'

'+question.body+' ' + (Number(i)+1) +'
'+ ans[i].body + '
'; 28 | } 29 | return cards; 30 | } 31 | function hideAnswer(el){ 32 | document.querySelector(".answer-container-"+el.dataset.index).innerHTML = ''; 33 | el.innerHTML = 'View Answer'; 34 | el.onclick = () => viewAnswer(el); 35 | } 36 | function viewAnswer(el){ 37 | el.innerHTML = 'Loading answer'; 38 | fetch('https://api.stackexchange.com/2.2/questions/'+el.dataset.questionid+'/answers?order=desc&sort=votes&site=stackoverflow&filter=withbody') 39 | .then(response => response.json()) 40 | .then(data => { 41 | document.querySelector(".answer-container-"+el.dataset.index).innerHTML = '

Answer:

'+data.items[0].body; 42 | }) 43 | .then(() =>{ 44 | el.innerHTML = 'Hide Answer' 45 | el.onclick = () => hideAnswer(el); 46 | }) 47 | .then(renderCopyButtons); 48 | } 49 | 50 | function createQuestionsCard(questions){ 51 | let cards = '

Other Questions

'; 52 | let i = 0; 53 | for(let question of questions.slice(1)){ 54 | cards += '

'+question.title+'

'+question.body+'
'; 55 | i++; 56 | } 57 | return cards; 58 | } 59 | 60 | async function searchAnswers(){ 61 | if(!searchbar.value){ 62 | if(searchbar.placeholder !== 'Search for your error..'){ 63 | searchbar.value = searchbar.placeholder; 64 | }else{ 65 | searchbar.value = ''; 66 | } 67 | } 68 | document.getElementById("answers").innerHTML = ''; 69 | let searchQuery = document.querySelector('input#search').value; 70 | searchQuery = searchQuery.trim().replace(/ /g,'+'); 71 | let data = await fetch('https://api.stackexchange.com/2.2/search/advanced?order=desc&sort=relevance&q='+searchQuery+'&answers=1&site=stackoverflow&filter=withbody') 72 | let questions = (await data.json()).items; 73 | 74 | questions = questions.map(question => ({title:question.title,link:question.link,id:question.question_id,body:question.body})); 75 | fetch('https://api.stackexchange.com/2.2/questions/'+questions[0].id+'/answers?order=desc&sort=votes&site=stackoverflow&filter=withbody') 76 | .then(response => response.json()) 77 | .then(data => { 78 | console.log(data.items); 79 | document.getElementById("answers").innerHTML += createAnswerCard(data.items,questions[0]); 80 | }) 81 | .then(() => { 82 | document.getElementById("answers").innerHTML += createQuestionsCard(questions); 83 | }) 84 | .then(renderCopyButtons); 85 | 86 | } 87 | 88 | 89 | window.addEventListener('keyup', (e) => { 90 | if (e.keyCode === 13) { 91 | searchAnswers(); 92 | } 93 | }, false); 94 | 95 | document.querySelector('.search-button').addEventListener('click',searchAnswers); -------------------------------------------------------------------------------- /ui/style.css: -------------------------------------------------------------------------------- 1 | body{ 2 | color:#ddd; 3 | font-family: 'Roboto Condensed', sans-serif; 4 | } 5 | button{ 6 | border:none; 7 | background-color:#999; 8 | color:#111; 9 | padding:5px 7px; 10 | font-weight:bold; 11 | cursor: pointer; 12 | } 13 | a{ 14 | color:#09f; 15 | opacity:.7; 16 | text-decoration:none; 17 | border-bottom:1px solid #09f; 18 | } 19 | pre{ 20 | background-color:#22222299; 21 | color:#aaa !important; 22 | display:block; 23 | position:relative; 24 | } 25 | pre > code{ 26 | color:#999 !important; 27 | display:block; 28 | overflow-x:scroll; 29 | padding:10px; 30 | font-family: 'Roboto Condensed', sans-serif !important; 31 | } 32 | code{ 33 | font-family: 'Roboto Condensed', sans-serif; 34 | } 35 | ::-webkit-scrollbar{width:1px;height:1px;} 36 | ::-webkit-scrollbar-thumb{background-color:#09f;} 37 | h2{ 38 | color:#09f; 39 | } 40 | .shadow{ 41 | box-shadow: 0 8px 6px -6px black; 42 | } 43 | .card{ 44 | background-color:#111; 45 | color:#fff; 46 | margin:20px 0px; 47 | position:relative; 48 | border:1px solid #000; 49 | } 50 | .content-220499{ 51 | position: absolute; 52 | top:0;right:0; 53 | background-color:#09f; 54 | color:#fff; 55 | border:none; 56 | font-size:9pt; 57 | box-shadow:-3px 3px 10px 1px #111; 58 | } 59 | .blue-button{ 60 | background-color: #09f; 61 | color:#fff; 62 | outline:none !important; 63 | } 64 | input{ 65 | outline:none !important; 66 | font-family: 'Roboto Condensed', sans-serif !important; 67 | } 68 | .pad-20{ 69 | padding:20px; 70 | } 71 | .question-wrapper{ 72 | background-color:#13141d; 73 | padding:20px; 74 | } 75 | .question-wrapper pre > code{ 76 | background-color:#222; 77 | } -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | 5 | * This folder contains all of the files necessary for your extension. 6 | * `package.json` - this is the manifest file in which you declare your extension and command. 7 | * The sample plugin registers a command and defines its title and command name. With this information 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 activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 10 | * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. 11 | 12 | ## Get up and running straight away 13 | 14 | * Press `F5` to open a new window with your extension loaded. 15 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 16 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 17 | * Find output from your extension in the debug console. 18 | 19 | ## Make changes 20 | 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 | 26 | * You can open the full set of our API when you open the file `node_modules/vscode/vscode.d.ts`. 27 | 28 | ## Run tests 29 | 30 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. 31 | * Press `F5` to run the tests in a new window with your extension loaded. 32 | * See the output of the test result in the debug console. 33 | * Make changes to `test/extension.test.ts` or create new test files inside the `test` folder. 34 | * By convention, the test runner will only consider files matching the name pattern `**.test.ts`. 35 | * You can create folders inside the `test` folder to structure your tests any way you want. 36 | 37 | ## Go further 38 | 39 | * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/testing-extension). 40 | * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. 41 | * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). 42 | --------------------------------------------------------------------------------