├── .gitattributes ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── README.md ├── demo.gif ├── language-configuration.json ├── license.txt ├── package-lock.json ├── package.json ├── snippet_docs.js ├── snippets ├── audio.json ├── basics.json ├── cart_data.json ├── coroutines.json ├── graphics.json ├── input.json ├── map.json ├── math.json ├── memory.json ├── peekpoke.json └── pico8.json ├── src └── extension.ts ├── syntaxes └── lua.tmLanguage.json ├── 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 | OSSREADME.json -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "eg2.tslint" 6 | ] 7 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "npm: watch" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "npm: watch" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off" 11 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | src/** 6 | .gitignore 7 | tsconfig.json 8 | vsc-extension-quickstart.md 9 | tslint.json -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to the "pico8vscodeeditor" extension will be documented in this file. 3 | 4 | ## 0.2.3 5 | 6 | Fixed issue with paths with spaces in when launching pico8 7 | 8 | ## 0.2.2 9 | 10 | Updated readme with video demo. 11 | 12 | ## 0.2.1 13 | 14 | Fixed run and open if file was already saved. 15 | 16 | ## 0.2.0 17 | 18 | Updated run and open commands to save the current document first. 19 | 20 | ## 0.1.0 21 | 22 | Initial release. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pico-8 VSCode Plugin 2 | 3 | This plugin provides facilities for editing Pico-8 p8 files in VSCode. 4 | 5 | ![Basic plugin demo](https://github.com/grumpydev/pico8vscodeeditor/blob/master/demo.gif?raw=true) 6 | 7 | ## Features 8 | 9 | Currently the plugin provides the following features: 10 | 11 | * Enables LUA syntax highlighting (based off the latest base LUA language plugin) 12 | * Basic LUA language snippets for loops etc. 13 | * Pico-8 API snippets for the (hopefully) whole Pico-8 API 14 | * Additional Pico-8 helper snippets such as: 15 | * Creating new carts 16 | * Helpful "enumerations" for input and colours 17 | * Memory locations/GPIO 18 | * Launching Pico-8 to open or run a cartridge from within VSCode 19 | 20 | Wherever Pico-8 has an API where there are a "common" set of parameters, and less used optional ones, the snippet for the optional parameters includes the comma, so they can be quickly deleted if not needed, but you will need to type the comma if you want to use them. 21 | 22 | ## Current Snippets 23 | 24 | ### audio 25 | * music : Play music (-1 = stop) 26 | * sfx : Play sfx 27 | ### basics 28 | * for : Basic for loop 29 | * fors : For loop with step parameter 30 | * forall : For in all loop 31 | * forpair : For in all pairs loop 32 | * while : While loop 33 | * if : Basic if 34 | * iif : Inline if 35 | * ifel : If else 36 | * fun : function 37 | ### cart_data 38 | * cartdata : Open cart data (once per exection) 39 | * dget : Get number stored at index (call cartdata first) 40 | * dset : Store value at index (call cartdata first) 41 | ### coroutines 42 | * cocreate : Create a coroutine that executes the function 43 | * coresume : Resume a created coroutine, passing optional additional parameters in first time. 44 | * costatus : Get the status of a coroutine, either 'running', 'suspended', or 'dead'. 45 | * yield : Pause execution from within a coroutine. 46 | ### graphics 47 | * cam : Set camera position 48 | * circ : Draw a circle 49 | * circf : Draw a filled circle 50 | * clip : Set screen clipping region 51 | * cls : Clear the screen with the given colour 52 | * color : Sets the default drawing colour 53 | * cursor : Set the cursor position and carriage return margin 54 | * fget : Gets the sprite's flag 55 | * fset : Sets the sprite's flag 56 | * flip : Flips the screen back buffer 57 | * line : Draw a line 58 | * pal : Switch colour 0 to colour 1, set palette to 0 for draw palette (sprites etc.), or 1 for screen (fades etc.) 59 | * palt : Sets transparency on given colour to on or off 60 | * pget : Get the value of the pixel at the given coords 61 | * pset : Sets the value of the pixel at the given coords 62 | * print : Prints the string in the given colour at the given coords 63 | * rect : Draws a rectangle outline 64 | * rectfill : Draws a filled rectangle 65 | * sget : Get the spritesheet value of the pixel at the given coords 66 | * sset : Sets the spritesheet value of the pixel at the given coords 67 | * spr : Full draw sprite at given coords with given size and flip flags 68 | * sspr : Draw sprite sheet texture at given coords 69 | * fillp : Set fill pattern for circ, circfill, rect, rectfill, pset, and line (see https://seansleblanc.itch.io/pico-8-fillp-tool) 70 | ### input 71 | * btn : Get button state for given player (see pconsts for constants) 72 | * btnp : Get 'repeating' button state for given player (see pconsts for constants) 73 | * dinput : Enable pico8 devkit input for mouse and keyboard input 74 | * dkeyp : (Boolean) True when a key pressed 75 | * dkey : (String) character returned by keyboard 76 | * dmousex : Mouse X 77 | * dmousey : Mouse Y 78 | * dmousebtn : Mouse buttons bitfield 79 | * dmousewheel : Mouse wheel event 80 | ### map 81 | * map : Draw the selection of map cells at the given screen position 82 | * mget : Gets the map value of the given cell 83 | * mset : Sets the map value of the given cell 84 | ### math 85 | * abs : Abolute value 86 | * atan2 : Converts dx,dy to an angle in the range 0-1 87 | * band : Bitwise AND 88 | * bnot : Bitwise NOT 89 | * bor : Bitwise OR 90 | * bxor : Bitwise XOR 91 | * flr : Round down 92 | * round : Round number 93 | * ceil : Round up 94 | * min : Returns the lowest of the two values 95 | * max : Returns the highest of the two values 96 | * mid : Returns the max, min or middle number e.g. x=mid(min_x, x, max_x) will make sure x is between the min and max values. 97 | * srand : Set random seed for rnd 98 | * rnd : Returns a random number in the range 0-x (remember to round before using for array/sprite indexes!) 99 | * sgn : Returns sign of x e.g. -1 or 1 100 | * shl : Bitwise shift x left n times 101 | * shr : Bitwise shift x right n times 102 | * sin : Sine of x (inverted), returns a value between 0 and 1 103 | * cos : Cosine of x, returns a value between 0 and 1 104 | * sqrt : Square root of x 105 | ### memory 106 | * cstore : Copy bytes from ram to filename 107 | * memcpy : Copy memory 108 | * memset : Set memory to value from dest_address for length bytes 109 | * peek : Read byte from RAM 110 | * poke : Write byte to RAM 111 | * reload : Load a section of cartridge into RAM 112 | ### peekpoke 113 | * gpiow : Write to GPIO 114 | * gpior : Read from GPIO 115 | * memgfx : Base address for graphics (sprite sheet) memory 116 | * memgfx2 : Base address for graphics/map shared memory 117 | * memmap : Base address for map memory 118 | * memgfxprops : Base address for graphics props memory 119 | * memsong : Base address for song memory 120 | * memsfx : Base address for sfx memory 121 | * memud : Base address for user data memory 122 | * memcd : Base address for persistent cart data memory 123 | * memds : Base address for draw state memory 124 | * memhs : Base address for hardware state memory 125 | * memgpio : Base address for gpio pin memory 126 | * memscr : Base address for screen memory 127 | ### pico8 128 | * pheader : Pico8 cartridge header 129 | * game : Basic pico8 game skeleton 130 | * game30 : Basic 30fps pico8 game skeleton 131 | * pconsts : Basic pico8 constants 132 | 133 | ## Requirements 134 | 135 | * VSCode 136 | * Pico-8 137 | 138 | :) 139 | 140 | ## Extension Settings 141 | 142 | This extension contributes the following settings: 143 | 144 | * `pico8vscodeeditor.pico8fullpath`: full path, including the executable, for Pico-8 145 | * `pico8vscodeeditor.pico8additionalParameters`: any additional parameters to pass to Pico-8 when launching 146 | 147 | ## Known Issues 148 | 149 | Documentation needs more info :) 150 | 151 | ## Release Notes 152 | 153 | ### 0.2.3 154 | 155 | Fixed issue with paths with spaces in when launching pico8 156 | 157 | ### 0.2.2 158 | 159 | Updated readme with video demo. 160 | 161 | ### 0.2.1 162 | 163 | Fixed run and open if file was already saved. 164 | 165 | ### 0.2.0 166 | 167 | Updated run and open commands to save the current document first. 168 | 169 | ### 0.1.0 170 | 171 | Initial release. 172 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/grumpydev/pico8vscodeeditor/0a5a447ca7e708cc694dfb9f428d1f9dc75dd555/demo.gif -------------------------------------------------------------------------------- /language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "--", 4 | "blockComment": [ "--[[", "]]" ] 5 | }, 6 | "brackets": [ 7 | ["{", "}"], 8 | ["[", "]"], 9 | ["(", ")"] 10 | ], 11 | "autoClosingPairs": [ 12 | ["{", "}"], 13 | ["[", "]"], 14 | ["(", ")"], 15 | ["\"", "\""], 16 | ["'", "'"] 17 | ], 18 | "surroundingPairs": [ 19 | ["{", "}"], 20 | ["[", "]"], 21 | ["(", ")"], 22 | ["\"", "\""], 23 | ["'", "'"] 24 | ], 25 | "indentationRules": { 26 | "increaseIndentPattern": "((\\b(else|function|then|do|repeat)\\b((?!\\b(end|until)\\b).)*)|(\\{\\s*))$", 27 | "decreaseIndentPattern": "^\\s*((\\b(elseif|else|end|until)\\b)|(\\})|(\\)))" 28 | } 29 | } -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2018 Steven Robbins 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pico8vscodeeditor", 3 | "version": "0.2.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/mocha": { 8 | "version": "2.2.48", 9 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", 10 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", 11 | "dev": true 12 | }, 13 | "@types/node": { 14 | "version": "7.0.68", 15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.68.tgz", 16 | "integrity": "sha512-ym3LNHwJQU0XDyPrTK6NHJTH5YmGKKe0k56in6pg+Wx4HD8fiKrt8xute6/unHvHujCfzmOQTGz1NoEKgFF5Mw==", 17 | "dev": true 18 | }, 19 | "abbrev": { 20 | "version": "1.1.1", 21 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 22 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 23 | }, 24 | "ajv": { 25 | "version": "5.5.2", 26 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 27 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 28 | "dev": true, 29 | "requires": { 30 | "co": "4.6.0", 31 | "fast-deep-equal": "1.1.0", 32 | "fast-json-stable-stringify": "2.0.0", 33 | "json-schema-traverse": "0.3.1" 34 | } 35 | }, 36 | "ansi-cyan": { 37 | "version": "0.1.1", 38 | "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", 39 | "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", 40 | "dev": true, 41 | "requires": { 42 | "ansi-wrap": "0.1.0" 43 | } 44 | }, 45 | "ansi-red": { 46 | "version": "0.1.1", 47 | "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", 48 | "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", 49 | "dev": true, 50 | "requires": { 51 | "ansi-wrap": "0.1.0" 52 | } 53 | }, 54 | "ansi-regex": { 55 | "version": "2.1.1", 56 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 58 | "dev": true 59 | }, 60 | "ansi-styles": { 61 | "version": "2.2.1", 62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 64 | "dev": true 65 | }, 66 | "ansi-wrap": { 67 | "version": "0.1.0", 68 | "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", 69 | "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", 70 | "dev": true 71 | }, 72 | "argparse": { 73 | "version": "1.0.10", 74 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 75 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 76 | "dev": true, 77 | "requires": { 78 | "sprintf-js": "1.0.3" 79 | } 80 | }, 81 | "arr-diff": { 82 | "version": "1.1.0", 83 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", 84 | "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", 85 | "dev": true, 86 | "requires": { 87 | "arr-flatten": "1.1.0", 88 | "array-slice": "0.2.3" 89 | } 90 | }, 91 | "arr-flatten": { 92 | "version": "1.1.0", 93 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 94 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 95 | "dev": true 96 | }, 97 | "arr-union": { 98 | "version": "2.1.0", 99 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", 100 | "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", 101 | "dev": true 102 | }, 103 | "array-differ": { 104 | "version": "1.0.0", 105 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", 106 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", 107 | "dev": true 108 | }, 109 | "array-slice": { 110 | "version": "0.2.3", 111 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", 112 | "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", 113 | "dev": true 114 | }, 115 | "array-union": { 116 | "version": "1.0.2", 117 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 118 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 119 | "dev": true, 120 | "requires": { 121 | "array-uniq": "1.0.3" 122 | } 123 | }, 124 | "array-uniq": { 125 | "version": "1.0.3", 126 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 127 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 128 | "dev": true 129 | }, 130 | "array-unique": { 131 | "version": "0.2.1", 132 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 133 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 134 | "dev": true 135 | }, 136 | "arrify": { 137 | "version": "1.0.1", 138 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 139 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 140 | "dev": true 141 | }, 142 | "asn1": { 143 | "version": "0.2.3", 144 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 145 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", 146 | "dev": true 147 | }, 148 | "assert-plus": { 149 | "version": "1.0.0", 150 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 151 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 152 | "dev": true 153 | }, 154 | "asynckit": { 155 | "version": "0.4.0", 156 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 157 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 158 | "dev": true 159 | }, 160 | "aws-sign2": { 161 | "version": "0.7.0", 162 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 163 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 164 | "dev": true 165 | }, 166 | "aws4": { 167 | "version": "1.7.0", 168 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 169 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", 170 | "dev": true 171 | }, 172 | "babel-code-frame": { 173 | "version": "6.26.0", 174 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 175 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 176 | "dev": true, 177 | "requires": { 178 | "chalk": "1.1.3", 179 | "esutils": "2.0.2", 180 | "js-tokens": "3.0.2" 181 | }, 182 | "dependencies": { 183 | "chalk": { 184 | "version": "1.1.3", 185 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 186 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 187 | "dev": true, 188 | "requires": { 189 | "ansi-styles": "2.2.1", 190 | "escape-string-regexp": "1.0.5", 191 | "has-ansi": "2.0.0", 192 | "strip-ansi": "3.0.1", 193 | "supports-color": "2.0.0" 194 | } 195 | } 196 | } 197 | }, 198 | "balanced-match": { 199 | "version": "1.0.0", 200 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 201 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 202 | }, 203 | "bcrypt-pbkdf": { 204 | "version": "1.0.2", 205 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 206 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 207 | "dev": true, 208 | "optional": true, 209 | "requires": { 210 | "tweetnacl": "0.14.5" 211 | } 212 | }, 213 | "block-stream": { 214 | "version": "0.0.9", 215 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 216 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 217 | "dev": true, 218 | "requires": { 219 | "inherits": "2.0.3" 220 | } 221 | }, 222 | "brace-expansion": { 223 | "version": "1.1.11", 224 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 225 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 226 | "requires": { 227 | "balanced-match": "1.0.0", 228 | "concat-map": "0.0.1" 229 | } 230 | }, 231 | "braces": { 232 | "version": "1.8.5", 233 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 234 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 235 | "dev": true, 236 | "requires": { 237 | "expand-range": "1.8.2", 238 | "preserve": "0.2.0", 239 | "repeat-element": "1.1.2" 240 | } 241 | }, 242 | "browser-stdout": { 243 | "version": "1.3.0", 244 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 245 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 246 | "dev": true 247 | }, 248 | "buffer-crc32": { 249 | "version": "0.2.13", 250 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 251 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 252 | "dev": true 253 | }, 254 | "buffer-from": { 255 | "version": "1.1.1", 256 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 257 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 258 | "dev": true 259 | }, 260 | "builtin-modules": { 261 | "version": "1.1.1", 262 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 263 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 264 | "dev": true 265 | }, 266 | "caseless": { 267 | "version": "0.12.0", 268 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 269 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 270 | "dev": true 271 | }, 272 | "chalk": { 273 | "version": "2.4.1", 274 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 275 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 276 | "dev": true, 277 | "requires": { 278 | "ansi-styles": "3.2.1", 279 | "escape-string-regexp": "1.0.5", 280 | "supports-color": "5.4.0" 281 | }, 282 | "dependencies": { 283 | "ansi-styles": { 284 | "version": "3.2.1", 285 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 286 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 287 | "dev": true, 288 | "requires": { 289 | "color-convert": "1.9.2" 290 | } 291 | }, 292 | "supports-color": { 293 | "version": "5.4.0", 294 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 295 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 296 | "dev": true, 297 | "requires": { 298 | "has-flag": "3.0.0" 299 | } 300 | } 301 | } 302 | }, 303 | "clone": { 304 | "version": "0.2.0", 305 | "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", 306 | "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", 307 | "dev": true 308 | }, 309 | "clone-buffer": { 310 | "version": "1.0.0", 311 | "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", 312 | "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", 313 | "dev": true 314 | }, 315 | "clone-stats": { 316 | "version": "0.0.1", 317 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", 318 | "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", 319 | "dev": true 320 | }, 321 | "cloneable-readable": { 322 | "version": "1.1.2", 323 | "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", 324 | "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", 325 | "dev": true, 326 | "requires": { 327 | "inherits": "2.0.3", 328 | "process-nextick-args": "2.0.0", 329 | "readable-stream": "2.3.6" 330 | } 331 | }, 332 | "co": { 333 | "version": "4.6.0", 334 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 335 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 336 | "dev": true 337 | }, 338 | "color-convert": { 339 | "version": "1.9.2", 340 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", 341 | "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", 342 | "dev": true, 343 | "requires": { 344 | "color-name": "1.1.1" 345 | } 346 | }, 347 | "color-name": { 348 | "version": "1.1.1", 349 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", 350 | "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", 351 | "dev": true 352 | }, 353 | "combined-stream": { 354 | "version": "1.0.6", 355 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 356 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 357 | "dev": true, 358 | "requires": { 359 | "delayed-stream": "1.0.0" 360 | } 361 | }, 362 | "commander": { 363 | "version": "2.16.0", 364 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", 365 | "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", 366 | "dev": true 367 | }, 368 | "concat-map": { 369 | "version": "0.0.1", 370 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 371 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 372 | }, 373 | "convert-source-map": { 374 | "version": "1.5.1", 375 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", 376 | "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", 377 | "dev": true 378 | }, 379 | "core-util-is": { 380 | "version": "1.0.2", 381 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 382 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 383 | "dev": true 384 | }, 385 | "dashdash": { 386 | "version": "1.14.1", 387 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 388 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 389 | "dev": true, 390 | "requires": { 391 | "assert-plus": "1.0.0" 392 | } 393 | }, 394 | "debug": { 395 | "version": "3.1.0", 396 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 397 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 398 | "dev": true, 399 | "requires": { 400 | "ms": "2.0.0" 401 | } 402 | }, 403 | "deep-assign": { 404 | "version": "1.0.0", 405 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", 406 | "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", 407 | "dev": true, 408 | "requires": { 409 | "is-obj": "1.0.1" 410 | } 411 | }, 412 | "delayed-stream": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 415 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 416 | "dev": true 417 | }, 418 | "diff": { 419 | "version": "3.5.0", 420 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 421 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 422 | "dev": true 423 | }, 424 | "duplexer": { 425 | "version": "0.1.1", 426 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 427 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 428 | "dev": true 429 | }, 430 | "duplexify": { 431 | "version": "3.6.0", 432 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", 433 | "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", 434 | "dev": true, 435 | "requires": { 436 | "end-of-stream": "1.4.1", 437 | "inherits": "2.0.3", 438 | "readable-stream": "2.3.6", 439 | "stream-shift": "1.0.0" 440 | } 441 | }, 442 | "ecc-jsbn": { 443 | "version": "0.1.2", 444 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 445 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 446 | "dev": true, 447 | "optional": true, 448 | "requires": { 449 | "jsbn": "0.1.1", 450 | "safer-buffer": "2.1.2" 451 | } 452 | }, 453 | "end-of-stream": { 454 | "version": "1.4.1", 455 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 456 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 457 | "dev": true, 458 | "requires": { 459 | "once": "1.4.0" 460 | } 461 | }, 462 | "escape-string-regexp": { 463 | "version": "1.0.5", 464 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 465 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 466 | "dev": true 467 | }, 468 | "esprima": { 469 | "version": "4.0.1", 470 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 471 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 472 | "dev": true 473 | }, 474 | "esutils": { 475 | "version": "2.0.2", 476 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 477 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 478 | "dev": true 479 | }, 480 | "event-stream": { 481 | "version": "3.3.4", 482 | "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 483 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 484 | "dev": true, 485 | "requires": { 486 | "duplexer": "0.1.1", 487 | "from": "0.1.7", 488 | "map-stream": "0.1.0", 489 | "pause-stream": "0.0.11", 490 | "split": "0.3.3", 491 | "stream-combiner": "0.0.4", 492 | "through": "2.3.8" 493 | } 494 | }, 495 | "expand-brackets": { 496 | "version": "0.1.5", 497 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 498 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 499 | "dev": true, 500 | "requires": { 501 | "is-posix-bracket": "0.1.1" 502 | } 503 | }, 504 | "expand-range": { 505 | "version": "1.8.2", 506 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 507 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 508 | "dev": true, 509 | "requires": { 510 | "fill-range": "2.2.4" 511 | } 512 | }, 513 | "extend": { 514 | "version": "3.0.2", 515 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 516 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 517 | "dev": true 518 | }, 519 | "extend-shallow": { 520 | "version": "1.1.4", 521 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", 522 | "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", 523 | "dev": true, 524 | "requires": { 525 | "kind-of": "1.1.0" 526 | } 527 | }, 528 | "extglob": { 529 | "version": "0.3.2", 530 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 531 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 532 | "dev": true, 533 | "requires": { 534 | "is-extglob": "1.0.0" 535 | }, 536 | "dependencies": { 537 | "is-extglob": { 538 | "version": "1.0.0", 539 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 540 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 541 | "dev": true 542 | } 543 | } 544 | }, 545 | "extsprintf": { 546 | "version": "1.3.0", 547 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 548 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 549 | "dev": true 550 | }, 551 | "fast-deep-equal": { 552 | "version": "1.1.0", 553 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 554 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 555 | "dev": true 556 | }, 557 | "fast-json-stable-stringify": { 558 | "version": "2.0.0", 559 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 560 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 561 | "dev": true 562 | }, 563 | "fd-slicer": { 564 | "version": "1.1.0", 565 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 566 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 567 | "dev": true, 568 | "requires": { 569 | "pend": "1.2.0" 570 | } 571 | }, 572 | "filename-regex": { 573 | "version": "2.0.1", 574 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 575 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 576 | "dev": true 577 | }, 578 | "fill-range": { 579 | "version": "2.2.4", 580 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 581 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 582 | "dev": true, 583 | "requires": { 584 | "is-number": "2.1.0", 585 | "isobject": "2.1.0", 586 | "randomatic": "3.0.0", 587 | "repeat-element": "1.1.2", 588 | "repeat-string": "1.6.1" 589 | } 590 | }, 591 | "findup-sync": { 592 | "version": "0.3.0", 593 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 594 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 595 | "requires": { 596 | "glob": "5.0.15" 597 | }, 598 | "dependencies": { 599 | "glob": { 600 | "version": "5.0.15", 601 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 602 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 603 | "requires": { 604 | "inflight": "1.0.6", 605 | "inherits": "2.0.3", 606 | "minimatch": "3.0.4", 607 | "once": "1.4.0", 608 | "path-is-absolute": "1.0.1" 609 | } 610 | } 611 | } 612 | }, 613 | "first-chunk-stream": { 614 | "version": "1.0.0", 615 | "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", 616 | "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", 617 | "dev": true 618 | }, 619 | "for-in": { 620 | "version": "1.0.2", 621 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 622 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 623 | "dev": true 624 | }, 625 | "for-own": { 626 | "version": "0.1.5", 627 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 628 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 629 | "dev": true, 630 | "requires": { 631 | "for-in": "1.0.2" 632 | } 633 | }, 634 | "forever-agent": { 635 | "version": "0.6.1", 636 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 637 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 638 | "dev": true 639 | }, 640 | "form-data": { 641 | "version": "2.3.2", 642 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 643 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 644 | "dev": true, 645 | "requires": { 646 | "asynckit": "0.4.0", 647 | "combined-stream": "1.0.6", 648 | "mime-types": "2.1.19" 649 | } 650 | }, 651 | "from": { 652 | "version": "0.1.7", 653 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 654 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", 655 | "dev": true 656 | }, 657 | "fs.realpath": { 658 | "version": "1.0.0", 659 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 660 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 661 | "dev": true 662 | }, 663 | "fstream": { 664 | "version": "1.0.11", 665 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 666 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 667 | "dev": true, 668 | "requires": { 669 | "graceful-fs": "4.1.11", 670 | "inherits": "2.0.3", 671 | "mkdirp": "0.5.1", 672 | "rimraf": "2.6.2" 673 | } 674 | }, 675 | "getpass": { 676 | "version": "0.1.7", 677 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 678 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 679 | "dev": true, 680 | "requires": { 681 | "assert-plus": "1.0.0" 682 | } 683 | }, 684 | "glob": { 685 | "version": "7.1.2", 686 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 687 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 688 | "dev": true, 689 | "requires": { 690 | "fs.realpath": "1.0.0", 691 | "inflight": "1.0.6", 692 | "inherits": "2.0.3", 693 | "minimatch": "3.0.4", 694 | "once": "1.4.0", 695 | "path-is-absolute": "1.0.1" 696 | } 697 | }, 698 | "glob-base": { 699 | "version": "0.3.0", 700 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 701 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 702 | "dev": true, 703 | "requires": { 704 | "glob-parent": "2.0.0", 705 | "is-glob": "2.0.1" 706 | }, 707 | "dependencies": { 708 | "glob-parent": { 709 | "version": "2.0.0", 710 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 711 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 712 | "dev": true, 713 | "requires": { 714 | "is-glob": "2.0.1" 715 | } 716 | }, 717 | "is-extglob": { 718 | "version": "1.0.0", 719 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 720 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 721 | "dev": true 722 | }, 723 | "is-glob": { 724 | "version": "2.0.1", 725 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 726 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 727 | "dev": true, 728 | "requires": { 729 | "is-extglob": "1.0.0" 730 | } 731 | } 732 | } 733 | }, 734 | "glob-parent": { 735 | "version": "3.1.0", 736 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 737 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 738 | "dev": true, 739 | "requires": { 740 | "is-glob": "3.1.0", 741 | "path-dirname": "1.0.2" 742 | } 743 | }, 744 | "glob-stream": { 745 | "version": "5.3.5", 746 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", 747 | "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", 748 | "dev": true, 749 | "requires": { 750 | "extend": "3.0.2", 751 | "glob": "5.0.15", 752 | "glob-parent": "3.1.0", 753 | "micromatch": "2.3.11", 754 | "ordered-read-streams": "0.3.0", 755 | "through2": "0.6.5", 756 | "to-absolute-glob": "0.1.1", 757 | "unique-stream": "2.2.1" 758 | }, 759 | "dependencies": { 760 | "glob": { 761 | "version": "5.0.15", 762 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 763 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 764 | "dev": true, 765 | "requires": { 766 | "inflight": "1.0.6", 767 | "inherits": "2.0.3", 768 | "minimatch": "3.0.4", 769 | "once": "1.4.0", 770 | "path-is-absolute": "1.0.1" 771 | } 772 | }, 773 | "isarray": { 774 | "version": "0.0.1", 775 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 776 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 777 | "dev": true 778 | }, 779 | "readable-stream": { 780 | "version": "1.0.34", 781 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 782 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 783 | "dev": true, 784 | "requires": { 785 | "core-util-is": "1.0.2", 786 | "inherits": "2.0.3", 787 | "isarray": "0.0.1", 788 | "string_decoder": "0.10.31" 789 | } 790 | }, 791 | "string_decoder": { 792 | "version": "0.10.31", 793 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 794 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 795 | "dev": true 796 | }, 797 | "through2": { 798 | "version": "0.6.5", 799 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 800 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 801 | "dev": true, 802 | "requires": { 803 | "readable-stream": "1.0.34", 804 | "xtend": "4.0.1" 805 | } 806 | } 807 | } 808 | }, 809 | "graceful-fs": { 810 | "version": "4.1.11", 811 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 812 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 813 | "dev": true 814 | }, 815 | "growl": { 816 | "version": "1.10.3", 817 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 818 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 819 | "dev": true 820 | }, 821 | "grunt-cli": { 822 | "version": "1.2.0", 823 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", 824 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", 825 | "requires": { 826 | "findup-sync": "0.3.0", 827 | "grunt-known-options": "1.1.0", 828 | "nopt": "3.0.6", 829 | "resolve": "1.1.7" 830 | }, 831 | "dependencies": { 832 | "resolve": { 833 | "version": "1.1.7", 834 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 835 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 836 | } 837 | } 838 | }, 839 | "grunt-known-options": { 840 | "version": "1.1.0", 841 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", 842 | "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=" 843 | }, 844 | "gulp-chmod": { 845 | "version": "2.0.0", 846 | "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", 847 | "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", 848 | "dev": true, 849 | "requires": { 850 | "deep-assign": "1.0.0", 851 | "stat-mode": "0.2.2", 852 | "through2": "2.0.3" 853 | } 854 | }, 855 | "gulp-filter": { 856 | "version": "5.1.0", 857 | "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", 858 | "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", 859 | "dev": true, 860 | "requires": { 861 | "multimatch": "2.1.0", 862 | "plugin-error": "0.1.2", 863 | "streamfilter": "1.0.7" 864 | } 865 | }, 866 | "gulp-gunzip": { 867 | "version": "1.0.0", 868 | "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", 869 | "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", 870 | "dev": true, 871 | "requires": { 872 | "through2": "0.6.5", 873 | "vinyl": "0.4.6" 874 | }, 875 | "dependencies": { 876 | "isarray": { 877 | "version": "0.0.1", 878 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 879 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 880 | "dev": true 881 | }, 882 | "readable-stream": { 883 | "version": "1.0.34", 884 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 885 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 886 | "dev": true, 887 | "requires": { 888 | "core-util-is": "1.0.2", 889 | "inherits": "2.0.3", 890 | "isarray": "0.0.1", 891 | "string_decoder": "0.10.31" 892 | } 893 | }, 894 | "string_decoder": { 895 | "version": "0.10.31", 896 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 897 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 898 | "dev": true 899 | }, 900 | "through2": { 901 | "version": "0.6.5", 902 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 903 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 904 | "dev": true, 905 | "requires": { 906 | "readable-stream": "1.0.34", 907 | "xtend": "4.0.1" 908 | } 909 | } 910 | } 911 | }, 912 | "gulp-remote-src-vscode": { 913 | "version": "0.5.0", 914 | "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", 915 | "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", 916 | "dev": true, 917 | "requires": { 918 | "event-stream": "3.3.4", 919 | "node.extend": "1.1.6", 920 | "request": "2.87.0", 921 | "through2": "2.0.3", 922 | "vinyl": "2.2.0" 923 | }, 924 | "dependencies": { 925 | "clone": { 926 | "version": "2.1.1", 927 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", 928 | "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", 929 | "dev": true 930 | }, 931 | "clone-stats": { 932 | "version": "1.0.0", 933 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 934 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 935 | "dev": true 936 | }, 937 | "vinyl": { 938 | "version": "2.2.0", 939 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 940 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 941 | "dev": true, 942 | "requires": { 943 | "clone": "2.1.1", 944 | "clone-buffer": "1.0.0", 945 | "clone-stats": "1.0.0", 946 | "cloneable-readable": "1.1.2", 947 | "remove-trailing-separator": "1.1.0", 948 | "replace-ext": "1.0.0" 949 | } 950 | } 951 | } 952 | }, 953 | "gulp-sourcemaps": { 954 | "version": "1.6.0", 955 | "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", 956 | "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", 957 | "dev": true, 958 | "requires": { 959 | "convert-source-map": "1.5.1", 960 | "graceful-fs": "4.1.11", 961 | "strip-bom": "2.0.0", 962 | "through2": "2.0.3", 963 | "vinyl": "1.2.0" 964 | }, 965 | "dependencies": { 966 | "clone": { 967 | "version": "1.0.4", 968 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 969 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 970 | "dev": true 971 | }, 972 | "replace-ext": { 973 | "version": "0.0.1", 974 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 975 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 976 | "dev": true 977 | }, 978 | "vinyl": { 979 | "version": "1.2.0", 980 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 981 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 982 | "dev": true, 983 | "requires": { 984 | "clone": "1.0.4", 985 | "clone-stats": "0.0.1", 986 | "replace-ext": "0.0.1" 987 | } 988 | } 989 | } 990 | }, 991 | "gulp-symdest": { 992 | "version": "1.1.0", 993 | "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", 994 | "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", 995 | "dev": true, 996 | "requires": { 997 | "event-stream": "3.3.4", 998 | "mkdirp": "0.5.1", 999 | "queue": "3.1.0", 1000 | "vinyl-fs": "2.4.4" 1001 | } 1002 | }, 1003 | "gulp-untar": { 1004 | "version": "0.0.7", 1005 | "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", 1006 | "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", 1007 | "dev": true, 1008 | "requires": { 1009 | "event-stream": "3.3.4", 1010 | "streamifier": "0.1.1", 1011 | "tar": "2.2.1", 1012 | "through2": "2.0.3", 1013 | "vinyl": "1.2.0" 1014 | }, 1015 | "dependencies": { 1016 | "clone": { 1017 | "version": "1.0.4", 1018 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 1019 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 1020 | "dev": true 1021 | }, 1022 | "replace-ext": { 1023 | "version": "0.0.1", 1024 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 1025 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 1026 | "dev": true 1027 | }, 1028 | "vinyl": { 1029 | "version": "1.2.0", 1030 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 1031 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 1032 | "dev": true, 1033 | "requires": { 1034 | "clone": "1.0.4", 1035 | "clone-stats": "0.0.1", 1036 | "replace-ext": "0.0.1" 1037 | } 1038 | } 1039 | } 1040 | }, 1041 | "gulp-vinyl-zip": { 1042 | "version": "2.1.0", 1043 | "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", 1044 | "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", 1045 | "dev": true, 1046 | "requires": { 1047 | "event-stream": "3.3.4", 1048 | "queue": "4.4.2", 1049 | "through2": "2.0.3", 1050 | "vinyl": "2.2.0", 1051 | "vinyl-fs": "2.4.4", 1052 | "yauzl": "2.10.0", 1053 | "yazl": "2.4.3" 1054 | }, 1055 | "dependencies": { 1056 | "clone": { 1057 | "version": "2.1.1", 1058 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", 1059 | "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", 1060 | "dev": true 1061 | }, 1062 | "clone-stats": { 1063 | "version": "1.0.0", 1064 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 1065 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 1066 | "dev": true 1067 | }, 1068 | "queue": { 1069 | "version": "4.4.2", 1070 | "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", 1071 | "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", 1072 | "dev": true, 1073 | "requires": { 1074 | "inherits": "2.0.3" 1075 | } 1076 | }, 1077 | "vinyl": { 1078 | "version": "2.2.0", 1079 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 1080 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 1081 | "dev": true, 1082 | "requires": { 1083 | "clone": "2.1.1", 1084 | "clone-buffer": "1.0.0", 1085 | "clone-stats": "1.0.0", 1086 | "cloneable-readable": "1.1.2", 1087 | "remove-trailing-separator": "1.1.0", 1088 | "replace-ext": "1.0.0" 1089 | } 1090 | } 1091 | } 1092 | }, 1093 | "har-schema": { 1094 | "version": "2.0.0", 1095 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1096 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 1097 | "dev": true 1098 | }, 1099 | "har-validator": { 1100 | "version": "5.0.3", 1101 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 1102 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 1103 | "dev": true, 1104 | "requires": { 1105 | "ajv": "5.5.2", 1106 | "har-schema": "2.0.0" 1107 | } 1108 | }, 1109 | "has-ansi": { 1110 | "version": "2.0.0", 1111 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1112 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1113 | "dev": true, 1114 | "requires": { 1115 | "ansi-regex": "2.1.1" 1116 | } 1117 | }, 1118 | "has-flag": { 1119 | "version": "3.0.0", 1120 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1121 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1122 | "dev": true 1123 | }, 1124 | "he": { 1125 | "version": "1.1.1", 1126 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 1127 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 1128 | "dev": true 1129 | }, 1130 | "http-signature": { 1131 | "version": "1.2.0", 1132 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1133 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1134 | "dev": true, 1135 | "requires": { 1136 | "assert-plus": "1.0.0", 1137 | "jsprim": "1.4.1", 1138 | "sshpk": "1.14.2" 1139 | } 1140 | }, 1141 | "inflight": { 1142 | "version": "1.0.6", 1143 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1144 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1145 | "requires": { 1146 | "once": "1.4.0", 1147 | "wrappy": "1.0.2" 1148 | } 1149 | }, 1150 | "inherits": { 1151 | "version": "2.0.3", 1152 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1153 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1154 | }, 1155 | "is": { 1156 | "version": "3.2.1", 1157 | "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", 1158 | "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", 1159 | "dev": true 1160 | }, 1161 | "is-buffer": { 1162 | "version": "1.1.6", 1163 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1164 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1165 | "dev": true 1166 | }, 1167 | "is-dotfile": { 1168 | "version": "1.0.3", 1169 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1170 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 1171 | "dev": true 1172 | }, 1173 | "is-equal-shallow": { 1174 | "version": "0.1.3", 1175 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1176 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1177 | "dev": true, 1178 | "requires": { 1179 | "is-primitive": "2.0.0" 1180 | } 1181 | }, 1182 | "is-extendable": { 1183 | "version": "0.1.1", 1184 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1185 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1186 | "dev": true 1187 | }, 1188 | "is-extglob": { 1189 | "version": "2.1.1", 1190 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1191 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1192 | "dev": true 1193 | }, 1194 | "is-glob": { 1195 | "version": "3.1.0", 1196 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1197 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1198 | "dev": true, 1199 | "requires": { 1200 | "is-extglob": "2.1.1" 1201 | } 1202 | }, 1203 | "is-number": { 1204 | "version": "2.1.0", 1205 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1206 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1207 | "dev": true, 1208 | "requires": { 1209 | "kind-of": "3.2.2" 1210 | }, 1211 | "dependencies": { 1212 | "kind-of": { 1213 | "version": "3.2.2", 1214 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1215 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1216 | "dev": true, 1217 | "requires": { 1218 | "is-buffer": "1.1.6" 1219 | } 1220 | } 1221 | } 1222 | }, 1223 | "is-obj": { 1224 | "version": "1.0.1", 1225 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1226 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 1227 | "dev": true 1228 | }, 1229 | "is-posix-bracket": { 1230 | "version": "0.1.1", 1231 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1232 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 1233 | "dev": true 1234 | }, 1235 | "is-primitive": { 1236 | "version": "2.0.0", 1237 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1238 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 1239 | "dev": true 1240 | }, 1241 | "is-stream": { 1242 | "version": "1.1.0", 1243 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1244 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1245 | "dev": true 1246 | }, 1247 | "is-typedarray": { 1248 | "version": "1.0.0", 1249 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1250 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1251 | "dev": true 1252 | }, 1253 | "is-utf8": { 1254 | "version": "0.2.1", 1255 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1256 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1257 | "dev": true 1258 | }, 1259 | "is-valid-glob": { 1260 | "version": "0.3.0", 1261 | "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", 1262 | "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", 1263 | "dev": true 1264 | }, 1265 | "isarray": { 1266 | "version": "1.0.0", 1267 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1268 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1269 | "dev": true 1270 | }, 1271 | "isobject": { 1272 | "version": "2.1.0", 1273 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1274 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1275 | "dev": true, 1276 | "requires": { 1277 | "isarray": "1.0.0" 1278 | } 1279 | }, 1280 | "isstream": { 1281 | "version": "0.1.2", 1282 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1283 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1284 | "dev": true 1285 | }, 1286 | "js-tokens": { 1287 | "version": "3.0.2", 1288 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1289 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1290 | "dev": true 1291 | }, 1292 | "js-yaml": { 1293 | "version": "3.12.0", 1294 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 1295 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 1296 | "dev": true, 1297 | "requires": { 1298 | "argparse": "1.0.10", 1299 | "esprima": "4.0.1" 1300 | } 1301 | }, 1302 | "jsbn": { 1303 | "version": "0.1.1", 1304 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1305 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1306 | "dev": true, 1307 | "optional": true 1308 | }, 1309 | "json-schema": { 1310 | "version": "0.2.3", 1311 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1312 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1313 | "dev": true 1314 | }, 1315 | "json-schema-traverse": { 1316 | "version": "0.3.1", 1317 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1318 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1319 | "dev": true 1320 | }, 1321 | "json-stable-stringify": { 1322 | "version": "1.0.1", 1323 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1324 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1325 | "dev": true, 1326 | "requires": { 1327 | "jsonify": "0.0.0" 1328 | } 1329 | }, 1330 | "json-stringify-safe": { 1331 | "version": "5.0.1", 1332 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1333 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1334 | "dev": true 1335 | }, 1336 | "jsonify": { 1337 | "version": "0.0.0", 1338 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1339 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1340 | "dev": true 1341 | }, 1342 | "jsprim": { 1343 | "version": "1.4.1", 1344 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1345 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1346 | "dev": true, 1347 | "requires": { 1348 | "assert-plus": "1.0.0", 1349 | "extsprintf": "1.3.0", 1350 | "json-schema": "0.2.3", 1351 | "verror": "1.10.0" 1352 | } 1353 | }, 1354 | "kind-of": { 1355 | "version": "1.1.0", 1356 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", 1357 | "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", 1358 | "dev": true 1359 | }, 1360 | "lazystream": { 1361 | "version": "1.0.0", 1362 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 1363 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 1364 | "dev": true, 1365 | "requires": { 1366 | "readable-stream": "2.3.6" 1367 | } 1368 | }, 1369 | "lodash.isequal": { 1370 | "version": "4.5.0", 1371 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1372 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", 1373 | "dev": true 1374 | }, 1375 | "map-stream": { 1376 | "version": "0.1.0", 1377 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 1378 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", 1379 | "dev": true 1380 | }, 1381 | "math-random": { 1382 | "version": "1.0.1", 1383 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 1384 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", 1385 | "dev": true 1386 | }, 1387 | "merge-stream": { 1388 | "version": "1.0.1", 1389 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", 1390 | "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", 1391 | "dev": true, 1392 | "requires": { 1393 | "readable-stream": "2.3.6" 1394 | } 1395 | }, 1396 | "micromatch": { 1397 | "version": "2.3.11", 1398 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1399 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1400 | "dev": true, 1401 | "requires": { 1402 | "arr-diff": "2.0.0", 1403 | "array-unique": "0.2.1", 1404 | "braces": "1.8.5", 1405 | "expand-brackets": "0.1.5", 1406 | "extglob": "0.3.2", 1407 | "filename-regex": "2.0.1", 1408 | "is-extglob": "1.0.0", 1409 | "is-glob": "2.0.1", 1410 | "kind-of": "3.2.2", 1411 | "normalize-path": "2.1.1", 1412 | "object.omit": "2.0.1", 1413 | "parse-glob": "3.0.4", 1414 | "regex-cache": "0.4.4" 1415 | }, 1416 | "dependencies": { 1417 | "arr-diff": { 1418 | "version": "2.0.0", 1419 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 1420 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 1421 | "dev": true, 1422 | "requires": { 1423 | "arr-flatten": "1.1.0" 1424 | } 1425 | }, 1426 | "is-extglob": { 1427 | "version": "1.0.0", 1428 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1429 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1430 | "dev": true 1431 | }, 1432 | "is-glob": { 1433 | "version": "2.0.1", 1434 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1435 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1436 | "dev": true, 1437 | "requires": { 1438 | "is-extglob": "1.0.0" 1439 | } 1440 | }, 1441 | "kind-of": { 1442 | "version": "3.2.2", 1443 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1444 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1445 | "dev": true, 1446 | "requires": { 1447 | "is-buffer": "1.1.6" 1448 | } 1449 | } 1450 | } 1451 | }, 1452 | "mime-db": { 1453 | "version": "1.35.0", 1454 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", 1455 | "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", 1456 | "dev": true 1457 | }, 1458 | "mime-types": { 1459 | "version": "2.1.19", 1460 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", 1461 | "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", 1462 | "dev": true, 1463 | "requires": { 1464 | "mime-db": "1.35.0" 1465 | } 1466 | }, 1467 | "minimatch": { 1468 | "version": "3.0.4", 1469 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1470 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1471 | "requires": { 1472 | "brace-expansion": "1.1.11" 1473 | } 1474 | }, 1475 | "minimist": { 1476 | "version": "0.0.8", 1477 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1478 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1479 | "dev": true 1480 | }, 1481 | "mkdirp": { 1482 | "version": "0.5.1", 1483 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1484 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1485 | "dev": true, 1486 | "requires": { 1487 | "minimist": "0.0.8" 1488 | } 1489 | }, 1490 | "mocha": { 1491 | "version": "4.1.0", 1492 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", 1493 | "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", 1494 | "dev": true, 1495 | "requires": { 1496 | "browser-stdout": "1.3.0", 1497 | "commander": "2.11.0", 1498 | "debug": "3.1.0", 1499 | "diff": "3.3.1", 1500 | "escape-string-regexp": "1.0.5", 1501 | "glob": "7.1.2", 1502 | "growl": "1.10.3", 1503 | "he": "1.1.1", 1504 | "mkdirp": "0.5.1", 1505 | "supports-color": "4.4.0" 1506 | }, 1507 | "dependencies": { 1508 | "commander": { 1509 | "version": "2.11.0", 1510 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 1511 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 1512 | "dev": true 1513 | }, 1514 | "diff": { 1515 | "version": "3.3.1", 1516 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 1517 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 1518 | "dev": true 1519 | }, 1520 | "has-flag": { 1521 | "version": "2.0.0", 1522 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1523 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1524 | "dev": true 1525 | }, 1526 | "supports-color": { 1527 | "version": "4.4.0", 1528 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1529 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1530 | "dev": true, 1531 | "requires": { 1532 | "has-flag": "2.0.0" 1533 | } 1534 | } 1535 | } 1536 | }, 1537 | "ms": { 1538 | "version": "2.0.0", 1539 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1540 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1541 | "dev": true 1542 | }, 1543 | "multimatch": { 1544 | "version": "2.1.0", 1545 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", 1546 | "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", 1547 | "dev": true, 1548 | "requires": { 1549 | "array-differ": "1.0.0", 1550 | "array-union": "1.0.2", 1551 | "arrify": "1.0.1", 1552 | "minimatch": "3.0.4" 1553 | } 1554 | }, 1555 | "node.extend": { 1556 | "version": "1.1.6", 1557 | "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", 1558 | "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", 1559 | "dev": true, 1560 | "requires": { 1561 | "is": "3.2.1" 1562 | } 1563 | }, 1564 | "nopt": { 1565 | "version": "3.0.6", 1566 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1567 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1568 | "requires": { 1569 | "abbrev": "1.1.1" 1570 | } 1571 | }, 1572 | "normalize-path": { 1573 | "version": "2.1.1", 1574 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1575 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1576 | "dev": true, 1577 | "requires": { 1578 | "remove-trailing-separator": "1.1.0" 1579 | } 1580 | }, 1581 | "oauth-sign": { 1582 | "version": "0.8.2", 1583 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1584 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", 1585 | "dev": true 1586 | }, 1587 | "object-assign": { 1588 | "version": "4.1.1", 1589 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1590 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1591 | "dev": true 1592 | }, 1593 | "object.omit": { 1594 | "version": "2.0.1", 1595 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1596 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1597 | "dev": true, 1598 | "requires": { 1599 | "for-own": "0.1.5", 1600 | "is-extendable": "0.1.1" 1601 | } 1602 | }, 1603 | "once": { 1604 | "version": "1.4.0", 1605 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1606 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1607 | "requires": { 1608 | "wrappy": "1.0.2" 1609 | } 1610 | }, 1611 | "ordered-read-streams": { 1612 | "version": "0.3.0", 1613 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", 1614 | "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", 1615 | "dev": true, 1616 | "requires": { 1617 | "is-stream": "1.1.0", 1618 | "readable-stream": "2.3.6" 1619 | } 1620 | }, 1621 | "parse-glob": { 1622 | "version": "3.0.4", 1623 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1624 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1625 | "dev": true, 1626 | "requires": { 1627 | "glob-base": "0.3.0", 1628 | "is-dotfile": "1.0.3", 1629 | "is-extglob": "1.0.0", 1630 | "is-glob": "2.0.1" 1631 | }, 1632 | "dependencies": { 1633 | "is-extglob": { 1634 | "version": "1.0.0", 1635 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1636 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1637 | "dev": true 1638 | }, 1639 | "is-glob": { 1640 | "version": "2.0.1", 1641 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1642 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1643 | "dev": true, 1644 | "requires": { 1645 | "is-extglob": "1.0.0" 1646 | } 1647 | } 1648 | } 1649 | }, 1650 | "path-dirname": { 1651 | "version": "1.0.2", 1652 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1653 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", 1654 | "dev": true 1655 | }, 1656 | "path-is-absolute": { 1657 | "version": "1.0.1", 1658 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1659 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1660 | }, 1661 | "path-parse": { 1662 | "version": "1.0.5", 1663 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1664 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1665 | "dev": true 1666 | }, 1667 | "pause-stream": { 1668 | "version": "0.0.11", 1669 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 1670 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 1671 | "dev": true, 1672 | "requires": { 1673 | "through": "2.3.8" 1674 | } 1675 | }, 1676 | "pend": { 1677 | "version": "1.2.0", 1678 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1679 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1680 | "dev": true 1681 | }, 1682 | "performance-now": { 1683 | "version": "2.1.0", 1684 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1685 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1686 | "dev": true 1687 | }, 1688 | "plugin-error": { 1689 | "version": "0.1.2", 1690 | "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", 1691 | "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", 1692 | "dev": true, 1693 | "requires": { 1694 | "ansi-cyan": "0.1.1", 1695 | "ansi-red": "0.1.1", 1696 | "arr-diff": "1.1.0", 1697 | "arr-union": "2.1.0", 1698 | "extend-shallow": "1.1.4" 1699 | } 1700 | }, 1701 | "preserve": { 1702 | "version": "0.2.0", 1703 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1704 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1705 | "dev": true 1706 | }, 1707 | "process-nextick-args": { 1708 | "version": "2.0.0", 1709 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1710 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1711 | "dev": true 1712 | }, 1713 | "punycode": { 1714 | "version": "1.4.1", 1715 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1716 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1717 | "dev": true 1718 | }, 1719 | "qs": { 1720 | "version": "6.5.2", 1721 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1722 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1723 | "dev": true 1724 | }, 1725 | "querystringify": { 1726 | "version": "2.0.0", 1727 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", 1728 | "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", 1729 | "dev": true 1730 | }, 1731 | "queue": { 1732 | "version": "3.1.0", 1733 | "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", 1734 | "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", 1735 | "dev": true, 1736 | "requires": { 1737 | "inherits": "2.0.3" 1738 | } 1739 | }, 1740 | "randomatic": { 1741 | "version": "3.0.0", 1742 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", 1743 | "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", 1744 | "dev": true, 1745 | "requires": { 1746 | "is-number": "4.0.0", 1747 | "kind-of": "6.0.2", 1748 | "math-random": "1.0.1" 1749 | }, 1750 | "dependencies": { 1751 | "is-number": { 1752 | "version": "4.0.0", 1753 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 1754 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 1755 | "dev": true 1756 | }, 1757 | "kind-of": { 1758 | "version": "6.0.2", 1759 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1760 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 1761 | "dev": true 1762 | } 1763 | } 1764 | }, 1765 | "readable-stream": { 1766 | "version": "2.3.6", 1767 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1768 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1769 | "dev": true, 1770 | "requires": { 1771 | "core-util-is": "1.0.2", 1772 | "inherits": "2.0.3", 1773 | "isarray": "1.0.0", 1774 | "process-nextick-args": "2.0.0", 1775 | "safe-buffer": "5.1.2", 1776 | "string_decoder": "1.1.1", 1777 | "util-deprecate": "1.0.2" 1778 | } 1779 | }, 1780 | "regex-cache": { 1781 | "version": "0.4.4", 1782 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 1783 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 1784 | "dev": true, 1785 | "requires": { 1786 | "is-equal-shallow": "0.1.3" 1787 | } 1788 | }, 1789 | "remove-trailing-separator": { 1790 | "version": "1.1.0", 1791 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1792 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1793 | "dev": true 1794 | }, 1795 | "repeat-element": { 1796 | "version": "1.1.2", 1797 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1798 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 1799 | "dev": true 1800 | }, 1801 | "repeat-string": { 1802 | "version": "1.6.1", 1803 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1804 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1805 | "dev": true 1806 | }, 1807 | "replace-ext": { 1808 | "version": "1.0.0", 1809 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", 1810 | "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", 1811 | "dev": true 1812 | }, 1813 | "request": { 1814 | "version": "2.87.0", 1815 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", 1816 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", 1817 | "dev": true, 1818 | "requires": { 1819 | "aws-sign2": "0.7.0", 1820 | "aws4": "1.7.0", 1821 | "caseless": "0.12.0", 1822 | "combined-stream": "1.0.6", 1823 | "extend": "3.0.2", 1824 | "forever-agent": "0.6.1", 1825 | "form-data": "2.3.2", 1826 | "har-validator": "5.0.3", 1827 | "http-signature": "1.2.0", 1828 | "is-typedarray": "1.0.0", 1829 | "isstream": "0.1.2", 1830 | "json-stringify-safe": "5.0.1", 1831 | "mime-types": "2.1.19", 1832 | "oauth-sign": "0.8.2", 1833 | "performance-now": "2.1.0", 1834 | "qs": "6.5.2", 1835 | "safe-buffer": "5.1.2", 1836 | "tough-cookie": "2.3.4", 1837 | "tunnel-agent": "0.6.0", 1838 | "uuid": "3.3.2" 1839 | } 1840 | }, 1841 | "requires-port": { 1842 | "version": "1.0.0", 1843 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1844 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 1845 | "dev": true 1846 | }, 1847 | "resolve": { 1848 | "version": "1.8.1", 1849 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 1850 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 1851 | "dev": true, 1852 | "requires": { 1853 | "path-parse": "1.0.5" 1854 | } 1855 | }, 1856 | "rimraf": { 1857 | "version": "2.6.2", 1858 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1859 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1860 | "dev": true, 1861 | "requires": { 1862 | "glob": "7.1.2" 1863 | } 1864 | }, 1865 | "safe-buffer": { 1866 | "version": "5.1.2", 1867 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1868 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1869 | "dev": true 1870 | }, 1871 | "safer-buffer": { 1872 | "version": "2.1.2", 1873 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1874 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1875 | "dev": true 1876 | }, 1877 | "semver": { 1878 | "version": "5.5.0", 1879 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1880 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1881 | "dev": true 1882 | }, 1883 | "source-map": { 1884 | "version": "0.6.1", 1885 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1886 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1887 | "dev": true 1888 | }, 1889 | "source-map-support": { 1890 | "version": "0.5.6", 1891 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", 1892 | "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", 1893 | "dev": true, 1894 | "requires": { 1895 | "buffer-from": "1.1.1", 1896 | "source-map": "0.6.1" 1897 | } 1898 | }, 1899 | "split": { 1900 | "version": "0.3.3", 1901 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 1902 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 1903 | "dev": true, 1904 | "requires": { 1905 | "through": "2.3.8" 1906 | } 1907 | }, 1908 | "sprintf-js": { 1909 | "version": "1.0.3", 1910 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1911 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1912 | "dev": true 1913 | }, 1914 | "sshpk": { 1915 | "version": "1.14.2", 1916 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 1917 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 1918 | "dev": true, 1919 | "requires": { 1920 | "asn1": "0.2.3", 1921 | "assert-plus": "1.0.0", 1922 | "bcrypt-pbkdf": "1.0.2", 1923 | "dashdash": "1.14.1", 1924 | "ecc-jsbn": "0.1.2", 1925 | "getpass": "0.1.7", 1926 | "jsbn": "0.1.1", 1927 | "safer-buffer": "2.1.2", 1928 | "tweetnacl": "0.14.5" 1929 | } 1930 | }, 1931 | "stat-mode": { 1932 | "version": "0.2.2", 1933 | "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", 1934 | "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", 1935 | "dev": true 1936 | }, 1937 | "stream-combiner": { 1938 | "version": "0.0.4", 1939 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 1940 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 1941 | "dev": true, 1942 | "requires": { 1943 | "duplexer": "0.1.1" 1944 | } 1945 | }, 1946 | "stream-shift": { 1947 | "version": "1.0.0", 1948 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 1949 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", 1950 | "dev": true 1951 | }, 1952 | "streamfilter": { 1953 | "version": "1.0.7", 1954 | "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", 1955 | "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", 1956 | "dev": true, 1957 | "requires": { 1958 | "readable-stream": "2.3.6" 1959 | } 1960 | }, 1961 | "streamifier": { 1962 | "version": "0.1.1", 1963 | "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", 1964 | "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", 1965 | "dev": true 1966 | }, 1967 | "string_decoder": { 1968 | "version": "1.1.1", 1969 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1970 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1971 | "dev": true, 1972 | "requires": { 1973 | "safe-buffer": "5.1.2" 1974 | } 1975 | }, 1976 | "strip-ansi": { 1977 | "version": "3.0.1", 1978 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1979 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1980 | "dev": true, 1981 | "requires": { 1982 | "ansi-regex": "2.1.1" 1983 | } 1984 | }, 1985 | "strip-bom": { 1986 | "version": "2.0.0", 1987 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1988 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1989 | "dev": true, 1990 | "requires": { 1991 | "is-utf8": "0.2.1" 1992 | } 1993 | }, 1994 | "strip-bom-stream": { 1995 | "version": "1.0.0", 1996 | "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", 1997 | "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", 1998 | "dev": true, 1999 | "requires": { 2000 | "first-chunk-stream": "1.0.0", 2001 | "strip-bom": "2.0.0" 2002 | } 2003 | }, 2004 | "supports-color": { 2005 | "version": "2.0.0", 2006 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2007 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2008 | "dev": true 2009 | }, 2010 | "tar": { 2011 | "version": "2.2.1", 2012 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 2013 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 2014 | "dev": true, 2015 | "requires": { 2016 | "block-stream": "0.0.9", 2017 | "fstream": "1.0.11", 2018 | "inherits": "2.0.3" 2019 | } 2020 | }, 2021 | "through": { 2022 | "version": "2.3.8", 2023 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2024 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2025 | "dev": true 2026 | }, 2027 | "through2": { 2028 | "version": "2.0.3", 2029 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2030 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2031 | "dev": true, 2032 | "requires": { 2033 | "readable-stream": "2.3.6", 2034 | "xtend": "4.0.1" 2035 | } 2036 | }, 2037 | "through2-filter": { 2038 | "version": "2.0.0", 2039 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", 2040 | "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", 2041 | "dev": true, 2042 | "requires": { 2043 | "through2": "2.0.3", 2044 | "xtend": "4.0.1" 2045 | } 2046 | }, 2047 | "to-absolute-glob": { 2048 | "version": "0.1.1", 2049 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", 2050 | "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", 2051 | "dev": true, 2052 | "requires": { 2053 | "extend-shallow": "2.0.1" 2054 | }, 2055 | "dependencies": { 2056 | "extend-shallow": { 2057 | "version": "2.0.1", 2058 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2059 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2060 | "dev": true, 2061 | "requires": { 2062 | "is-extendable": "0.1.1" 2063 | } 2064 | } 2065 | } 2066 | }, 2067 | "tough-cookie": { 2068 | "version": "2.3.4", 2069 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 2070 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 2071 | "dev": true, 2072 | "requires": { 2073 | "punycode": "1.4.1" 2074 | } 2075 | }, 2076 | "tslib": { 2077 | "version": "1.9.3", 2078 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 2079 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 2080 | "dev": true 2081 | }, 2082 | "tslint": { 2083 | "version": "5.11.0", 2084 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", 2085 | "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", 2086 | "dev": true, 2087 | "requires": { 2088 | "babel-code-frame": "6.26.0", 2089 | "builtin-modules": "1.1.1", 2090 | "chalk": "2.4.1", 2091 | "commander": "2.16.0", 2092 | "diff": "3.5.0", 2093 | "glob": "7.1.2", 2094 | "js-yaml": "3.12.0", 2095 | "minimatch": "3.0.4", 2096 | "resolve": "1.8.1", 2097 | "semver": "5.5.0", 2098 | "tslib": "1.9.3", 2099 | "tsutils": "2.29.0" 2100 | } 2101 | }, 2102 | "tsutils": { 2103 | "version": "2.29.0", 2104 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 2105 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 2106 | "dev": true, 2107 | "requires": { 2108 | "tslib": "1.9.3" 2109 | } 2110 | }, 2111 | "tunnel-agent": { 2112 | "version": "0.6.0", 2113 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2114 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2115 | "dev": true, 2116 | "requires": { 2117 | "safe-buffer": "5.1.2" 2118 | } 2119 | }, 2120 | "tweetnacl": { 2121 | "version": "0.14.5", 2122 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2123 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2124 | "dev": true, 2125 | "optional": true 2126 | }, 2127 | "typescript": { 2128 | "version": "2.9.2", 2129 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", 2130 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", 2131 | "dev": true 2132 | }, 2133 | "unique-stream": { 2134 | "version": "2.2.1", 2135 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", 2136 | "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", 2137 | "dev": true, 2138 | "requires": { 2139 | "json-stable-stringify": "1.0.1", 2140 | "through2-filter": "2.0.0" 2141 | } 2142 | }, 2143 | "url-parse": { 2144 | "version": "1.4.3", 2145 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", 2146 | "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", 2147 | "dev": true, 2148 | "requires": { 2149 | "querystringify": "2.0.0", 2150 | "requires-port": "1.0.0" 2151 | } 2152 | }, 2153 | "util-deprecate": { 2154 | "version": "1.0.2", 2155 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2156 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2157 | "dev": true 2158 | }, 2159 | "uuid": { 2160 | "version": "3.3.2", 2161 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2162 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 2163 | "dev": true 2164 | }, 2165 | "vali-date": { 2166 | "version": "1.0.0", 2167 | "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", 2168 | "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", 2169 | "dev": true 2170 | }, 2171 | "verror": { 2172 | "version": "1.10.0", 2173 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2174 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2175 | "dev": true, 2176 | "requires": { 2177 | "assert-plus": "1.0.0", 2178 | "core-util-is": "1.0.2", 2179 | "extsprintf": "1.3.0" 2180 | } 2181 | }, 2182 | "vinyl": { 2183 | "version": "0.4.6", 2184 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", 2185 | "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", 2186 | "dev": true, 2187 | "requires": { 2188 | "clone": "0.2.0", 2189 | "clone-stats": "0.0.1" 2190 | } 2191 | }, 2192 | "vinyl-fs": { 2193 | "version": "2.4.4", 2194 | "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", 2195 | "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", 2196 | "dev": true, 2197 | "requires": { 2198 | "duplexify": "3.6.0", 2199 | "glob-stream": "5.3.5", 2200 | "graceful-fs": "4.1.11", 2201 | "gulp-sourcemaps": "1.6.0", 2202 | "is-valid-glob": "0.3.0", 2203 | "lazystream": "1.0.0", 2204 | "lodash.isequal": "4.5.0", 2205 | "merge-stream": "1.0.1", 2206 | "mkdirp": "0.5.1", 2207 | "object-assign": "4.1.1", 2208 | "readable-stream": "2.3.6", 2209 | "strip-bom": "2.0.0", 2210 | "strip-bom-stream": "1.0.0", 2211 | "through2": "2.0.3", 2212 | "through2-filter": "2.0.0", 2213 | "vali-date": "1.0.0", 2214 | "vinyl": "1.2.0" 2215 | }, 2216 | "dependencies": { 2217 | "clone": { 2218 | "version": "1.0.4", 2219 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 2220 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 2221 | "dev": true 2222 | }, 2223 | "replace-ext": { 2224 | "version": "0.0.1", 2225 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 2226 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 2227 | "dev": true 2228 | }, 2229 | "vinyl": { 2230 | "version": "1.2.0", 2231 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 2232 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 2233 | "dev": true, 2234 | "requires": { 2235 | "clone": "1.0.4", 2236 | "clone-stats": "0.0.1", 2237 | "replace-ext": "0.0.1" 2238 | } 2239 | } 2240 | } 2241 | }, 2242 | "vinyl-source-stream": { 2243 | "version": "1.1.2", 2244 | "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", 2245 | "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", 2246 | "dev": true, 2247 | "requires": { 2248 | "through2": "2.0.3", 2249 | "vinyl": "0.4.6" 2250 | } 2251 | }, 2252 | "vscode": { 2253 | "version": "1.1.18", 2254 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz", 2255 | "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", 2256 | "dev": true, 2257 | "requires": { 2258 | "glob": "7.1.2", 2259 | "gulp-chmod": "2.0.0", 2260 | "gulp-filter": "5.1.0", 2261 | "gulp-gunzip": "1.0.0", 2262 | "gulp-remote-src-vscode": "0.5.0", 2263 | "gulp-symdest": "1.1.0", 2264 | "gulp-untar": "0.0.7", 2265 | "gulp-vinyl-zip": "2.1.0", 2266 | "mocha": "4.1.0", 2267 | "request": "2.87.0", 2268 | "semver": "5.5.0", 2269 | "source-map-support": "0.5.6", 2270 | "url-parse": "1.4.3", 2271 | "vinyl-source-stream": "1.1.2" 2272 | } 2273 | }, 2274 | "wrappy": { 2275 | "version": "1.0.2", 2276 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2277 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2278 | }, 2279 | "xtend": { 2280 | "version": "4.0.1", 2281 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2282 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2283 | "dev": true 2284 | }, 2285 | "yauzl": { 2286 | "version": "2.10.0", 2287 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2288 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 2289 | "dev": true, 2290 | "requires": { 2291 | "buffer-crc32": "0.2.13", 2292 | "fd-slicer": "1.1.0" 2293 | } 2294 | }, 2295 | "yazl": { 2296 | "version": "2.4.3", 2297 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", 2298 | "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", 2299 | "dev": true, 2300 | "requires": { 2301 | "buffer-crc32": "0.2.13" 2302 | } 2303 | } 2304 | } 2305 | } 2306 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pico8vscodeeditor", 3 | "displayName": "pico8vscodeeditor", 4 | "description": "VSCode editor for Pico-8 .p8 files with basic lua and pico8 api snippets.", 5 | "version": "0.2.3", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/grumpydev/pico8vscodeeditor" 9 | }, 10 | "homepage": "https://github.com/grumpydev/pico8vscodeeditor", 11 | "license": "See license in license.txt", 12 | "author": { 13 | "name": "Grumpydev", 14 | "url": "https://github.com/grumpydev/" 15 | }, 16 | "publisher": "Grumpydev", 17 | "engines": { 18 | "vscode": "^1.27.0" 19 | }, 20 | "categories": [ 21 | "Snippets", 22 | "Other" 23 | ], 24 | "keywords": [ 25 | "pico8" 26 | ], 27 | "activationEvents": [ 28 | "onCommand:pico8.runCart", 29 | "onCommand:pico8.openCart", 30 | "onLanguage:pico8p8" 31 | ], 32 | "main": "./out/extension", 33 | "contributes": { 34 | "configuration": { 35 | "type": "object", 36 | "title": "Pico8 VSCode Editor Configuration", 37 | "properties": { 38 | "pico8vscodeeditor.pico8fullpath": { 39 | "type": "string", 40 | "default": null, 41 | "description": "Full path, including the binary name, to Pico8 (e.g: c:\\pico8\\pico8.exe)" 42 | }, 43 | "pico8vscodeeditor.pico8additionalParameters": { 44 | "type": "string", 45 | "default": null, 46 | "description": "Any additional parameters to pass to Pico8 when opening or running carts" 47 | } 48 | } 49 | }, 50 | "keybindings": [ 51 | { 52 | "command": "pico8.runCart", 53 | "key": "ctrl+8 r", 54 | "mac": "cmd+8 r", 55 | "when": "editorTextFocus" 56 | }, 57 | { 58 | "command": "pico8.openCart", 59 | "key": "ctrl+8 o", 60 | "mac": "cmd+8 o", 61 | "when": "editorTextFocus" 62 | } 63 | ], 64 | "commands": [ 65 | { 66 | "command": "pico8.runCart", 67 | "title": "Run the current pico8 cart", 68 | "category": "pico8" 69 | }, 70 | { 71 | "command": "pico8.openCart", 72 | "title": "Open the current pico8 cart into pico8 in edit mode", 73 | "category": "pico8" 74 | } 75 | ], 76 | "languages": [ 77 | { 78 | "id": "pico8p8", 79 | "extensions": [ 80 | ".p8" 81 | ], 82 | "aliases": [ 83 | "pico8", 84 | "p8" 85 | ], 86 | "configuration": "./language-configuration.json" 87 | } 88 | ], 89 | "grammars": [ 90 | { 91 | "language": "pico8p8", 92 | "scopeName": "source.p8", 93 | "path": "./syntaxes/lua.tmLanguage.json" 94 | } 95 | ], 96 | "snippets": [ 97 | { 98 | "language": "pico8p8", 99 | "path": "./snippets/audio.json" 100 | }, 101 | { 102 | "language": "pico8p8", 103 | "path": "./snippets/basics.json" 104 | }, 105 | { 106 | "language": "pico8p8", 107 | "path": "./snippets/cart_data.json" 108 | }, 109 | { 110 | "language": "pico8p8", 111 | "path": "./snippets/coroutines.json" 112 | }, 113 | { 114 | "language": "pico8p8", 115 | "path": "./snippets/graphics.json" 116 | }, 117 | { 118 | "language": "pico8p8", 119 | "path": "./snippets/input.json" 120 | }, 121 | { 122 | "language": "pico8p8", 123 | "path": "./snippets/map.json" 124 | }, 125 | { 126 | "language": "pico8p8", 127 | "path": "./snippets/math.json" 128 | }, 129 | { 130 | "language": "pico8p8", 131 | "path": "./snippets/memory.json" 132 | }, 133 | { 134 | "language": "pico8p8", 135 | "path": "./snippets/peekpoke.json" 136 | }, 137 | { 138 | "language": "pico8p8", 139 | "path": "./snippets/pico8.json" 140 | } 141 | ] 142 | }, 143 | "scripts": { 144 | "vscode:prepublish": "npm run compile", 145 | "compile": "tsc -p ./", 146 | "watch": "tsc -watch -p ./", 147 | "postinstall": "node ./node_modules/vscode/bin/install", 148 | "test": "npm run compile && node ./node_modules/vscode/bin/test" 149 | }, 150 | "devDependencies": { 151 | "typescript": "^2.6.1", 152 | "vscode": "^1.1.6", 153 | "tslint": "^5.8.0", 154 | "@types/node": "^7.0.43", 155 | "@types/mocha": "^2.2.42" 156 | }, 157 | "dependencies": { 158 | "grunt-cli": "^1.2.0" 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /snippet_docs.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | var output = ""; 5 | 6 | fs.readdirSync('./snippets/').forEach(file => { 7 | var contents = JSON.parse(fs.readFileSync('./snippets/'+file, 'utf8')); 8 | 9 | var sectionName = path.basename(file, ".json"); 10 | 11 | output += "### " + sectionName + "\n"; 12 | 13 | var values = Object.values(contents); 14 | 15 | values.forEach(snip => { 16 | output += "* " + snip.prefix + " : " + snip.description + "\n"; 17 | }); 18 | 19 | }); 20 | 21 | console.log(output); 22 | -------------------------------------------------------------------------------- /snippets/audio.json: -------------------------------------------------------------------------------- 1 | { 2 | "audio.music": { 3 | "prefix": "music", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "music(${1:pattern}${2:,optional_fade_ms}${3:,optional_channel_mask})", 7 | "$0" 8 | ], 9 | "description": "Play music (-1 = stop)" 10 | }, 11 | "audio.sfx": { 12 | "prefix": "sfx", 13 | "scope": "pico8p8", 14 | "body": [ 15 | "sfx(${1:sfx_number}${2:,optional_channel}${3:,optional_offset})", 16 | "$0" 17 | ], 18 | "description": "Play sfx" 19 | } 20 | } -------------------------------------------------------------------------------- /snippets/basics.json: -------------------------------------------------------------------------------- 1 | { 2 | "for_loop": { 3 | "prefix": "for", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "for ${1:variable}=${2:from},${3:to} do", 7 | "\t$0", 8 | "end" 9 | ], 10 | "description": "Basic for loop" 11 | }, 12 | "for_step_loop": { 13 | "prefix": "fors", 14 | "scope": "pico8p8", 15 | "body": [ 16 | "for ${1:variable}=${2:from},${3:to},${4:step} do", 17 | "\t$0", 18 | "end" 19 | ], 20 | "description": "For loop with step parameter" 21 | }, 22 | "for_all_loop": { 23 | "prefix": "forall", 24 | "scope": "pico8p8", 25 | "body": [ 26 | "for ${1:variable} in all(${2:table}) do", 27 | "\t$0", 28 | "end" 29 | ], 30 | "description": "For in all loop" 31 | }, 32 | "for_pairs_loop": { 33 | "prefix": "forpair", 34 | "scope": "pico8p8", 35 | "body": [ 36 | "for ${1:key},${2:value} in pairs(${3:table}) do", 37 | "\t$0", 38 | "end" 39 | ], 40 | "description": "For in all pairs loop" 41 | }, 42 | "while_loop": { 43 | "prefix": "while", 44 | "scope": "pico8p8", 45 | "body": [ 46 | "while (${1:condition}) do", 47 | "\t$0", 48 | "end" 49 | ], 50 | "description": "While loop" 51 | }, 52 | "if": { 53 | "prefix": "if", 54 | "scope": "pico8p8", 55 | "body": [ 56 | "if (${1:condition}) then", 57 | "\t$0", 58 | "end" 59 | ], 60 | "description": "Basic if" 61 | }, 62 | "iif": { 63 | "prefix": "iif", 64 | "scope": "pico8p8", 65 | "body": [ 66 | "if (${1:condition}) $0" 67 | ], 68 | "description": "Inline if" 69 | }, 70 | "ifel": { 71 | "prefix": "ifel", 72 | "scope": "pico8p8", 73 | "body": [ 74 | "if (${1:condition}) then", 75 | "\t$0", 76 | "else", 77 | "\t", 78 | "end" 79 | ], 80 | "description": "If else" 81 | }, 82 | "function": { 83 | "body": [ 84 | "function ${1:function_name}(${2:params})", 85 | "\t$0", 86 | "end" 87 | ], 88 | "description": "function", 89 | "prefix": "fun" 90 | } 91 | } -------------------------------------------------------------------------------- /snippets/cart_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "cartdata.cartdata": { 3 | "prefix": "cartdata", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "cartdata(${1:cart_name})", 7 | "$0" 8 | ], 9 | "description": "Open cart data (once per exection)" 10 | }, 11 | "cartdata.dget": { 12 | "prefix": "dget", 13 | "scope": "pico8p8", 14 | "body": [ 15 | "dget(${1:index})", 16 | "$0" 17 | ], 18 | "description": "Get number stored at index (call cartdata first)" 19 | }, 20 | "cartdata.dset": { 21 | "prefix": "dset", 22 | "scope": "pico8p8", 23 | "body": [ 24 | "dset(${1:index}, ${2:value})", 25 | "$0" 26 | ], 27 | "description": "Store value at index (call cartdata first)" 28 | } 29 | } -------------------------------------------------------------------------------- /snippets/coroutines.json: -------------------------------------------------------------------------------- 1 | { 2 | "coroutines.cocreate": { 3 | "prefix": "cocreate", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "cocreate(${1:function})", 7 | "$0" 8 | ], 9 | "description": "Create a coroutine that executes the function" 10 | }, 11 | "coroutines.coresume": { 12 | "prefix": "coresume", 13 | "scope": "pico8p8", 14 | "body": [ 15 | "coresume(${1:coroutine}${2:,additional_initial_parameters})", 16 | "$0" 17 | ], 18 | "description": "Resume a created coroutine, passing optional additional parameters in first time." 19 | }, 20 | "coroutines.costatus": { 21 | "prefix": "costatus", 22 | "scope": "pico8p8", 23 | "body": [ 24 | "costatus(${1:coroutine})", 25 | "$0" 26 | ], 27 | "description": "Get the status of a coroutine, either 'running', 'suspended', or 'dead'." 28 | }, 29 | "coroutines.yield": { 30 | "prefix": "yield", 31 | "scope": "pico8p8", 32 | "body": [ 33 | "yield()", 34 | "$0" 35 | ], 36 | "description": "Pause execution from within a coroutine." 37 | } 38 | } -------------------------------------------------------------------------------- /snippets/graphics.json: -------------------------------------------------------------------------------- 1 | { 2 | "graphics.camera": { 3 | "prefix": "cam", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "camera(${1:x},${2:y})", 7 | "$0" 8 | ], 9 | "description": "Set camera position" 10 | }, 11 | "graphics.circ": { 12 | "prefix": "circ", 13 | "scope": "pico8p8", 14 | "body": [ 15 | "circ(${1:x},${2:y},${3:radius},${4|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 16 | "$0" 17 | ], 18 | "description": "Draw a circle" 19 | }, 20 | "graphics.circfill": { 21 | "prefix": "circf", 22 | "scope": "pico8p8", 23 | "body": [ 24 | "circfill(${1:x},${2:y},${3:radius},${4|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 25 | "$0" 26 | ], 27 | "description": "Draw a filled circle" 28 | }, 29 | "graphics.clip": { 30 | "prefix": "clip", 31 | "scope": "pico8p8", 32 | "body": [ 33 | "clip(${1:x},${2:y},${2:w},${2:h})", 34 | "$0" 35 | ], 36 | "description": "Set screen clipping region" 37 | }, 38 | "graphics.cls": { 39 | "prefix": "cls", 40 | "scope": "pico8p8", 41 | "body": [ 42 | "cls(${1|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 43 | "$0" 44 | ], 45 | "description": "Clear the screen with the given colour" 46 | }, 47 | "graphics.color": { 48 | "prefix": "color", 49 | "scope": "pico8p8", 50 | "body": [ 51 | "color(${1|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 52 | "$0" 53 | ], 54 | "description": "Sets the default drawing colour" 55 | }, 56 | "graphics.cursor": { 57 | "prefix": "cursor", 58 | "scope": "pico8p8", 59 | "body": [ 60 | "cursor(${1:x},${2:y})", 61 | "$0" 62 | ], 63 | "description": "Set the cursor position and carriage return margin" 64 | }, 65 | "graphics.fget": { 66 | "prefix": "fget", 67 | "scope": "pico8p8", 68 | "body": [ 69 | "fget(${1:sprite_index},${2:optional_flag_index})", 70 | "$0" 71 | ], 72 | "description": "Gets the sprite's flag" 73 | }, 74 | "graphics.fset": { 75 | "prefix": "fset", 76 | "scope": "pico8p8", 77 | "body": [ 78 | "fset(${1:sprite_index},${2:optional_flag_index},${3:value})", 79 | "$0" 80 | ], 81 | "description": "Sets the sprite's flag" 82 | }, 83 | "graphics.flip": { 84 | "prefix": "flip", 85 | "scope": "pico8p8", 86 | "body": [ 87 | "flip()", 88 | "$0" 89 | ], 90 | "description": "Flips the screen back buffer" 91 | }, 92 | "graphics.line": { 93 | "prefix": "line", 94 | "scope": "pico8p8", 95 | "body": [ 96 | "line(${1:x0},${2:y0},${3:x1},${4:y1},${5|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 97 | "$0" 98 | ], 99 | "description": "Draw a line" 100 | }, 101 | "graphics.pal": { 102 | "prefix": "pal", 103 | "scope": "pico8p8", 104 | "body": [ 105 | "pal(${1:c0},${2:c1},${3:palette_0_draw_1_screen})", 106 | "$0" 107 | ], 108 | "description": "Switch colour 0 to colour 1, set palette to 0 for draw palette (sprites etc.), or 1 for screen (fades etc.)" 109 | }, 110 | "graphics.palt": { 111 | "prefix": "palt", 112 | "scope": "pico8p8", 113 | "body": [ 114 | "palt(${1:col},${2:onoff})", 115 | "$0" 116 | ], 117 | "description": "Sets transparency on given colour to on or off" 118 | }, 119 | "graphics.pget": { 120 | "prefix": "pget", 121 | "scope": "pico8p8", 122 | "body": [ 123 | "pget(${1:x},${2:y})", 124 | "$0" 125 | ], 126 | "description": "Get the value of the pixel at the given coords" 127 | }, 128 | "graphics.pset": { 129 | "prefix": "pset", 130 | "scope": "pico8p8", 131 | "body": [ 132 | "pset(${1:x},${2:y},${3|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 133 | "$0" 134 | ], 135 | "description": "Sets the value of the pixel at the given coords" 136 | }, 137 | "graphics.print": { 138 | "prefix": "print", 139 | "scope": "pico8p8", 140 | "body": [ 141 | "print(${1:string},${2:x},${3:y},${4|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 142 | "$0" 143 | ], 144 | "description": "Prints the string in the given colour at the given coords" 145 | }, 146 | "graphics.rect": { 147 | "prefix": "rect", 148 | "scope": "pico8p8", 149 | "body": [ 150 | "rect(${1:x0},${2:y0},${3:x1},${4:y1},${5|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 151 | "$0" 152 | ], 153 | "description": "Draws a rectangle outline" 154 | }, 155 | "graphics.rectfill": { 156 | "prefix": "rectfill", 157 | "scope": "pico8p8", 158 | "body": [ 159 | "rectfill(${1:x0},${2:y0},${3:x1},${4:y1},${5|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 160 | "$0" 161 | ], 162 | "description": "Draws a filled rectangle" 163 | }, 164 | "graphics.sget": { 165 | "prefix": "sget", 166 | "scope": "pico8p8", 167 | "body": [ 168 | "sget(${1:x},${2:y})", 169 | "$0" 170 | ], 171 | "description": "Get the spritesheet value of the pixel at the given coords" 172 | }, 173 | "graphics.sset": { 174 | "prefix": "sset", 175 | "scope": "pico8p8", 176 | "body": [ 177 | "sset(${1:x},${2:y},${3|black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach|})", 178 | "$0" 179 | ], 180 | "description": "Sets the spritesheet value of the pixel at the given coords" 181 | }, 182 | "graphics.spr": { 183 | "prefix": "spr", 184 | "scope": "pico8p8", 185 | "body": [ 186 | "spr(${1:sprite_number},${2:x},${3:y}${4:,optional_width}${5:,optional_height}${6:,optional_flip_x}${7:,optional_flip_y})", 187 | "$0" 188 | ], 189 | "description": "Full draw sprite at given coords with given size and flip flags" 190 | }, 191 | "graphics.sspr": { 192 | "prefix": "sspr", 193 | "scope": "pico8p8", 194 | "body": [ 195 | "sspr(${1:spritesheet_x},${2:spritesheet_y},${3:spritesheet_width},${4:spritesheet_height},${5:x},${6:y}${7:,optional_width}${8:,optional_height}${9:,optional_flip_x}${10:,optional_flip_y})", 196 | "$0" 197 | ], 198 | "description": "Draw sprite sheet texture at given coords" 199 | }, 200 | "graphics.fillp": { 201 | "prefix": "fillp", 202 | "scope": "pico8p8", 203 | "body": [ 204 | "fillp(${1:mask})", 205 | "$0" 206 | ], 207 | "description": "Set fill pattern for circ, circfill, rect, rectfill, pset, and line (see https://seansleblanc.itch.io/pico-8-fillp-tool)" 208 | } 209 | } -------------------------------------------------------------------------------- /snippets/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "input.btn": { 3 | "prefix": "btn", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "btn(${1|left,right,up,down,fire1,fire2|}${2,optional_player_number})", 7 | "$0" 8 | ], 9 | "description": "Get button state for given player (see pconsts for constants)" 10 | }, 11 | "input.btnp": { 12 | "prefix": "btnp", 13 | "scope": "pico8p8", 14 | "body": [ 15 | "btnp(${1|left,right,up,down,fire1,fire2|}${2,optional_player_number})", 16 | "$0" 17 | ], 18 | "description": "Get 'repeating' button state for given player (see pconsts for constants)" 19 | }, 20 | "input.dinput": { 21 | "prefix": "dinput", 22 | "scope": "pico8p8", 23 | "body": [ 24 | "poke(0x5f2d, 1)", 25 | "$0" 26 | ], 27 | "description": "Enable pico8 devkit input for mouse and keyboard input" 28 | }, 29 | "input.dkeyp": { 30 | "prefix": "dkeyp", 31 | "scope": "pico8p8", 32 | "body": [ 33 | "stat(30)" 34 | ], 35 | "description": "(Boolean) True when a key pressed" 36 | }, 37 | "input.dkey": { 38 | "prefix": "dkey", 39 | "scope": "pico8p8", 40 | "body": [ 41 | "stat(31)" 42 | ], 43 | "description": "(String) character returned by keyboard" 44 | }, 45 | "input.dmousex": { 46 | "prefix": "dmousex", 47 | "scope": "pico8p8", 48 | "body": [ 49 | "stat(32)" 50 | ], 51 | "description": "Mouse X" 52 | }, 53 | "input.dmousey": { 54 | "prefix": "dmousey", 55 | "scope": "pico8p8", 56 | "body": [ 57 | "stat(33)" 58 | ], 59 | "description": "Mouse Y" 60 | }, 61 | "input.dmousebtn": { 62 | "prefix": "dmousebtn", 63 | "scope": "pico8p8", 64 | "body": [ 65 | "stat(34)" 66 | ], 67 | "description": "Mouse buttons bitfield" 68 | }, 69 | "input.dmousewheel": { 70 | "prefix": "dmousewheel", 71 | "scope": "pico8p8", 72 | "body": [ 73 | "stat(36)" 74 | ], 75 | "description": "Mouse wheel event" 76 | } 77 | } -------------------------------------------------------------------------------- /snippets/map.json: -------------------------------------------------------------------------------- 1 | { 2 | "map.map": { 3 | "prefix": "map", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "map(${1:cell_x},${2:cell_y},${3:screen_x},${5:screen_y},${3:cells_wide},${3:cells_high})", 7 | "$0" 8 | ], 9 | "description": "Draw the selection of map cells at the given screen position" 10 | }, 11 | "map.mget": { 12 | "prefix": "mget", 13 | "scope": "pico8p8", 14 | "body": [ 15 | "mget(${1:cell_x},${2:cell_y})", 16 | "$0" 17 | ], 18 | "description": "Gets the map value of the given cell" 19 | }, 20 | "map.mset": { 21 | "prefix": "mset", 22 | "scope": "pico8p8", 23 | "body": [ 24 | "mset(${1:cell_x},${2:cell_y},${3:value})", 25 | "$0" 26 | ], 27 | "description": "Sets the map value of the given cell" 28 | } 29 | } -------------------------------------------------------------------------------- /snippets/math.json: -------------------------------------------------------------------------------- 1 | { 2 | "math.abs": { 3 | "prefix": "abs", 4 | "body": [ 5 | "abs(${1:value})" 6 | ], 7 | "description": "Abolute value" 8 | }, 9 | "math.atan2": { 10 | "prefix": "atan2", 11 | "body": [ 12 | "atan2(${1:dx},${1:dy})" 13 | ], 14 | "description": "Converts dx,dy to an angle in the range 0-1" 15 | }, 16 | "math.band": { 17 | "prefix": "band", 18 | "body": [ 19 | "band(${1:x},${1:y})" 20 | ], 21 | "description": "Bitwise AND" 22 | }, 23 | "math.bnot": { 24 | "prefix": "bnot", 25 | "body": [ 26 | "bnot(${1:x},${1:y})" 27 | ], 28 | "description": "Bitwise NOT" 29 | }, 30 | "math.bor": { 31 | "prefix": "bor", 32 | "body": [ 33 | "bor(${1:x},${1:y})" 34 | ], 35 | "description": "Bitwise OR" 36 | }, 37 | "math.bxor": { 38 | "prefix": "bxor", 39 | "body": [ 40 | "bxor(${1:x},${1:y})" 41 | ], 42 | "description": "Bitwise XOR" 43 | }, 44 | "math.flr": { 45 | "prefix": "flr", 46 | "body": [ 47 | "flr(${1:x})" 48 | ], 49 | "description": "Round down" 50 | }, 51 | "math.round": { 52 | "prefix": "round", 53 | "body": [ 54 | "flr(${1:x}+0.5)" 55 | ], 56 | "description": "Round number" 57 | }, 58 | "math.ceil": { 59 | "prefix": "ceil", 60 | "body": [ 61 | "ceil(${1:x})" 62 | ], 63 | "description": "Round up" 64 | }, 65 | "math.min": { 66 | "prefix": "min", 67 | "body": [ 68 | "min(${1:x},${2:y})" 69 | ], 70 | "description": "Returns the lowest of the two values" 71 | }, 72 | "math.max": { 73 | "prefix": "max", 74 | "body": [ 75 | "max(${1:x},${2:y})" 76 | ], 77 | "description": "Returns the highest of the two values" 78 | }, 79 | "math.mid": { 80 | "prefix": "mid", 81 | "body": [ 82 | "mid(${1:x},${2:y},${3:z})" 83 | ], 84 | "description": "Returns the max, min or middle number e.g. x=mid(min_x, x, max_x) will make sure x is between the min and max values." 85 | }, 86 | "math.srand": { 87 | "prefix": "srand", 88 | "body": [ 89 | "srand(${1:x})" 90 | ], 91 | "description": "Set random seed for rnd" 92 | }, 93 | "math.rnd": { 94 | "prefix": "rnd", 95 | "body": [ 96 | "rnd(${1:x})" 97 | ], 98 | "description": "Returns a random number in the range 0-x (remember to round before using for array/sprite indexes!)" 99 | }, 100 | "math.sgn": { 101 | "prefix": "sgn", 102 | "body": [ 103 | "sgn(${1:x})" 104 | ], 105 | "description": "Returns sign of x e.g. -1 or 1" 106 | }, 107 | "math.shl": { 108 | "prefix": "shl", 109 | "body": [ 110 | "shl(${1:x},${2:n})" 111 | ], 112 | "description": "Bitwise shift x left n times" 113 | }, 114 | "math.shr": { 115 | "prefix": "shr", 116 | "body": [ 117 | "shr(${1:x},${2:n})" 118 | ], 119 | "description": "Bitwise shift x right n times" 120 | }, 121 | "math.sin": { 122 | "prefix": "sin", 123 | "body": [ 124 | "sin(${1:x})" 125 | ], 126 | "description": "Sine of x (inverted), returns a value between 0 and 1" 127 | }, 128 | "math.cos": { 129 | "prefix": "cos", 130 | "body": [ 131 | "cos(${1:x})" 132 | ], 133 | "description": "Cosine of x, returns a value between 0 and 1" 134 | }, 135 | "math.sqrt": { 136 | "prefix": "sqrt", 137 | "body": [ 138 | "sqrt(${1:x})" 139 | ], 140 | "description": "Square root of x" 141 | } 142 | } -------------------------------------------------------------------------------- /snippets/memory.json: -------------------------------------------------------------------------------- 1 | { 2 | "memory.cstore": { 3 | "prefix": "cstore", 4 | "body": [ 5 | "cstore(${1:dest_address},${2:src_address},${3:length}${4:,optional_filename})", 6 | "$0" 7 | ], 8 | "description": "Copy bytes from ram to filename" 9 | }, 10 | "memory.memcpy": { 11 | "prefix": "memcpy", 12 | "body": [ 13 | "memcpy(${1:dest_address},${2:source_address},${3:length})", 14 | "$0" 15 | ], 16 | "description": "Copy memory" 17 | }, 18 | "memory.memset": { 19 | "prefix": "memset", 20 | "body": [ 21 | "memset(${1:dest_address},${2:value},${3:length})", 22 | "$0" 23 | ], 24 | "description": "Set memory to value from dest_address for length bytes" 25 | }, 26 | "memory.peek": { 27 | "prefix": "peek", 28 | "body": [ 29 | "peek(${1:address})" 30 | ], 31 | "description": "Read byte from RAM" 32 | }, 33 | "memory.poke": { 34 | "prefix": "poke", 35 | "body": [ 36 | "poke(${1:address},${1:value})" 37 | ], 38 | "description": "Write byte to RAM" 39 | }, 40 | "memory.reload": { 41 | "prefix": "reload", 42 | "body": [ 43 | "reload(${1:dest_address},${2:src_address},${3:length}${4:,optional_filename})", 44 | "$0" 45 | ], 46 | "description": "Load a section of cartridge into RAM" 47 | } 48 | } -------------------------------------------------------------------------------- /snippets/peekpoke.json: -------------------------------------------------------------------------------- 1 | { 2 | "peekpoke.gpiow": { 3 | "prefix": "gpiow", 4 | "body": [ 5 | "poke(0x5f80+${1:pin_index},${2:value})" 6 | ], 7 | "description": "Write to GPIO" 8 | }, 9 | "peekpoke.gpior": { 10 | "prefix": "gpior", 11 | "body": [ 12 | "peek(0x5f80+${1:pin_index})" 13 | ], 14 | "description": "Read from GPIO" 15 | }, 16 | "peekpoke.memgfx": { 17 | "prefix": "memgfx", 18 | "body": [ 19 | "0x0" 20 | ], 21 | "description": "Base address for graphics (sprite sheet) memory" 22 | }, 23 | "peekpoke.memgfx2": { 24 | "prefix": "memgfx2", 25 | "body": [ 26 | "0x1000" 27 | ], 28 | "description": "Base address for graphics/map shared memory" 29 | }, 30 | "peekpoke.memmap": { 31 | "prefix": "memmap", 32 | "body": [ 33 | "0x2000" 34 | ], 35 | "description": "Base address for map memory" 36 | }, 37 | "peekpoke.memgfxprops": { 38 | "prefix": "memgfxprops", 39 | "body": [ 40 | "0x3000" 41 | ], 42 | "description": "Base address for graphics props memory" 43 | }, 44 | "peekpoke.memsong": { 45 | "prefix": "memsong", 46 | "body": [ 47 | "0x3100" 48 | ], 49 | "description": "Base address for song memory" 50 | }, 51 | "peekpoke.memsfx": { 52 | "prefix": "memsfx", 53 | "body": [ 54 | "0x3200" 55 | ], 56 | "description": "Base address for sfx memory" 57 | }, 58 | "peekpoke.memud": { 59 | "prefix": "memud", 60 | "body": [ 61 | "0x4300" 62 | ], 63 | "description": "Base address for user data memory" 64 | }, 65 | "peekpoke.memcd": { 66 | "prefix": "memcd", 67 | "body": [ 68 | "0x5e00" 69 | ], 70 | "description": "Base address for persistent cart data memory" 71 | }, 72 | "peekpoke.memds": { 73 | "prefix": "memds", 74 | "body": [ 75 | "0x5f00" 76 | ], 77 | "description": "Base address for draw state memory" 78 | }, 79 | "peekpoke.memhs": { 80 | "prefix": "memhs", 81 | "body": [ 82 | "0x5f40" 83 | ], 84 | "description": "Base address for hardware state memory" 85 | }, 86 | "peekpoke.memgpio": { 87 | "prefix": "memgpio", 88 | "body": [ 89 | "0x5f80" 90 | ], 91 | "description": "Base address for gpio pin memory" 92 | }, 93 | "peekpoke.memscr": { 94 | "prefix": "memscr", 95 | "body": [ 96 | "0x6000" 97 | ], 98 | "description": "Base address for screen memory" 99 | } 100 | } -------------------------------------------------------------------------------- /snippets/pico8.json: -------------------------------------------------------------------------------- 1 | { 2 | "pheader": { 3 | "prefix": "pheader", 4 | "scope": "pico8p8", 5 | "body": [ 6 | "pico-8 cartridge // http://www.pico-8.com", 7 | "version 16", 8 | "__lua__", 9 | "$0" 10 | ], 11 | "description": "Pico8 cartridge header" 12 | }, 13 | "pgame": { 14 | "prefix": "game", 15 | "scope": "pico8p8", 16 | "body": [ 17 | "function _init()", 18 | "\t$0", 19 | "end", 20 | "", 21 | "function _update60()", 22 | "\t", 23 | "end", 24 | "", 25 | "function _draw()", 26 | "\t", 27 | "end" 28 | ], 29 | "description": "Basic pico8 game skeleton" 30 | }, 31 | "pgame30": { 32 | "prefix": "game30", 33 | "scope": "pico8p8", 34 | "body": [ 35 | "function _init()", 36 | "\t$0", 37 | "end", 38 | "", 39 | "function _update()", 40 | "\t", 41 | "end", 42 | "", 43 | "function _draw()", 44 | "\t", 45 | "end" 46 | ], 47 | "description": "Basic 30fps pico8 game skeleton" 48 | }, 49 | "consts": { 50 | "prefix": "pconsts", 51 | "scope": "pico8p8", 52 | "body": [ 53 | "left,right,up,down,fire1,fire2=0,1,2,3,4,5", 54 | "black,dark_blue,dark_purple,dark_green,brown,dark_gray,light_gray,white,red,orange,yellow,green,blue,indigo,pink,peach=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15", 55 | "$0" 56 | ], 57 | "description": "Basic pico8 constants" 58 | } 59 | } -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import * as vscode from 'vscode'; 3 | import * as process from 'child_process'; 4 | import * as os from 'os'; 5 | import * as path from 'path'; 6 | 7 | export function activate(context: vscode.ExtensionContext) { 8 | let disposable = vscode.commands.registerCommand('pico8.runCart', () => { 9 | if (!vscode.window || !vscode.window.activeTextEditor) { 10 | vscode.window.showInformationMessage("Error: Unable to find current document to execute."); 11 | return; 12 | } 13 | 14 | let config = vscode.workspace.getConfiguration('pico8vscodeeditor'); 15 | let picoPath = config.pico8fullpath; 16 | if (!picoPath) { 17 | vscode.window.showInformationMessage("Error: Pico8 path not set in plugin configuration."); 18 | return; 19 | } 20 | let additionalParams = config.pico8additionalParameters || ""; 21 | 22 | let document = vscode.window.activeTextEditor.document; 23 | let filename = document.fileName; 24 | let folder = path.dirname(filename); 25 | 26 | if (!filename || !folder) { 27 | vscode.window.showErrorMessage("Error: Current file is not saved, or unable to find parent folder."); 28 | return; 29 | } 30 | 31 | document.save().then(s => { 32 | let runCommand = `"${picoPath}" -run "${filename}" ${additionalParams}`; 33 | if (os.type() === "Darwin") { 34 | // Using quotes in runCommand gave error, so we replace 35 | // all the spaces with a slash+space 36 | picoPath = picoPath.split(' ').join('\\ '); 37 | filename = filename.split(' ').join('\\ '); 38 | runCommand = `open ${picoPath} --args -run ${filename} ${additionalParams}`; 39 | } 40 | 41 | // Would be good to set the root path to the folder the file is in, but doesn't seem to be a commandline option? 42 | process.exec(runCommand, (err, stdout, stderr) => { 43 | if (stdout && stdout.length > 0) { 44 | console.log(`pico8 output: ${stdout}`); 45 | } 46 | 47 | if (stderr && stderr.length > 0) { 48 | console.log(`pico8 error output: ${stderr}`); 49 | } 50 | 51 | if (err) { 52 | vscode.window.showErrorMessage(`pico8 error: ${err.name} - ${err.message}`); 53 | } 54 | }); 55 | }); 56 | }); 57 | context.subscriptions.push(disposable); 58 | 59 | disposable = vscode.commands.registerCommand('pico8.openCart', () => { 60 | if (!vscode.window || !vscode.window.activeTextEditor) { 61 | vscode.window.showInformationMessage("Error: Unable to find current document to execute."); 62 | return; 63 | } 64 | 65 | let config = vscode.workspace.getConfiguration('pico8vscodeeditor'); 66 | let picoPath = config.pico8fullpath; 67 | if (!picoPath) { 68 | vscode.window.showInformationMessage("Error: Pico8 path not set in plugin configuration."); 69 | return; 70 | } 71 | let additionalParams = config.pico8additionalParameters || ""; 72 | 73 | let document = vscode.window.activeTextEditor.document; 74 | let filename = document.fileName; 75 | let folder = path.dirname(filename); 76 | 77 | if (!filename || !folder) { 78 | vscode.window.showErrorMessage("Error: Current file is not saved, or unable to find parent folder."); 79 | return; 80 | } 81 | 82 | document.save().then(s => { 83 | // Would be good to set the root path to the folder the file is in, but doesn't seem to be a commandline option? 84 | process.exec(`"${picoPath}" "${filename}" ${additionalParams}`, (err, stdout, stderr) => { 85 | if (stdout && stdout.length > 0) { 86 | console.log(`pico8 output: ${stdout}`); 87 | } 88 | 89 | if (stderr && stderr.length > 0) { 90 | console.log(`pico8 error output: ${stderr}`); 91 | } 92 | 93 | if (err) { 94 | vscode.window.showErrorMessage(`pico8 error: ${err.name} - ${err.message}`); 95 | } 96 | }); 97 | }); 98 | }); 99 | context.subscriptions.push(disposable); 100 | } 101 | 102 | export function deactivate() { 103 | } -------------------------------------------------------------------------------- /syntaxes/lua.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "information_for_contributors": [ 3 | "Based on https://github.com/Microsoft/vscode/blob/master/extensions/lua/syntaxes/lua.tmLanguage.json", 4 | "", 5 | "This file has been converted from https://github.com/textmate/lua.tmbundle/blob/master/Syntaxes/Lua.plist", 6 | "If you want to provide a fix or improvement, please create a pull request against the original repository.", 7 | "Once accepted there, we are happy to receive an update request." 8 | ], 9 | "version": "https://github.com/textmate/lua.tmbundle/commit/8ae5641365b28f697121ba1133890e8d81f5b00e", 10 | "name": "pico8p8", 11 | "fileTypes": [ "p8" ], 12 | "scopeName": "source.p8", 13 | 14 | "patterns": [ 15 | { 16 | "begin": "^__lua__", 17 | "end": "^__", 18 | 19 | "patterns": [ 20 | { 21 | "begin": "\\b(?:(local)\\s+)?(function)\\s*(?:\\s+([a-zA-Z_][a-zA-Z0-9_]*(?:([\\.:])[a-zA-Z_][a-zA-Z0-9_]*)?)\\s*)?(\\()", 22 | "beginCaptures": { 23 | "1": { 24 | "name": "storage.modifier.local.lua" 25 | }, 26 | "2": { 27 | "name": "keyword.control.lua" 28 | }, 29 | "3": { 30 | "name": "entity.name.function.lua" 31 | }, 32 | "4": { 33 | "name": "punctuation.separator.parameter.lua" 34 | }, 35 | "5": { 36 | "name": "punctuation.definition.parameters.begin.lua" 37 | } 38 | }, 39 | "end": "\\)", 40 | "endCaptures": { 41 | "0": { 42 | "name": "punctuation.definition.parameters.end.lua" 43 | } 44 | }, 45 | "name": "meta.function.lua", 46 | "patterns": [ 47 | { 48 | "match": "[a-zA-Z_][a-zA-Z0-9_]*", 49 | "name": "variable.parameter.function.lua" 50 | }, 51 | { 52 | "match": ",", 53 | "name": "punctuation.separator.arguments.lua" 54 | } 55 | ] 56 | }, 57 | { 58 | "match": "(?=?|(?