├── .gitattributes ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── README.md ├── package-lock.json ├── package.json ├── preview.png ├── src └── extension.ts ├── tsconfig.json └── tslint.json /.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 | -------------------------------------------------------------------------------- /.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 | } 23 | -------------------------------------------------------------------------------- /.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 "fibonacci-indent" 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 | ## [4.4.8] 7 | - Initial release. I prefer tab width of 4, so my indent is usually 4, 4, 8, 12, 20, 32... Hence the version number. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | fibonacci-indent 2 | ================ 3 | 4 | A Visual Studio Code plugin that helps you indent code according to the Fibonacci sequence. 5 | The first 2 numbers of the sequence will be your tab size. 6 | 7 | ![vscode-fibonacci-indent](https://github.com/inoric/vscode-fibonacci-indent/blob/master/preview.png "vscode-fibonacci-indent") 8 | 9 | ## How it works 10 | 11 | It binds itself to the `tab` key and adds enough indent so it matches the next number in Fibonacci sequence. 12 | It also detects autoindent on newline and tries to fix that. 13 | 14 | I honestly don't like this approach but it seemed to be the only way I could achieve this. If someone has a better idea I'll be really happy. 15 | 16 | ## TODO 17 | 18 | - Fix indenting multiple lines at once 19 | - Somehow get the format document command to follow this without overriding other language rules. 20 | - Stop myself from writing stupid extensions for a chuckle 21 | 22 | ## Idea 23 | 24 | Some Twitter screenshot on Reddit... can't remember which one is the first I saw. -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fibonacci-indent", 3 | "version": "4.4.8", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.9.0", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", 19 | "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.9.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 25 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.9.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@types/mocha": { 34 | "version": "7.0.2", 35 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", 36 | "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", 37 | "dev": true 38 | }, 39 | "@types/node": { 40 | "version": "13.11.0", 41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", 42 | "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", 43 | "dev": true 44 | }, 45 | "agent-base": { 46 | "version": "4.3.0", 47 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 48 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 49 | "dev": true, 50 | "requires": { 51 | "es6-promisify": "^5.0.0" 52 | } 53 | }, 54 | "ajv": { 55 | "version": "6.12.0", 56 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 57 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 58 | "dev": true, 59 | "requires": { 60 | "fast-deep-equal": "^3.1.1", 61 | "fast-json-stable-stringify": "^2.0.0", 62 | "json-schema-traverse": "^0.4.1", 63 | "uri-js": "^4.2.2" 64 | } 65 | }, 66 | "ansi-styles": { 67 | "version": "3.2.1", 68 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 69 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 70 | "dev": true, 71 | "requires": { 72 | "color-convert": "^1.9.0" 73 | } 74 | }, 75 | "argparse": { 76 | "version": "1.0.10", 77 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 78 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 79 | "dev": true, 80 | "requires": { 81 | "sprintf-js": "~1.0.2" 82 | } 83 | }, 84 | "asn1": { 85 | "version": "0.2.4", 86 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 87 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 88 | "dev": true, 89 | "requires": { 90 | "safer-buffer": "~2.1.0" 91 | } 92 | }, 93 | "assert-plus": { 94 | "version": "1.0.0", 95 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 96 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 97 | "dev": true 98 | }, 99 | "asynckit": { 100 | "version": "0.4.0", 101 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 102 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 103 | "dev": true 104 | }, 105 | "aws-sign2": { 106 | "version": "0.7.0", 107 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 108 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 109 | "dev": true 110 | }, 111 | "aws4": { 112 | "version": "1.9.1", 113 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", 114 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", 115 | "dev": true 116 | }, 117 | "balanced-match": { 118 | "version": "1.0.0", 119 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 120 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 121 | "dev": true 122 | }, 123 | "bcrypt-pbkdf": { 124 | "version": "1.0.2", 125 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 126 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 127 | "dev": true, 128 | "requires": { 129 | "tweetnacl": "^0.14.3" 130 | } 131 | }, 132 | "brace-expansion": { 133 | "version": "1.1.11", 134 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 135 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 136 | "dev": true, 137 | "requires": { 138 | "balanced-match": "^1.0.0", 139 | "concat-map": "0.0.1" 140 | } 141 | }, 142 | "browser-stdout": { 143 | "version": "1.3.1", 144 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 145 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 146 | "dev": true 147 | }, 148 | "buffer-from": { 149 | "version": "1.1.1", 150 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 151 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 152 | "dev": true 153 | }, 154 | "builtin-modules": { 155 | "version": "1.1.1", 156 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 157 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 158 | "dev": true 159 | }, 160 | "caseless": { 161 | "version": "0.12.0", 162 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 163 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 164 | "dev": true 165 | }, 166 | "chalk": { 167 | "version": "2.4.2", 168 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 169 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 170 | "dev": true, 171 | "requires": { 172 | "ansi-styles": "^3.2.1", 173 | "escape-string-regexp": "^1.0.5", 174 | "supports-color": "^5.3.0" 175 | } 176 | }, 177 | "color-convert": { 178 | "version": "1.9.3", 179 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 180 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 181 | "dev": true, 182 | "requires": { 183 | "color-name": "1.1.3" 184 | } 185 | }, 186 | "color-name": { 187 | "version": "1.1.3", 188 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 189 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 190 | "dev": true 191 | }, 192 | "combined-stream": { 193 | "version": "1.0.8", 194 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 195 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 196 | "dev": true, 197 | "requires": { 198 | "delayed-stream": "~1.0.0" 199 | } 200 | }, 201 | "commander": { 202 | "version": "2.20.3", 203 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 204 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 205 | "dev": true 206 | }, 207 | "concat-map": { 208 | "version": "0.0.1", 209 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 210 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 211 | "dev": true 212 | }, 213 | "core-util-is": { 214 | "version": "1.0.2", 215 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 216 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 217 | "dev": true 218 | }, 219 | "dashdash": { 220 | "version": "1.14.1", 221 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 222 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 223 | "dev": true, 224 | "requires": { 225 | "assert-plus": "^1.0.0" 226 | } 227 | }, 228 | "debug": { 229 | "version": "3.1.0", 230 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 231 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 232 | "dev": true, 233 | "requires": { 234 | "ms": "2.0.0" 235 | } 236 | }, 237 | "delayed-stream": { 238 | "version": "1.0.0", 239 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 240 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 241 | "dev": true 242 | }, 243 | "diff": { 244 | "version": "4.0.2", 245 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 246 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 247 | "dev": true 248 | }, 249 | "ecc-jsbn": { 250 | "version": "0.1.2", 251 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 252 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 253 | "dev": true, 254 | "requires": { 255 | "jsbn": "~0.1.0", 256 | "safer-buffer": "^2.1.0" 257 | } 258 | }, 259 | "es6-promise": { 260 | "version": "4.2.8", 261 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 262 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 263 | "dev": true 264 | }, 265 | "es6-promisify": { 266 | "version": "5.0.0", 267 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 268 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 269 | "dev": true, 270 | "requires": { 271 | "es6-promise": "^4.0.3" 272 | } 273 | }, 274 | "escape-string-regexp": { 275 | "version": "1.0.5", 276 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 277 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 278 | "dev": true 279 | }, 280 | "esprima": { 281 | "version": "4.0.1", 282 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 283 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 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": "3.1.1", 300 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 301 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 302 | "dev": true 303 | }, 304 | "fast-json-stable-stringify": { 305 | "version": "2.1.0", 306 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 307 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 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.6", 344 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 345 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 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.5", 358 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 359 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 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.4", 413 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 414 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 415 | "dev": true, 416 | "requires": { 417 | "agent-base": "^4.3.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.4", 433 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 434 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 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.43.0", 503 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 504 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", 505 | "dev": true 506 | }, 507 | "mime-types": { 508 | "version": "2.1.26", 509 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 510 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 511 | "dev": true, 512 | "requires": { 513 | "mime-db": "1.43.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": "1.2.5", 527 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 528 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 529 | "dev": true 530 | }, 531 | "mkdirp": { 532 | "version": "0.5.5", 533 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 534 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 535 | "dev": true, 536 | "requires": { 537 | "minimist": "^1.2.5" 538 | } 539 | }, 540 | "mocha": { 541 | "version": "5.2.0", 542 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 543 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 544 | "dev": true, 545 | "requires": { 546 | "browser-stdout": "1.3.1", 547 | "commander": "2.15.1", 548 | "debug": "3.1.0", 549 | "diff": "3.5.0", 550 | "escape-string-regexp": "1.0.5", 551 | "glob": "7.1.2", 552 | "growl": "1.10.5", 553 | "he": "1.1.1", 554 | "minimatch": "3.0.4", 555 | "mkdirp": "0.5.1", 556 | "supports-color": "5.4.0" 557 | }, 558 | "dependencies": { 559 | "commander": { 560 | "version": "2.15.1", 561 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 562 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 563 | "dev": true 564 | }, 565 | "diff": { 566 | "version": "3.5.0", 567 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 568 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 569 | "dev": true 570 | }, 571 | "glob": { 572 | "version": "7.1.2", 573 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 574 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 575 | "dev": true, 576 | "requires": { 577 | "fs.realpath": "^1.0.0", 578 | "inflight": "^1.0.4", 579 | "inherits": "2", 580 | "minimatch": "^3.0.4", 581 | "once": "^1.3.0", 582 | "path-is-absolute": "^1.0.0" 583 | } 584 | }, 585 | "minimist": { 586 | "version": "0.0.8", 587 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 588 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 589 | "dev": true 590 | }, 591 | "mkdirp": { 592 | "version": "0.5.1", 593 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 594 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 595 | "dev": true, 596 | "requires": { 597 | "minimist": "0.0.8" 598 | } 599 | }, 600 | "supports-color": { 601 | "version": "5.4.0", 602 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 603 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 604 | "dev": true, 605 | "requires": { 606 | "has-flag": "^3.0.0" 607 | } 608 | } 609 | } 610 | }, 611 | "ms": { 612 | "version": "2.0.0", 613 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 614 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 615 | "dev": true 616 | }, 617 | "oauth-sign": { 618 | "version": "0.9.0", 619 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 620 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 621 | "dev": true 622 | }, 623 | "once": { 624 | "version": "1.4.0", 625 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 626 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 627 | "dev": true, 628 | "requires": { 629 | "wrappy": "1" 630 | } 631 | }, 632 | "path-is-absolute": { 633 | "version": "1.0.1", 634 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 635 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 636 | "dev": true 637 | }, 638 | "path-parse": { 639 | "version": "1.0.6", 640 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 641 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 642 | "dev": true 643 | }, 644 | "performance-now": { 645 | "version": "2.1.0", 646 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 647 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 648 | "dev": true 649 | }, 650 | "psl": { 651 | "version": "1.8.0", 652 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 653 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 654 | "dev": true 655 | }, 656 | "punycode": { 657 | "version": "2.1.1", 658 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 659 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 660 | "dev": true 661 | }, 662 | "qs": { 663 | "version": "6.5.2", 664 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 665 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 666 | "dev": true 667 | }, 668 | "querystringify": { 669 | "version": "2.1.1", 670 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", 671 | "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", 672 | "dev": true 673 | }, 674 | "request": { 675 | "version": "2.88.2", 676 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 677 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 678 | "dev": true, 679 | "requires": { 680 | "aws-sign2": "~0.7.0", 681 | "aws4": "^1.8.0", 682 | "caseless": "~0.12.0", 683 | "combined-stream": "~1.0.6", 684 | "extend": "~3.0.2", 685 | "forever-agent": "~0.6.1", 686 | "form-data": "~2.3.2", 687 | "har-validator": "~5.1.3", 688 | "http-signature": "~1.2.0", 689 | "is-typedarray": "~1.0.0", 690 | "isstream": "~0.1.2", 691 | "json-stringify-safe": "~5.0.1", 692 | "mime-types": "~2.1.19", 693 | "oauth-sign": "~0.9.0", 694 | "performance-now": "^2.1.0", 695 | "qs": "~6.5.2", 696 | "safe-buffer": "^5.1.2", 697 | "tough-cookie": "~2.5.0", 698 | "tunnel-agent": "^0.6.0", 699 | "uuid": "^3.3.2" 700 | } 701 | }, 702 | "requires-port": { 703 | "version": "1.0.0", 704 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 705 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 706 | "dev": true 707 | }, 708 | "resolve": { 709 | "version": "1.15.1", 710 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 711 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 712 | "dev": true, 713 | "requires": { 714 | "path-parse": "^1.0.6" 715 | } 716 | }, 717 | "safe-buffer": { 718 | "version": "5.2.0", 719 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 720 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 721 | "dev": true 722 | }, 723 | "safer-buffer": { 724 | "version": "2.1.2", 725 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 726 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 727 | "dev": true 728 | }, 729 | "semver": { 730 | "version": "5.7.1", 731 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 732 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 733 | "dev": true 734 | }, 735 | "source-map": { 736 | "version": "0.6.1", 737 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 738 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 739 | "dev": true 740 | }, 741 | "source-map-support": { 742 | "version": "0.5.16", 743 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 744 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 745 | "dev": true, 746 | "requires": { 747 | "buffer-from": "^1.0.0", 748 | "source-map": "^0.6.0" 749 | } 750 | }, 751 | "sprintf-js": { 752 | "version": "1.0.3", 753 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 754 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 755 | "dev": true 756 | }, 757 | "sshpk": { 758 | "version": "1.16.1", 759 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 760 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 761 | "dev": true, 762 | "requires": { 763 | "asn1": "~0.2.3", 764 | "assert-plus": "^1.0.0", 765 | "bcrypt-pbkdf": "^1.0.0", 766 | "dashdash": "^1.12.0", 767 | "ecc-jsbn": "~0.1.1", 768 | "getpass": "^0.1.1", 769 | "jsbn": "~0.1.0", 770 | "safer-buffer": "^2.0.2", 771 | "tweetnacl": "~0.14.0" 772 | } 773 | }, 774 | "supports-color": { 775 | "version": "5.5.0", 776 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 777 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 778 | "dev": true, 779 | "requires": { 780 | "has-flag": "^3.0.0" 781 | } 782 | }, 783 | "tough-cookie": { 784 | "version": "2.5.0", 785 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 786 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 787 | "dev": true, 788 | "requires": { 789 | "psl": "^1.1.28", 790 | "punycode": "^2.1.1" 791 | } 792 | }, 793 | "tslib": { 794 | "version": "1.11.1", 795 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 796 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", 797 | "dev": true 798 | }, 799 | "tslint": { 800 | "version": "6.1.1", 801 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.1.tgz", 802 | "integrity": "sha512-kd6AQ/IgPRpLn6g5TozqzPdGNZ0q0jtXW4//hRcj10qLYBaa3mTUU2y2MCG+RXZm8Zx+KZi0eA+YCrMyNlF4UA==", 803 | "dev": true, 804 | "requires": { 805 | "@babel/code-frame": "^7.0.0", 806 | "builtin-modules": "^1.1.1", 807 | "chalk": "^2.3.0", 808 | "commander": "^2.12.1", 809 | "diff": "^4.0.1", 810 | "glob": "^7.1.1", 811 | "js-yaml": "^3.13.1", 812 | "minimatch": "^3.0.4", 813 | "mkdirp": "^0.5.3", 814 | "resolve": "^1.3.2", 815 | "semver": "^5.3.0", 816 | "tslib": "^1.10.0", 817 | "tsutils": "^2.29.0" 818 | } 819 | }, 820 | "tsutils": { 821 | "version": "2.29.0", 822 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 823 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 824 | "dev": true, 825 | "requires": { 826 | "tslib": "^1.8.1" 827 | } 828 | }, 829 | "tunnel-agent": { 830 | "version": "0.6.0", 831 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 832 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 833 | "dev": true, 834 | "requires": { 835 | "safe-buffer": "^5.0.1" 836 | } 837 | }, 838 | "tweetnacl": { 839 | "version": "0.14.5", 840 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 841 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 842 | "dev": true 843 | }, 844 | "typescript": { 845 | "version": "3.8.3", 846 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 847 | "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 848 | "dev": true 849 | }, 850 | "uri-js": { 851 | "version": "4.2.2", 852 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 853 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 854 | "dev": true, 855 | "requires": { 856 | "punycode": "^2.1.0" 857 | } 858 | }, 859 | "url-parse": { 860 | "version": "1.4.7", 861 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", 862 | "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", 863 | "dev": true, 864 | "requires": { 865 | "querystringify": "^2.1.1", 866 | "requires-port": "^1.0.0" 867 | } 868 | }, 869 | "uuid": { 870 | "version": "3.4.0", 871 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 872 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 873 | "dev": true 874 | }, 875 | "verror": { 876 | "version": "1.10.0", 877 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 878 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 879 | "dev": true, 880 | "requires": { 881 | "assert-plus": "^1.0.0", 882 | "core-util-is": "1.0.2", 883 | "extsprintf": "^1.2.0" 884 | } 885 | }, 886 | "vscode": { 887 | "version": "1.1.36", 888 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.36.tgz", 889 | "integrity": "sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ==", 890 | "dev": true, 891 | "requires": { 892 | "glob": "^7.1.2", 893 | "mocha": "^5.2.0", 894 | "request": "^2.88.0", 895 | "semver": "^5.4.1", 896 | "source-map-support": "^0.5.0", 897 | "url-parse": "^1.4.4", 898 | "vscode-test": "^0.4.1" 899 | } 900 | }, 901 | "vscode-test": { 902 | "version": "0.4.3", 903 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 904 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 905 | "dev": true, 906 | "requires": { 907 | "http-proxy-agent": "^2.1.0", 908 | "https-proxy-agent": "^2.2.1" 909 | } 910 | }, 911 | "wrappy": { 912 | "version": "1.0.2", 913 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 914 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 915 | "dev": true 916 | } 917 | } 918 | } 919 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fibonacci-indent", 3 | "displayName": "Fibonacci Indent", 4 | "description": "Indent according to fibonacci sequence - the next indent level is the sum of previous 2.", 5 | "version": "4.4.8", 6 | "publisher": "inoric", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/inoric/vscode-fibonacci-indent.git" 10 | }, 11 | "engines": { 12 | "vscode": "^1.26.0" 13 | }, 14 | "categories": [ 15 | "Other" 16 | ], 17 | "activationEvents": [ 18 | "*" 19 | ], 20 | "main": "./out/extension", 21 | "contributes": { 22 | "keybindings": [ 23 | { 24 | "command": "extension.fibonacciIndent", 25 | "key": "tab", 26 | "mac": "tab", 27 | "when": "editorTextFocus" 28 | } 29 | ] 30 | }, 31 | "scripts": { 32 | "vscode:prepublish": "npm run compile", 33 | "compile": "tsc -p ./", 34 | "watch": "tsc -watch -p ./", 35 | "postinstall": "node ./node_modules/vscode/bin/install" 36 | }, 37 | "devDependencies": { 38 | "@types/mocha": "^7.0.2", 39 | "@types/node": "^13.11.0", 40 | "tslint": "^6.1.1", 41 | "typescript": "^3.8.3", 42 | "vscode": "^1.1.36" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inoric/vscode-fibonacci-indent/e92f15b38200efbf80b22f607056ffc0e6cc8da6/preview.png -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { 4 | ExtensionContext, 5 | TextEditor, 6 | TextEditorEdit, 7 | workspace, 8 | Range, 9 | Position, 10 | Selection, 11 | window, 12 | commands 13 | } from 'vscode'; 14 | 15 | function firstPosition(positionA: Position, positionB: Position): Position { 16 | if (positionA.line === positionB.line) { 17 | return positionA.character <= positionB.character ? positionA : positionB; 18 | } else { 19 | return positionA.line <= positionB.line ? positionA : positionB; 20 | } 21 | } 22 | 23 | function getPositionFromSelection(selection: Selection): Position { 24 | return firstPosition(selection.start, selection.end); 25 | } 26 | 27 | const beginsWithWhitespace = new RegExp(/^[\t ]+$/); 28 | const changeIsAutoindented = new RegExp(/^\n[\t ]+$/m); 29 | 30 | function indent( 31 | editor: TextEditor, 32 | edit: TextEditorEdit, 33 | untilPosition: Position, 34 | addOne: boolean = true 35 | ) { 36 | const tabSize: number = workspace.getConfiguration('editor').tabSize; 37 | const lineStart = editor.document.lineAt(untilPosition.line).range.start; 38 | const textBeforeCursor = editor.document.getText( 39 | new Range(lineStart, untilPosition) 40 | ); 41 | 42 | const match = textBeforeCursor.match(beginsWithWhitespace); 43 | if (!match) { 44 | edit.insert(untilPosition, ' '.repeat(tabSize)); 45 | return; 46 | } 47 | 48 | // Count indent until cursor position 49 | let linePos = 0; 50 | let indentLength = 0; 51 | while (linePos < untilPosition.character) { 52 | const char = textBeforeCursor.charAt(linePos); 53 | if (char === '\t') { 54 | indentLength += tabSize; 55 | } else if (char === ' ') { 56 | indentLength += 1; 57 | } 58 | linePos++; 59 | } 60 | 61 | // Do the fibonacci thing until we reach the current indent level. 62 | let current = tabSize; 63 | let next = tabSize; 64 | let tmp = current + next; 65 | while (next <= indentLength) { 66 | tmp = current + next; 67 | current = next; 68 | next = tmp; 69 | } 70 | 71 | // We either fix indent to match closest fibonacci sequence number or add one level even if reached. 72 | let indentTo: number; 73 | if (!addOne && indentLength === current) { 74 | indentTo = current; 75 | } else { 76 | indentTo = next; 77 | } 78 | const indentAdd = ' '.repeat(indentTo - indentLength); 79 | edit.insert(untilPosition, indentAdd); 80 | } 81 | 82 | export function activate(context: ExtensionContext) { 83 | console.log('Fibonacci indent activated'); 84 | 85 | let activeEditor = window.activeTextEditor; 86 | window.onDidChangeActiveTextEditor(newEditor => (activeEditor = newEditor)); 87 | 88 | // Normal tab indent 89 | const indentCommand = commands.registerTextEditorCommand( 90 | 'extension.fibonacciIndent', 91 | editor => { 92 | editor.edit(edit => { 93 | editor!.selections.forEach(selection => { 94 | const position = getPositionFromSelection(selection); 95 | indent(editor, edit, position); 96 | }); 97 | }); 98 | } 99 | ); 100 | 101 | // Detect autoindent and "fix" it 102 | workspace.onDidChangeTextDocument(event => { 103 | if (!activeEditor) { 104 | return; 105 | } 106 | 107 | activeEditor.edit(edit => { 108 | event.contentChanges.forEach(change => { 109 | if (!activeEditor) { 110 | return; 111 | } 112 | if (change.text.match(changeIsAutoindented)) { 113 | const lineRange = event.document.lineAt(change.range.start.line + 1) 114 | .range; 115 | indent(activeEditor, edit, lineRange.end, false); 116 | } 117 | }); 118 | }); 119 | }); 120 | 121 | context.subscriptions.push(indentCommand); 122 | } 123 | 124 | export function deactivate() {} 125 | -------------------------------------------------------------------------------- /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 | } --------------------------------------------------------------------------------