├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── config.schema.json ├── naw.json ├── package-lock.json ├── package.json ├── src ├── cli.ts ├── commands.ts ├── config.ts ├── config │ ├── .gitignore │ ├── types.gen.d.ts │ └── types.src.ts ├── dockerfiles │ └── tester.Dockerfile ├── init.ts ├── logger.ts ├── spawn.ts └── tasks.ts ├── tasks ├── eslint │ ├── Dockerfile │ ├── package-lock.json │ ├── package.json │ ├── script.sh │ └── test.bats └── example │ ├── Dockerfile │ ├── script.sh │ └── test.bats ├── tsconfig.json └── types └── string.prototype.replaceall.d.ts /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint:recommended", 4 | "plugin:@typescript-eslint/eslint-recommended", 5 | "plugin:@typescript-eslint/recommended" 6 | ], 7 | "rules": { 8 | "no-console": "off", 9 | "prefer-const": "off", 10 | "@typescript-eslint/indent": "off", 11 | "@typescript-eslint/member-delimiter-style": "off", 12 | "@typescript-eslint/explicit-function-return-type": "off", 13 | "@typescript-eslint/explicit-member-accessibility": "off", 14 | "@typescript-eslint/no-use-before-define": "off" 15 | }, 16 | "overrides": [ 17 | // Forcing prefer-const to be off because eslint extends is dumb 18 | { "files": "*", "rules": { "prefer-const": "off" } }, 19 | { 20 | "files": "*.gen.ts", 21 | "rules": { 22 | "no-var": "off", 23 | "no-empty": "off", 24 | "@typescript-eslint/no-explicit-any": "off" 25 | } 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | dist 4 | .eslintcache 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .*ignore 2 | .*cache 3 | Dockerfile 4 | *.sh 5 | *.bats 6 | dist 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "semi": false, 4 | "trailingComma": "all" 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "json.schemas": [ 3 | { 4 | "fileMatch": ["naw.json"], 5 | "url": "./config.schema.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `naw` 2 | 3 | > Your very own containerized build system! 4 | 5 | - Want your build tools to run the exact same way locally as they do in CI? 6 | - Want to have a test suite for your build tools themselves? 7 | - Want to reduce the number of build tool dependencies that need to be installed locally? 8 | - Well `naw` is here to help! 9 | 10 | ## Install 11 | 12 | ```sh 13 | npm i -g naw 14 | ``` 15 | 16 | ## CLI 17 | 18 | ```txt 19 | Usage 20 | $ naw 21 | $ naw --init Create a new naw project. 22 | $ naw Run 23 | $ naw --build/-b Build 24 | $ naw --test/-t Test 25 | $ naw --debug/-d Debug 26 | $ naw --debug --test Debug tests 27 | $ naw --build --debug Build+Debug 28 | ``` 29 | -------------------------------------------------------------------------------- /config.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-06/schema#", 3 | "$ref": "./dist/naw-config.schema.json#/definitions/Config" 4 | } 5 | -------------------------------------------------------------------------------- /naw.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "eslint": { 4 | "description": "Lint code with ESLint", 5 | "build": "./tasks/eslint", 6 | "args": ["."] 7 | }, 8 | "example": { 9 | "description": "Run an example build tool", 10 | "build": "./tasks/example", 11 | "args": [] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "naw", 3 | "version": "0.2.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/runtime": { 8 | "version": "7.6.2", 9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", 10 | "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", 11 | "dev": true, 12 | "requires": { 13 | "regenerator-runtime": "^0.13.2" 14 | } 15 | }, 16 | "@mark.probst/typescript-json-schema": { 17 | "version": "0.32.0", 18 | "resolved": "https://registry.npmjs.org/@mark.probst/typescript-json-schema/-/typescript-json-schema-0.32.0.tgz", 19 | "integrity": "sha512-OoD+5D7Mka80FIcmvPyuAKV7g5Of5S04R74S4DTAG8pr9REDWySUh9pOloro7SNFwWt/+2f90wyP+DtGHykVfg==", 20 | "dev": true, 21 | "requires": { 22 | "glob": "~7.1.3", 23 | "json-stable-stringify": "^1.0.1", 24 | "typescript": "~3.2.1", 25 | "yargs": "^12.0.5" 26 | }, 27 | "dependencies": { 28 | "typescript": { 29 | "version": "3.2.4", 30 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", 31 | "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", 32 | "dev": true 33 | } 34 | } 35 | }, 36 | "@mark.probst/unicode-properties": { 37 | "version": "1.1.0", 38 | "resolved": "https://registry.npmjs.org/@mark.probst/unicode-properties/-/unicode-properties-1.1.0.tgz", 39 | "integrity": "sha512-7AQsO0hMmpqDledV7AhBuSYqYPFsKP9PaltMecX9nlnsyFxqtsqUg9/pvB2L/jxvskrDrNkdKYz2KTbQznCtng==", 40 | "dev": true, 41 | "requires": { 42 | "brfs": "^1.4.0", 43 | "unicode-trie": "^0.3.0" 44 | } 45 | }, 46 | "@types/cross-spawn": { 47 | "version": "6.0.0", 48 | "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.0.tgz", 49 | "integrity": "sha512-evp2ZGsFw9YKprDbg8ySgC9NA15g3YgiI8ANkGmKKvvi0P2aDGYLPxQIC5qfeKNUOe3TjABVGuah6omPRpIYhg==", 50 | "dev": true, 51 | "requires": { 52 | "@types/node": "*" 53 | } 54 | }, 55 | "@types/eslint-visitor-keys": { 56 | "version": "1.0.0", 57 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 58 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 59 | "dev": true 60 | }, 61 | "@types/json-schema": { 62 | "version": "7.0.3", 63 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", 64 | "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", 65 | "dev": true 66 | }, 67 | "@types/meow": { 68 | "version": "5.0.0", 69 | "resolved": "https://registry.npmjs.org/@types/meow/-/meow-5.0.0.tgz", 70 | "integrity": "sha512-csdM22P8TFF5KwuHseifUBOzWiGtiLfYmQosrKPGpA/xdK3o3PNo3+4YOpiJ5BQBshwO2kuhdJ7NoAitQ6m/jg==", 71 | "dev": true, 72 | "requires": { 73 | "@types/minimist-options": "*" 74 | } 75 | }, 76 | "@types/minimist": { 77 | "version": "1.2.0", 78 | "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", 79 | "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", 80 | "dev": true 81 | }, 82 | "@types/minimist-options": { 83 | "version": "3.0.0", 84 | "resolved": "https://registry.npmjs.org/@types/minimist-options/-/minimist-options-3.0.0.tgz", 85 | "integrity": "sha512-FYeTlkAANOr9KR0mQL7X+v7MT7Nb/aWdNNHNKzJ8sPctpS2Ei8ucgMbvQRbLRjaYZH2OVN5AGDGGcHV5x8lSgQ==", 86 | "dev": true, 87 | "requires": { 88 | "@types/minimist": "*" 89 | } 90 | }, 91 | "@types/node": { 92 | "version": "12.7.5", 93 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", 94 | "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==", 95 | "dev": true 96 | }, 97 | "@typescript-eslint/eslint-plugin": { 98 | "version": "1.13.0", 99 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", 100 | "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", 101 | "dev": true, 102 | "requires": { 103 | "@typescript-eslint/experimental-utils": "1.13.0", 104 | "eslint-utils": "^1.3.1", 105 | "functional-red-black-tree": "^1.0.1", 106 | "regexpp": "^2.0.1", 107 | "tsutils": "^3.7.0" 108 | }, 109 | "dependencies": { 110 | "@typescript-eslint/experimental-utils": { 111 | "version": "1.13.0", 112 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", 113 | "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", 114 | "dev": true, 115 | "requires": { 116 | "@types/json-schema": "^7.0.3", 117 | "@typescript-eslint/typescript-estree": "1.13.0", 118 | "eslint-scope": "^4.0.0" 119 | } 120 | }, 121 | "@typescript-eslint/typescript-estree": { 122 | "version": "1.13.0", 123 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", 124 | "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", 125 | "dev": true, 126 | "requires": { 127 | "lodash.unescape": "4.0.1", 128 | "semver": "5.5.0" 129 | } 130 | }, 131 | "eslint-scope": { 132 | "version": "4.0.3", 133 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 134 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 135 | "dev": true, 136 | "requires": { 137 | "esrecurse": "^4.1.0", 138 | "estraverse": "^4.1.1" 139 | } 140 | }, 141 | "semver": { 142 | "version": "5.5.0", 143 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 144 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 145 | "dev": true 146 | } 147 | } 148 | }, 149 | "@typescript-eslint/experimental-utils": { 150 | "version": "2.3.1", 151 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.1.tgz", 152 | "integrity": "sha512-FaZEj73o4h6Wd0Lg+R4pZiJGdR0ZYbJr+O2+RbQ1aZjX8bZcfkVDtD+qm74Dv77rfSKkDKE64UTziLBo9UYHQA==", 153 | "dev": true, 154 | "requires": { 155 | "@types/json-schema": "^7.0.3", 156 | "@typescript-eslint/typescript-estree": "2.3.1", 157 | "eslint-scope": "^5.0.0" 158 | } 159 | }, 160 | "@typescript-eslint/parser": { 161 | "version": "2.3.1", 162 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.3.1.tgz", 163 | "integrity": "sha512-ZlWdzhCJ2iZnSp/VBAJ/sowFbyHycIux8t0UEH0JsKgQvfSf7949hLYFMwTXdCMeEnpP1zRTHimrR+YHzs8LIw==", 164 | "dev": true, 165 | "requires": { 166 | "@types/eslint-visitor-keys": "^1.0.0", 167 | "@typescript-eslint/experimental-utils": "2.3.1", 168 | "@typescript-eslint/typescript-estree": "2.3.1", 169 | "eslint-visitor-keys": "^1.1.0" 170 | } 171 | }, 172 | "@typescript-eslint/typescript-estree": { 173 | "version": "2.3.1", 174 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.1.tgz", 175 | "integrity": "sha512-9SFhUgFuePJBB6jlLkOPPhMkZNiDCr+S8Ft7yAkkP2c5x5bxPhG3pe/exMiQaF8IGyVMDW6Ul0q4/cZ+uF3uog==", 176 | "dev": true, 177 | "requires": { 178 | "glob": "^7.1.4", 179 | "is-glob": "^4.0.1", 180 | "lodash.unescape": "4.0.1", 181 | "semver": "^6.3.0" 182 | }, 183 | "dependencies": { 184 | "semver": { 185 | "version": "6.3.0", 186 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 187 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 188 | "dev": true 189 | } 190 | } 191 | }, 192 | "acorn": { 193 | "version": "5.7.3", 194 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 195 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", 196 | "dev": true 197 | }, 198 | "ansi-regex": { 199 | "version": "3.0.0", 200 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 201 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 202 | "dev": true 203 | }, 204 | "ansi-styles": { 205 | "version": "3.2.1", 206 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 207 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 208 | "requires": { 209 | "color-convert": "^1.9.0" 210 | } 211 | }, 212 | "array-back": { 213 | "version": "2.0.0", 214 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", 215 | "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", 216 | "dev": true, 217 | "requires": { 218 | "typical": "^2.6.1" 219 | } 220 | }, 221 | "array-find-index": { 222 | "version": "1.0.2", 223 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 224 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 225 | }, 226 | "arrify": { 227 | "version": "1.0.1", 228 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 229 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 230 | }, 231 | "balanced-match": { 232 | "version": "1.0.0", 233 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 234 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 235 | "dev": true 236 | }, 237 | "brace-expansion": { 238 | "version": "1.1.11", 239 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 240 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 241 | "dev": true, 242 | "requires": { 243 | "balanced-match": "^1.0.0", 244 | "concat-map": "0.0.1" 245 | } 246 | }, 247 | "brfs": { 248 | "version": "1.6.1", 249 | "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", 250 | "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", 251 | "dev": true, 252 | "requires": { 253 | "quote-stream": "^1.0.1", 254 | "resolve": "^1.1.5", 255 | "static-module": "^2.2.0", 256 | "through2": "^2.0.0" 257 | } 258 | }, 259 | "buffer-equal": { 260 | "version": "0.0.1", 261 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 262 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", 263 | "dev": true 264 | }, 265 | "buffer-from": { 266 | "version": "1.1.1", 267 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 268 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 269 | "dev": true 270 | }, 271 | "camelcase": { 272 | "version": "4.1.0", 273 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 274 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 275 | }, 276 | "camelcase-keys": { 277 | "version": "4.2.0", 278 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", 279 | "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", 280 | "requires": { 281 | "camelcase": "^4.1.0", 282 | "map-obj": "^2.0.0", 283 | "quick-lru": "^1.0.0" 284 | } 285 | }, 286 | "chalk": { 287 | "version": "2.4.2", 288 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 289 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 290 | "requires": { 291 | "ansi-styles": "^3.2.1", 292 | "escape-string-regexp": "^1.0.5", 293 | "supports-color": "^5.3.0" 294 | } 295 | }, 296 | "cliui": { 297 | "version": "4.1.0", 298 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 299 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 300 | "dev": true, 301 | "requires": { 302 | "string-width": "^2.1.1", 303 | "strip-ansi": "^4.0.0", 304 | "wrap-ansi": "^2.0.0" 305 | } 306 | }, 307 | "code-point-at": { 308 | "version": "1.1.0", 309 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 310 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 311 | "dev": true 312 | }, 313 | "collection-utils": { 314 | "version": "1.0.1", 315 | "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", 316 | "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==", 317 | "dev": true 318 | }, 319 | "color-convert": { 320 | "version": "1.9.3", 321 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 322 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 323 | "requires": { 324 | "color-name": "1.1.3" 325 | } 326 | }, 327 | "color-name": { 328 | "version": "1.1.3", 329 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 330 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 331 | }, 332 | "command-line-args": { 333 | "version": "4.0.7", 334 | "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", 335 | "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", 336 | "dev": true, 337 | "requires": { 338 | "array-back": "^2.0.0", 339 | "find-replace": "^1.0.3", 340 | "typical": "^2.6.1" 341 | } 342 | }, 343 | "command-line-usage": { 344 | "version": "5.0.5", 345 | "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", 346 | "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", 347 | "dev": true, 348 | "requires": { 349 | "array-back": "^2.0.0", 350 | "chalk": "^2.4.1", 351 | "table-layout": "^0.4.3", 352 | "typical": "^2.6.1" 353 | } 354 | }, 355 | "concat-map": { 356 | "version": "0.0.1", 357 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 358 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 359 | "dev": true 360 | }, 361 | "concat-stream": { 362 | "version": "1.6.2", 363 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 364 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 365 | "dev": true, 366 | "requires": { 367 | "buffer-from": "^1.0.0", 368 | "inherits": "^2.0.3", 369 | "readable-stream": "^2.2.2", 370 | "typedarray": "^0.0.6" 371 | } 372 | }, 373 | "convert-source-map": { 374 | "version": "1.6.0", 375 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", 376 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", 377 | "dev": true, 378 | "requires": { 379 | "safe-buffer": "~5.1.1" 380 | } 381 | }, 382 | "core-util-is": { 383 | "version": "1.0.2", 384 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 385 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 386 | "dev": true 387 | }, 388 | "cross-spawn": { 389 | "version": "7.0.0", 390 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.0.tgz", 391 | "integrity": "sha512-6U/8SMK2FBNnB21oQ4+6Nsodxanw1gTkntYA2zBdkFYFu3ZDx65P2ONEXGSvob/QS6REjVHQ9zxzdOafwFdstw==", 392 | "requires": { 393 | "path-key": "^3.1.0", 394 | "shebang-command": "^1.2.0", 395 | "which": "^1.2.9" 396 | } 397 | }, 398 | "currently-unhandled": { 399 | "version": "0.4.1", 400 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 401 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 402 | "requires": { 403 | "array-find-index": "^1.0.1" 404 | } 405 | }, 406 | "decamelize": { 407 | "version": "1.2.0", 408 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 409 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 410 | }, 411 | "decamelize-keys": { 412 | "version": "1.1.0", 413 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", 414 | "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", 415 | "requires": { 416 | "decamelize": "^1.1.0", 417 | "map-obj": "^1.0.0" 418 | }, 419 | "dependencies": { 420 | "map-obj": { 421 | "version": "1.0.1", 422 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 423 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 424 | } 425 | } 426 | }, 427 | "deep-extend": { 428 | "version": "0.6.0", 429 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 430 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 431 | "dev": true 432 | }, 433 | "deep-is": { 434 | "version": "0.1.3", 435 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 436 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 437 | "dev": true 438 | }, 439 | "define-properties": { 440 | "version": "1.1.3", 441 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 442 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 443 | "requires": { 444 | "object-keys": "^1.0.12" 445 | } 446 | }, 447 | "duplexer2": { 448 | "version": "0.1.4", 449 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 450 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 451 | "dev": true, 452 | "requires": { 453 | "readable-stream": "^2.0.2" 454 | } 455 | }, 456 | "encoding": { 457 | "version": "0.1.12", 458 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 459 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 460 | "dev": true, 461 | "requires": { 462 | "iconv-lite": "~0.4.13" 463 | } 464 | }, 465 | "end-of-stream": { 466 | "version": "1.4.2", 467 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.2.tgz", 468 | "integrity": "sha512-gUSUszrsxlDnUbUwEI9Oygyrk4ZEWtVaHQc+uZHphVeNxl+qeqMV/jDWoTkjN1RmGlZ5QWAP7o458p/JMlikQg==", 469 | "dev": true, 470 | "requires": { 471 | "once": "^1.4.0" 472 | } 473 | }, 474 | "error-ex": { 475 | "version": "1.3.2", 476 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 477 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 478 | "requires": { 479 | "is-arrayish": "^0.2.1" 480 | } 481 | }, 482 | "es-abstract": { 483 | "version": "1.14.2", 484 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", 485 | "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", 486 | "requires": { 487 | "es-to-primitive": "^1.2.0", 488 | "function-bind": "^1.1.1", 489 | "has": "^1.0.3", 490 | "has-symbols": "^1.0.0", 491 | "is-callable": "^1.1.4", 492 | "is-regex": "^1.0.4", 493 | "object-inspect": "^1.6.0", 494 | "object-keys": "^1.1.1", 495 | "string.prototype.trimleft": "^2.0.0", 496 | "string.prototype.trimright": "^2.0.0" 497 | }, 498 | "dependencies": { 499 | "object-inspect": { 500 | "version": "1.6.0", 501 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 502 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" 503 | } 504 | } 505 | }, 506 | "es-to-primitive": { 507 | "version": "1.2.0", 508 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 509 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 510 | "requires": { 511 | "is-callable": "^1.1.4", 512 | "is-date-object": "^1.0.1", 513 | "is-symbol": "^1.0.2" 514 | } 515 | }, 516 | "escape-string-regexp": { 517 | "version": "1.0.5", 518 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 519 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 520 | }, 521 | "escodegen": { 522 | "version": "1.9.1", 523 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", 524 | "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", 525 | "dev": true, 526 | "requires": { 527 | "esprima": "^3.1.3", 528 | "estraverse": "^4.2.0", 529 | "esutils": "^2.0.2", 530 | "optionator": "^0.8.1", 531 | "source-map": "~0.6.1" 532 | } 533 | }, 534 | "eslint-scope": { 535 | "version": "5.0.0", 536 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 537 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 538 | "dev": true, 539 | "requires": { 540 | "esrecurse": "^4.1.0", 541 | "estraverse": "^4.1.1" 542 | } 543 | }, 544 | "eslint-utils": { 545 | "version": "1.4.2", 546 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", 547 | "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", 548 | "dev": true, 549 | "requires": { 550 | "eslint-visitor-keys": "^1.0.0" 551 | } 552 | }, 553 | "eslint-visitor-keys": { 554 | "version": "1.1.0", 555 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 556 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 557 | "dev": true 558 | }, 559 | "esprima": { 560 | "version": "3.1.3", 561 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 562 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 563 | "dev": true 564 | }, 565 | "esrecurse": { 566 | "version": "4.2.1", 567 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 568 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 569 | "dev": true, 570 | "requires": { 571 | "estraverse": "^4.1.0" 572 | } 573 | }, 574 | "estraverse": { 575 | "version": "4.3.0", 576 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 577 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 578 | "dev": true 579 | }, 580 | "esutils": { 581 | "version": "2.0.3", 582 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 583 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 584 | "dev": true 585 | }, 586 | "execa": { 587 | "version": "1.0.0", 588 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 589 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 590 | "dev": true, 591 | "requires": { 592 | "cross-spawn": "^6.0.0", 593 | "get-stream": "^4.0.0", 594 | "is-stream": "^1.1.0", 595 | "npm-run-path": "^2.0.0", 596 | "p-finally": "^1.0.0", 597 | "signal-exit": "^3.0.0", 598 | "strip-eof": "^1.0.0" 599 | }, 600 | "dependencies": { 601 | "cross-spawn": { 602 | "version": "6.0.5", 603 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 604 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 605 | "dev": true, 606 | "requires": { 607 | "nice-try": "^1.0.4", 608 | "path-key": "^2.0.1", 609 | "semver": "^5.5.0", 610 | "shebang-command": "^1.2.0", 611 | "which": "^1.2.9" 612 | } 613 | }, 614 | "path-key": { 615 | "version": "2.0.1", 616 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 617 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 618 | "dev": true 619 | } 620 | } 621 | }, 622 | "extract-stack": { 623 | "version": "2.0.0", 624 | "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-2.0.0.tgz", 625 | "integrity": "sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==" 626 | }, 627 | "falafel": { 628 | "version": "2.1.0", 629 | "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", 630 | "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", 631 | "dev": true, 632 | "requires": { 633 | "acorn": "^5.0.0", 634 | "foreach": "^2.0.5", 635 | "isarray": "0.0.1", 636 | "object-keys": "^1.0.6" 637 | }, 638 | "dependencies": { 639 | "isarray": { 640 | "version": "0.0.1", 641 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 642 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 643 | "dev": true 644 | } 645 | } 646 | }, 647 | "fast-levenshtein": { 648 | "version": "2.0.6", 649 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 650 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 651 | "dev": true 652 | }, 653 | "find-replace": { 654 | "version": "1.0.3", 655 | "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", 656 | "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=", 657 | "dev": true, 658 | "requires": { 659 | "array-back": "^1.0.4", 660 | "test-value": "^2.1.0" 661 | }, 662 | "dependencies": { 663 | "array-back": { 664 | "version": "1.0.4", 665 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", 666 | "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", 667 | "dev": true, 668 | "requires": { 669 | "typical": "^2.6.0" 670 | } 671 | } 672 | } 673 | }, 674 | "find-up": { 675 | "version": "4.1.0", 676 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 677 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 678 | "requires": { 679 | "locate-path": "^5.0.0", 680 | "path-exists": "^4.0.0" 681 | }, 682 | "dependencies": { 683 | "path-exists": { 684 | "version": "4.0.0", 685 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 686 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 687 | } 688 | } 689 | }, 690 | "foreach": { 691 | "version": "2.0.5", 692 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 693 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 694 | "dev": true 695 | }, 696 | "fs.realpath": { 697 | "version": "1.0.0", 698 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 699 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 700 | "dev": true 701 | }, 702 | "function-bind": { 703 | "version": "1.1.1", 704 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 705 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 706 | }, 707 | "functional-red-black-tree": { 708 | "version": "1.0.1", 709 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 710 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 711 | "dev": true 712 | }, 713 | "get-caller-file": { 714 | "version": "1.0.3", 715 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 716 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 717 | "dev": true 718 | }, 719 | "get-stream": { 720 | "version": "4.1.0", 721 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 722 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 723 | "dev": true, 724 | "requires": { 725 | "pump": "^3.0.0" 726 | } 727 | }, 728 | "glob": { 729 | "version": "7.1.4", 730 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 731 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 732 | "dev": true, 733 | "requires": { 734 | "fs.realpath": "^1.0.0", 735 | "inflight": "^1.0.4", 736 | "inherits": "2", 737 | "minimatch": "^3.0.4", 738 | "once": "^1.3.0", 739 | "path-is-absolute": "^1.0.0" 740 | } 741 | }, 742 | "graceful-fs": { 743 | "version": "4.2.2", 744 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 745 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" 746 | }, 747 | "graphql": { 748 | "version": "0.11.7", 749 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", 750 | "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", 751 | "dev": true, 752 | "requires": { 753 | "iterall": "1.1.3" 754 | } 755 | }, 756 | "has": { 757 | "version": "1.0.3", 758 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 759 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 760 | "requires": { 761 | "function-bind": "^1.1.1" 762 | } 763 | }, 764 | "has-flag": { 765 | "version": "3.0.0", 766 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 767 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 768 | }, 769 | "has-symbols": { 770 | "version": "1.0.0", 771 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 772 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" 773 | }, 774 | "hosted-git-info": { 775 | "version": "2.8.4", 776 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", 777 | "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" 778 | }, 779 | "iconv-lite": { 780 | "version": "0.4.24", 781 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 782 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 783 | "dev": true, 784 | "requires": { 785 | "safer-buffer": ">= 2.1.2 < 3" 786 | } 787 | }, 788 | "indent-string": { 789 | "version": "3.2.0", 790 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 791 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" 792 | }, 793 | "inflight": { 794 | "version": "1.0.6", 795 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 796 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 797 | "dev": true, 798 | "requires": { 799 | "once": "^1.3.0", 800 | "wrappy": "1" 801 | } 802 | }, 803 | "inherits": { 804 | "version": "2.0.4", 805 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 806 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 807 | "dev": true 808 | }, 809 | "invert-kv": { 810 | "version": "2.0.0", 811 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 812 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", 813 | "dev": true 814 | }, 815 | "is-arrayish": { 816 | "version": "0.2.1", 817 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 818 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 819 | }, 820 | "is-callable": { 821 | "version": "1.1.4", 822 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 823 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 824 | }, 825 | "is-date-object": { 826 | "version": "1.0.1", 827 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 828 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 829 | }, 830 | "is-extglob": { 831 | "version": "2.1.1", 832 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 833 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 834 | "dev": true 835 | }, 836 | "is-fullwidth-code-point": { 837 | "version": "2.0.0", 838 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 839 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 840 | "dev": true 841 | }, 842 | "is-glob": { 843 | "version": "4.0.1", 844 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 845 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 846 | "dev": true, 847 | "requires": { 848 | "is-extglob": "^2.1.1" 849 | } 850 | }, 851 | "is-plain-obj": { 852 | "version": "1.1.0", 853 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 854 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 855 | }, 856 | "is-regex": { 857 | "version": "1.0.4", 858 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 859 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 860 | "requires": { 861 | "has": "^1.0.1" 862 | } 863 | }, 864 | "is-stream": { 865 | "version": "1.1.0", 866 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 867 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 868 | "dev": true 869 | }, 870 | "is-symbol": { 871 | "version": "1.0.2", 872 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 873 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 874 | "requires": { 875 | "has-symbols": "^1.0.0" 876 | } 877 | }, 878 | "is-url": { 879 | "version": "1.2.4", 880 | "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", 881 | "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", 882 | "dev": true 883 | }, 884 | "isarray": { 885 | "version": "1.0.0", 886 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 887 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 888 | "dev": true 889 | }, 890 | "isexe": { 891 | "version": "2.0.0", 892 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 893 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 894 | }, 895 | "iterall": { 896 | "version": "1.1.3", 897 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", 898 | "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", 899 | "dev": true 900 | }, 901 | "js-base64": { 902 | "version": "2.5.1", 903 | "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", 904 | "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", 905 | "dev": true 906 | }, 907 | "json-parse-better-errors": { 908 | "version": "1.0.2", 909 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 910 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 911 | }, 912 | "json-stable-stringify": { 913 | "version": "1.0.1", 914 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 915 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 916 | "dev": true, 917 | "requires": { 918 | "jsonify": "~0.0.0" 919 | } 920 | }, 921 | "jsonify": { 922 | "version": "0.0.0", 923 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 924 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 925 | "dev": true 926 | }, 927 | "lcid": { 928 | "version": "2.0.0", 929 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 930 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 931 | "dev": true, 932 | "requires": { 933 | "invert-kv": "^2.0.0" 934 | } 935 | }, 936 | "levn": { 937 | "version": "0.3.0", 938 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 939 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 940 | "dev": true, 941 | "requires": { 942 | "prelude-ls": "~1.1.2", 943 | "type-check": "~0.3.2" 944 | } 945 | }, 946 | "load-json-file": { 947 | "version": "4.0.0", 948 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 949 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 950 | "requires": { 951 | "graceful-fs": "^4.1.2", 952 | "parse-json": "^4.0.0", 953 | "pify": "^3.0.0", 954 | "strip-bom": "^3.0.0" 955 | } 956 | }, 957 | "locate-path": { 958 | "version": "5.0.0", 959 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 960 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 961 | "requires": { 962 | "p-locate": "^4.1.0" 963 | } 964 | }, 965 | "lodash": { 966 | "version": "4.17.15", 967 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 968 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 969 | "dev": true 970 | }, 971 | "lodash.padend": { 972 | "version": "4.6.1", 973 | "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", 974 | "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", 975 | "dev": true 976 | }, 977 | "lodash.unescape": { 978 | "version": "4.0.1", 979 | "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", 980 | "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", 981 | "dev": true 982 | }, 983 | "loud-rejection": { 984 | "version": "1.6.0", 985 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 986 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 987 | "requires": { 988 | "currently-unhandled": "^0.4.1", 989 | "signal-exit": "^3.0.0" 990 | } 991 | }, 992 | "magic-string": { 993 | "version": "0.22.5", 994 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", 995 | "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", 996 | "dev": true, 997 | "requires": { 998 | "vlq": "^0.2.2" 999 | } 1000 | }, 1001 | "make-dir": { 1002 | "version": "3.0.0", 1003 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", 1004 | "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", 1005 | "requires": { 1006 | "semver": "^6.0.0" 1007 | }, 1008 | "dependencies": { 1009 | "semver": { 1010 | "version": "6.3.0", 1011 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1012 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1013 | } 1014 | } 1015 | }, 1016 | "map-age-cleaner": { 1017 | "version": "0.1.3", 1018 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1019 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1020 | "dev": true, 1021 | "requires": { 1022 | "p-defer": "^1.0.0" 1023 | } 1024 | }, 1025 | "map-obj": { 1026 | "version": "2.0.0", 1027 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", 1028 | "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" 1029 | }, 1030 | "mem": { 1031 | "version": "4.3.0", 1032 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 1033 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 1034 | "dev": true, 1035 | "requires": { 1036 | "map-age-cleaner": "^0.1.1", 1037 | "mimic-fn": "^2.0.0", 1038 | "p-is-promise": "^2.0.0" 1039 | } 1040 | }, 1041 | "meow": { 1042 | "version": "5.0.0", 1043 | "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", 1044 | "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", 1045 | "requires": { 1046 | "camelcase-keys": "^4.0.0", 1047 | "decamelize-keys": "^1.0.0", 1048 | "loud-rejection": "^1.0.0", 1049 | "minimist-options": "^3.0.1", 1050 | "normalize-package-data": "^2.3.4", 1051 | "read-pkg-up": "^3.0.0", 1052 | "redent": "^2.0.0", 1053 | "trim-newlines": "^2.0.0", 1054 | "yargs-parser": "^10.0.0" 1055 | } 1056 | }, 1057 | "merge-source-map": { 1058 | "version": "1.0.4", 1059 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", 1060 | "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", 1061 | "dev": true, 1062 | "requires": { 1063 | "source-map": "^0.5.6" 1064 | }, 1065 | "dependencies": { 1066 | "source-map": { 1067 | "version": "0.5.7", 1068 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1069 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1070 | "dev": true 1071 | } 1072 | } 1073 | }, 1074 | "mimic-fn": { 1075 | "version": "2.1.0", 1076 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1077 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1078 | "dev": true 1079 | }, 1080 | "minimatch": { 1081 | "version": "3.0.4", 1082 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1083 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1084 | "dev": true, 1085 | "requires": { 1086 | "brace-expansion": "^1.1.7" 1087 | } 1088 | }, 1089 | "minimist": { 1090 | "version": "1.2.0", 1091 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1092 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1093 | "dev": true 1094 | }, 1095 | "minimist-options": { 1096 | "version": "3.0.2", 1097 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", 1098 | "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", 1099 | "requires": { 1100 | "arrify": "^1.0.1", 1101 | "is-plain-obj": "^1.1.0" 1102 | } 1103 | }, 1104 | "moment": { 1105 | "version": "2.24.0", 1106 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", 1107 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", 1108 | "dev": true 1109 | }, 1110 | "nice-try": { 1111 | "version": "1.0.5", 1112 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1113 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1114 | "dev": true 1115 | }, 1116 | "node-fetch": { 1117 | "version": "1.7.3", 1118 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", 1119 | "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", 1120 | "dev": true, 1121 | "requires": { 1122 | "encoding": "^0.1.11", 1123 | "is-stream": "^1.0.1" 1124 | } 1125 | }, 1126 | "normalize-package-data": { 1127 | "version": "2.5.0", 1128 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1129 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1130 | "requires": { 1131 | "hosted-git-info": "^2.1.4", 1132 | "resolve": "^1.10.0", 1133 | "semver": "2 || 3 || 4 || 5", 1134 | "validate-npm-package-license": "^3.0.1" 1135 | } 1136 | }, 1137 | "npm-run-path": { 1138 | "version": "2.0.2", 1139 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1140 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1141 | "dev": true, 1142 | "requires": { 1143 | "path-key": "^2.0.0" 1144 | }, 1145 | "dependencies": { 1146 | "path-key": { 1147 | "version": "2.0.1", 1148 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1149 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1150 | "dev": true 1151 | } 1152 | } 1153 | }, 1154 | "number-is-nan": { 1155 | "version": "1.0.1", 1156 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1157 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1158 | "dev": true 1159 | }, 1160 | "object-inspect": { 1161 | "version": "1.4.1", 1162 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", 1163 | "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", 1164 | "dev": true 1165 | }, 1166 | "object-keys": { 1167 | "version": "1.1.1", 1168 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1169 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1170 | }, 1171 | "once": { 1172 | "version": "1.4.0", 1173 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1174 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1175 | "dev": true, 1176 | "requires": { 1177 | "wrappy": "1" 1178 | } 1179 | }, 1180 | "optionator": { 1181 | "version": "0.8.2", 1182 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1183 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1184 | "dev": true, 1185 | "requires": { 1186 | "deep-is": "~0.1.3", 1187 | "fast-levenshtein": "~2.0.4", 1188 | "levn": "~0.3.0", 1189 | "prelude-ls": "~1.1.2", 1190 | "type-check": "~0.3.2", 1191 | "wordwrap": "~1.0.0" 1192 | } 1193 | }, 1194 | "os-locale": { 1195 | "version": "3.1.0", 1196 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 1197 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 1198 | "dev": true, 1199 | "requires": { 1200 | "execa": "^1.0.0", 1201 | "lcid": "^2.0.0", 1202 | "mem": "^4.0.0" 1203 | } 1204 | }, 1205 | "p-defer": { 1206 | "version": "1.0.0", 1207 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1208 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 1209 | "dev": true 1210 | }, 1211 | "p-finally": { 1212 | "version": "1.0.0", 1213 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1214 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1215 | "dev": true 1216 | }, 1217 | "p-is-promise": { 1218 | "version": "2.1.0", 1219 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 1220 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", 1221 | "dev": true 1222 | }, 1223 | "p-limit": { 1224 | "version": "2.2.1", 1225 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 1226 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 1227 | "requires": { 1228 | "p-try": "^2.0.0" 1229 | } 1230 | }, 1231 | "p-locate": { 1232 | "version": "4.1.0", 1233 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1234 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1235 | "requires": { 1236 | "p-limit": "^2.2.0" 1237 | } 1238 | }, 1239 | "p-try": { 1240 | "version": "2.2.0", 1241 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1242 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1243 | }, 1244 | "pako": { 1245 | "version": "1.0.10", 1246 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 1247 | "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", 1248 | "dev": true 1249 | }, 1250 | "parse-json": { 1251 | "version": "4.0.0", 1252 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1253 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1254 | "requires": { 1255 | "error-ex": "^1.3.1", 1256 | "json-parse-better-errors": "^1.0.1" 1257 | } 1258 | }, 1259 | "path-exists": { 1260 | "version": "4.0.0", 1261 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1262 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 1263 | }, 1264 | "path-is-absolute": { 1265 | "version": "1.0.1", 1266 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1267 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1268 | "dev": true 1269 | }, 1270 | "path-key": { 1271 | "version": "3.1.0", 1272 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", 1273 | "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==" 1274 | }, 1275 | "path-parse": { 1276 | "version": "1.0.6", 1277 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1278 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1279 | }, 1280 | "path-type": { 1281 | "version": "3.0.0", 1282 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 1283 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 1284 | "requires": { 1285 | "pify": "^3.0.0" 1286 | } 1287 | }, 1288 | "pify": { 1289 | "version": "3.0.0", 1290 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1291 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1292 | }, 1293 | "pluralize": { 1294 | "version": "7.0.0", 1295 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1296 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1297 | "dev": true 1298 | }, 1299 | "prelude-ls": { 1300 | "version": "1.1.2", 1301 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1302 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1303 | "dev": true 1304 | }, 1305 | "prettier": { 1306 | "version": "1.18.2", 1307 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", 1308 | "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", 1309 | "dev": true 1310 | }, 1311 | "process-nextick-args": { 1312 | "version": "2.0.1", 1313 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1314 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1315 | "dev": true 1316 | }, 1317 | "pump": { 1318 | "version": "3.0.0", 1319 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1320 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1321 | "dev": true, 1322 | "requires": { 1323 | "end-of-stream": "^1.1.0", 1324 | "once": "^1.3.1" 1325 | } 1326 | }, 1327 | "quick-lru": { 1328 | "version": "1.1.0", 1329 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", 1330 | "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" 1331 | }, 1332 | "quicktype": { 1333 | "version": "15.0.202", 1334 | "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-15.0.202.tgz", 1335 | "integrity": "sha512-IQ594JwrcIx2iL4IEnt47e/B0ziSM/UgJn/jWlmLDPcsTHn+GxtihxlkN6xt/91bu3NnjbWF3214/qnCAmQVeg==", 1336 | "dev": true, 1337 | "requires": { 1338 | "@mark.probst/typescript-json-schema": "~0.32.0", 1339 | "@mark.probst/unicode-properties": "~1.1.0", 1340 | "chalk": "^2.4.1", 1341 | "collection-utils": "^1.0.1", 1342 | "command-line-args": "^4.0.6", 1343 | "command-line-usage": "^5.0.5", 1344 | "graphql": "^0.11.7", 1345 | "is-url": "^1.2.4", 1346 | "js-base64": "^2.4.3", 1347 | "lodash": "^4.17.10", 1348 | "moment": "^2.22.1", 1349 | "node-fetch": "^1.7.1", 1350 | "pako": "^1.0.6", 1351 | "pluralize": "^7.0.0", 1352 | "stream-json": "1.1.3", 1353 | "string-to-stream": "^1.1.0", 1354 | "urijs": "^1.19.1", 1355 | "uuid": "^3.2.1", 1356 | "wordwrap": "^1.0.0", 1357 | "yaml": "^1.5.0" 1358 | } 1359 | }, 1360 | "quote-stream": { 1361 | "version": "1.0.2", 1362 | "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", 1363 | "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", 1364 | "dev": true, 1365 | "requires": { 1366 | "buffer-equal": "0.0.1", 1367 | "minimist": "^1.1.3", 1368 | "through2": "^2.0.0" 1369 | } 1370 | }, 1371 | "read-pkg": { 1372 | "version": "3.0.0", 1373 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 1374 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 1375 | "requires": { 1376 | "load-json-file": "^4.0.0", 1377 | "normalize-package-data": "^2.3.2", 1378 | "path-type": "^3.0.0" 1379 | } 1380 | }, 1381 | "read-pkg-up": { 1382 | "version": "3.0.0", 1383 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", 1384 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", 1385 | "requires": { 1386 | "find-up": "^2.0.0", 1387 | "read-pkg": "^3.0.0" 1388 | }, 1389 | "dependencies": { 1390 | "find-up": { 1391 | "version": "2.1.0", 1392 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1393 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1394 | "requires": { 1395 | "locate-path": "^2.0.0" 1396 | } 1397 | }, 1398 | "locate-path": { 1399 | "version": "2.0.0", 1400 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1401 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1402 | "requires": { 1403 | "p-locate": "^2.0.0", 1404 | "path-exists": "^3.0.0" 1405 | }, 1406 | "dependencies": { 1407 | "path-exists": { 1408 | "version": "3.0.0", 1409 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1410 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1411 | } 1412 | } 1413 | }, 1414 | "p-limit": { 1415 | "version": "1.3.0", 1416 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1417 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1418 | "requires": { 1419 | "p-try": "^1.0.0" 1420 | } 1421 | }, 1422 | "p-locate": { 1423 | "version": "2.0.0", 1424 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1425 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1426 | "requires": { 1427 | "p-limit": "^1.1.0" 1428 | } 1429 | }, 1430 | "p-try": { 1431 | "version": "1.0.0", 1432 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1433 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 1434 | } 1435 | } 1436 | }, 1437 | "readable-stream": { 1438 | "version": "2.3.6", 1439 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1440 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1441 | "dev": true, 1442 | "requires": { 1443 | "core-util-is": "~1.0.0", 1444 | "inherits": "~2.0.3", 1445 | "isarray": "~1.0.0", 1446 | "process-nextick-args": "~2.0.0", 1447 | "safe-buffer": "~5.1.1", 1448 | "string_decoder": "~1.1.1", 1449 | "util-deprecate": "~1.0.1" 1450 | } 1451 | }, 1452 | "redent": { 1453 | "version": "2.0.0", 1454 | "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", 1455 | "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", 1456 | "requires": { 1457 | "indent-string": "^3.0.0", 1458 | "strip-indent": "^2.0.0" 1459 | } 1460 | }, 1461 | "reduce-flatten": { 1462 | "version": "1.0.1", 1463 | "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", 1464 | "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", 1465 | "dev": true 1466 | }, 1467 | "regenerator-runtime": { 1468 | "version": "0.13.3", 1469 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", 1470 | "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", 1471 | "dev": true 1472 | }, 1473 | "regexpp": { 1474 | "version": "2.0.1", 1475 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1476 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1477 | "dev": true 1478 | }, 1479 | "require-directory": { 1480 | "version": "2.1.1", 1481 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1482 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1483 | "dev": true 1484 | }, 1485 | "require-main-filename": { 1486 | "version": "1.0.1", 1487 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1488 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 1489 | "dev": true 1490 | }, 1491 | "resolve": { 1492 | "version": "1.12.0", 1493 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 1494 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 1495 | "requires": { 1496 | "path-parse": "^1.0.6" 1497 | } 1498 | }, 1499 | "safe-buffer": { 1500 | "version": "5.1.2", 1501 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1502 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1503 | "dev": true 1504 | }, 1505 | "safer-buffer": { 1506 | "version": "2.1.2", 1507 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1508 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1509 | "dev": true 1510 | }, 1511 | "semver": { 1512 | "version": "5.7.1", 1513 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1514 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1515 | }, 1516 | "set-blocking": { 1517 | "version": "2.0.0", 1518 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1519 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1520 | "dev": true 1521 | }, 1522 | "shallow-copy": { 1523 | "version": "0.0.1", 1524 | "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", 1525 | "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", 1526 | "dev": true 1527 | }, 1528 | "shebang-command": { 1529 | "version": "1.2.0", 1530 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1531 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1532 | "requires": { 1533 | "shebang-regex": "^1.0.0" 1534 | } 1535 | }, 1536 | "shebang-regex": { 1537 | "version": "1.0.0", 1538 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1539 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1540 | }, 1541 | "signal-exit": { 1542 | "version": "3.0.2", 1543 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1544 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1545 | }, 1546 | "source-map": { 1547 | "version": "0.6.1", 1548 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1549 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1550 | "dev": true, 1551 | "optional": true 1552 | }, 1553 | "spdx-correct": { 1554 | "version": "3.1.0", 1555 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1556 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1557 | "requires": { 1558 | "spdx-expression-parse": "^3.0.0", 1559 | "spdx-license-ids": "^3.0.0" 1560 | } 1561 | }, 1562 | "spdx-exceptions": { 1563 | "version": "2.2.0", 1564 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1565 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 1566 | }, 1567 | "spdx-expression-parse": { 1568 | "version": "3.0.0", 1569 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1570 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1571 | "requires": { 1572 | "spdx-exceptions": "^2.1.0", 1573 | "spdx-license-ids": "^3.0.0" 1574 | } 1575 | }, 1576 | "spdx-license-ids": { 1577 | "version": "3.0.5", 1578 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 1579 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 1580 | }, 1581 | "static-eval": { 1582 | "version": "2.0.2", 1583 | "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", 1584 | "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", 1585 | "dev": true, 1586 | "requires": { 1587 | "escodegen": "^1.8.1" 1588 | } 1589 | }, 1590 | "static-module": { 1591 | "version": "2.2.5", 1592 | "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", 1593 | "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", 1594 | "dev": true, 1595 | "requires": { 1596 | "concat-stream": "~1.6.0", 1597 | "convert-source-map": "^1.5.1", 1598 | "duplexer2": "~0.1.4", 1599 | "escodegen": "~1.9.0", 1600 | "falafel": "^2.1.0", 1601 | "has": "^1.0.1", 1602 | "magic-string": "^0.22.4", 1603 | "merge-source-map": "1.0.4", 1604 | "object-inspect": "~1.4.0", 1605 | "quote-stream": "~1.0.2", 1606 | "readable-stream": "~2.3.3", 1607 | "shallow-copy": "~0.0.1", 1608 | "static-eval": "^2.0.0", 1609 | "through2": "~2.0.3" 1610 | } 1611 | }, 1612 | "stream-chain": { 1613 | "version": "2.1.0", 1614 | "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.1.0.tgz", 1615 | "integrity": "sha512-PAUXdRGm0G8P0+/+JEd3O9kfmB9kwmr2nKIc5zhcsHn0KdBByD5PJ2po21iDzc+TZsOSEbU8j4JbAevJsZkLyQ==", 1616 | "dev": true 1617 | }, 1618 | "stream-json": { 1619 | "version": "1.1.3", 1620 | "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.1.3.tgz", 1621 | "integrity": "sha512-y+ChhCov2A5nDqC2aZ6HKXs3OvDlvAp0Ps3BF1P/Iv8tUZJQQsMVaSzk0WryVTVoGITKv01UYahCXMpAs7I0lQ==", 1622 | "dev": true, 1623 | "requires": { 1624 | "stream-chain": "^2.0.3" 1625 | } 1626 | }, 1627 | "string-to-stream": { 1628 | "version": "1.1.1", 1629 | "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz", 1630 | "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==", 1631 | "dev": true, 1632 | "requires": { 1633 | "inherits": "^2.0.1", 1634 | "readable-stream": "^2.1.0" 1635 | } 1636 | }, 1637 | "string-width": { 1638 | "version": "2.1.1", 1639 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1640 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1641 | "dev": true, 1642 | "requires": { 1643 | "is-fullwidth-code-point": "^2.0.0", 1644 | "strip-ansi": "^4.0.0" 1645 | } 1646 | }, 1647 | "string.prototype.replaceall": { 1648 | "version": "1.0.0", 1649 | "resolved": "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.0.tgz", 1650 | "integrity": "sha512-WwUugMs5mRmfjlaF8v6262hf5O3mEfQLY11TQAu4Q4BVUaHBN3RXNhuhSXBnWgk0OGBOFAWW4MajIKiIP2bMIg==", 1651 | "requires": { 1652 | "es-abstract": "^1.14.1", 1653 | "function-bind": "^1.1.1", 1654 | "has-symbols": "^1.0.0", 1655 | "is-regex": "^1.0.4" 1656 | } 1657 | }, 1658 | "string.prototype.trimleft": { 1659 | "version": "2.1.0", 1660 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1661 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1662 | "requires": { 1663 | "define-properties": "^1.1.3", 1664 | "function-bind": "^1.1.1" 1665 | } 1666 | }, 1667 | "string.prototype.trimright": { 1668 | "version": "2.1.0", 1669 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1670 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1671 | "requires": { 1672 | "define-properties": "^1.1.3", 1673 | "function-bind": "^1.1.1" 1674 | } 1675 | }, 1676 | "string_decoder": { 1677 | "version": "1.1.1", 1678 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1679 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1680 | "dev": true, 1681 | "requires": { 1682 | "safe-buffer": "~5.1.0" 1683 | } 1684 | }, 1685 | "strip-ansi": { 1686 | "version": "4.0.0", 1687 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1688 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1689 | "dev": true, 1690 | "requires": { 1691 | "ansi-regex": "^3.0.0" 1692 | } 1693 | }, 1694 | "strip-bom": { 1695 | "version": "3.0.0", 1696 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1697 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 1698 | }, 1699 | "strip-eof": { 1700 | "version": "1.0.0", 1701 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1702 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 1703 | "dev": true 1704 | }, 1705 | "strip-indent": { 1706 | "version": "2.0.0", 1707 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", 1708 | "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" 1709 | }, 1710 | "supports-color": { 1711 | "version": "5.5.0", 1712 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1713 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1714 | "requires": { 1715 | "has-flag": "^3.0.0" 1716 | } 1717 | }, 1718 | "table-layout": { 1719 | "version": "0.4.5", 1720 | "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", 1721 | "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", 1722 | "dev": true, 1723 | "requires": { 1724 | "array-back": "^2.0.0", 1725 | "deep-extend": "~0.6.0", 1726 | "lodash.padend": "^4.6.1", 1727 | "typical": "^2.6.1", 1728 | "wordwrapjs": "^3.0.0" 1729 | } 1730 | }, 1731 | "test-value": { 1732 | "version": "2.1.0", 1733 | "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", 1734 | "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", 1735 | "dev": true, 1736 | "requires": { 1737 | "array-back": "^1.0.3", 1738 | "typical": "^2.6.0" 1739 | }, 1740 | "dependencies": { 1741 | "array-back": { 1742 | "version": "1.0.4", 1743 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", 1744 | "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", 1745 | "dev": true, 1746 | "requires": { 1747 | "typical": "^2.6.0" 1748 | } 1749 | } 1750 | } 1751 | }, 1752 | "through2": { 1753 | "version": "2.0.5", 1754 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1755 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1756 | "dev": true, 1757 | "requires": { 1758 | "readable-stream": "~2.3.6", 1759 | "xtend": "~4.0.1" 1760 | } 1761 | }, 1762 | "tiny-inflate": { 1763 | "version": "1.0.2", 1764 | "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz", 1765 | "integrity": "sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c=", 1766 | "dev": true 1767 | }, 1768 | "trim-newlines": { 1769 | "version": "2.0.0", 1770 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", 1771 | "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" 1772 | }, 1773 | "tslib": { 1774 | "version": "1.10.0", 1775 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1776 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1777 | "dev": true 1778 | }, 1779 | "tsutils": { 1780 | "version": "3.17.1", 1781 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 1782 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 1783 | "dev": true, 1784 | "requires": { 1785 | "tslib": "^1.8.1" 1786 | } 1787 | }, 1788 | "type-check": { 1789 | "version": "0.3.2", 1790 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1791 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1792 | "dev": true, 1793 | "requires": { 1794 | "prelude-ls": "~1.1.2" 1795 | } 1796 | }, 1797 | "typedarray": { 1798 | "version": "0.0.6", 1799 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1800 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1801 | "dev": true 1802 | }, 1803 | "typescript": { 1804 | "version": "3.3.3", 1805 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", 1806 | "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", 1807 | "dev": true 1808 | }, 1809 | "typical": { 1810 | "version": "2.6.1", 1811 | "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", 1812 | "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=", 1813 | "dev": true 1814 | }, 1815 | "unicode-trie": { 1816 | "version": "0.3.1", 1817 | "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", 1818 | "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", 1819 | "dev": true, 1820 | "requires": { 1821 | "pako": "^0.2.5", 1822 | "tiny-inflate": "^1.0.0" 1823 | }, 1824 | "dependencies": { 1825 | "pako": { 1826 | "version": "0.2.9", 1827 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 1828 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 1829 | "dev": true 1830 | } 1831 | } 1832 | }, 1833 | "urijs": { 1834 | "version": "1.19.1", 1835 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", 1836 | "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==", 1837 | "dev": true 1838 | }, 1839 | "util-deprecate": { 1840 | "version": "1.0.2", 1841 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1842 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1843 | "dev": true 1844 | }, 1845 | "uuid": { 1846 | "version": "3.3.3", 1847 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1848 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", 1849 | "dev": true 1850 | }, 1851 | "validate-npm-package-license": { 1852 | "version": "3.0.4", 1853 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1854 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1855 | "requires": { 1856 | "spdx-correct": "^3.0.0", 1857 | "spdx-expression-parse": "^3.0.0" 1858 | } 1859 | }, 1860 | "vlq": { 1861 | "version": "0.2.3", 1862 | "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", 1863 | "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", 1864 | "dev": true 1865 | }, 1866 | "which": { 1867 | "version": "1.3.1", 1868 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1869 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1870 | "requires": { 1871 | "isexe": "^2.0.0" 1872 | } 1873 | }, 1874 | "which-module": { 1875 | "version": "2.0.0", 1876 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1877 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1878 | "dev": true 1879 | }, 1880 | "wordwrap": { 1881 | "version": "1.0.0", 1882 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1883 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1884 | "dev": true 1885 | }, 1886 | "wordwrapjs": { 1887 | "version": "3.0.0", 1888 | "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", 1889 | "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", 1890 | "dev": true, 1891 | "requires": { 1892 | "reduce-flatten": "^1.0.1", 1893 | "typical": "^2.6.1" 1894 | } 1895 | }, 1896 | "wrap-ansi": { 1897 | "version": "2.1.0", 1898 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1899 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1900 | "dev": true, 1901 | "requires": { 1902 | "string-width": "^1.0.1", 1903 | "strip-ansi": "^3.0.1" 1904 | }, 1905 | "dependencies": { 1906 | "ansi-regex": { 1907 | "version": "2.1.1", 1908 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1909 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1910 | "dev": true 1911 | }, 1912 | "is-fullwidth-code-point": { 1913 | "version": "1.0.0", 1914 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1915 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1916 | "dev": true, 1917 | "requires": { 1918 | "number-is-nan": "^1.0.0" 1919 | } 1920 | }, 1921 | "string-width": { 1922 | "version": "1.0.2", 1923 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1924 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1925 | "dev": true, 1926 | "requires": { 1927 | "code-point-at": "^1.0.0", 1928 | "is-fullwidth-code-point": "^1.0.0", 1929 | "strip-ansi": "^3.0.0" 1930 | } 1931 | }, 1932 | "strip-ansi": { 1933 | "version": "3.0.1", 1934 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1935 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1936 | "dev": true, 1937 | "requires": { 1938 | "ansi-regex": "^2.0.0" 1939 | } 1940 | } 1941 | } 1942 | }, 1943 | "wrappy": { 1944 | "version": "1.0.2", 1945 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1946 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1947 | "dev": true 1948 | }, 1949 | "xtend": { 1950 | "version": "4.0.2", 1951 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1952 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1953 | "dev": true 1954 | }, 1955 | "y18n": { 1956 | "version": "4.0.0", 1957 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1958 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1959 | "dev": true 1960 | }, 1961 | "yaml": { 1962 | "version": "1.6.0", 1963 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.6.0.tgz", 1964 | "integrity": "sha512-iZfse3lwrJRoSlfs/9KQ9iIXxs9++RvBFVzAqbbBiFT+giYtyanevreF9r61ZTbGMgWQBxAua3FzJiniiJXWWw==", 1965 | "dev": true, 1966 | "requires": { 1967 | "@babel/runtime": "^7.4.5" 1968 | } 1969 | }, 1970 | "yargs": { 1971 | "version": "12.0.5", 1972 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", 1973 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", 1974 | "dev": true, 1975 | "requires": { 1976 | "cliui": "^4.0.0", 1977 | "decamelize": "^1.2.0", 1978 | "find-up": "^3.0.0", 1979 | "get-caller-file": "^1.0.1", 1980 | "os-locale": "^3.0.0", 1981 | "require-directory": "^2.1.1", 1982 | "require-main-filename": "^1.0.1", 1983 | "set-blocking": "^2.0.0", 1984 | "string-width": "^2.0.0", 1985 | "which-module": "^2.0.0", 1986 | "y18n": "^3.2.1 || ^4.0.0", 1987 | "yargs-parser": "^11.1.1" 1988 | }, 1989 | "dependencies": { 1990 | "camelcase": { 1991 | "version": "5.3.1", 1992 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1993 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 1994 | "dev": true 1995 | }, 1996 | "find-up": { 1997 | "version": "3.0.0", 1998 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1999 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 2000 | "dev": true, 2001 | "requires": { 2002 | "locate-path": "^3.0.0" 2003 | } 2004 | }, 2005 | "locate-path": { 2006 | "version": "3.0.0", 2007 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 2008 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 2009 | "dev": true, 2010 | "requires": { 2011 | "p-locate": "^3.0.0", 2012 | "path-exists": "^3.0.0" 2013 | }, 2014 | "dependencies": { 2015 | "path-exists": { 2016 | "version": "3.0.0", 2017 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2018 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2019 | "dev": true 2020 | } 2021 | } 2022 | }, 2023 | "p-limit": { 2024 | "version": "2.2.1", 2025 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 2026 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 2027 | "dev": true, 2028 | "requires": { 2029 | "p-try": "^2.0.0" 2030 | } 2031 | }, 2032 | "p-locate": { 2033 | "version": "3.0.0", 2034 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 2035 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 2036 | "dev": true, 2037 | "requires": { 2038 | "p-limit": "^2.0.0" 2039 | } 2040 | }, 2041 | "p-try": { 2042 | "version": "2.2.0", 2043 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2044 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2045 | "dev": true 2046 | }, 2047 | "yargs-parser": { 2048 | "version": "11.1.1", 2049 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", 2050 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", 2051 | "dev": true, 2052 | "requires": { 2053 | "camelcase": "^5.0.0", 2054 | "decamelize": "^1.2.0" 2055 | } 2056 | } 2057 | } 2058 | }, 2059 | "yargs-parser": { 2060 | "version": "10.1.0", 2061 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", 2062 | "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", 2063 | "requires": { 2064 | "camelcase": "^4.1.0" 2065 | } 2066 | } 2067 | } 2068 | } 2069 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "naw", 3 | "version": "0.2.0", 4 | "description": "Your very own containerized build system!", 5 | "main": "index.js", 6 | "keywords": [], 7 | "author": "Jamie Kyle ", 8 | "license": "MIT", 9 | "files": [ 10 | "dist", 11 | "config.schema.json" 12 | ], 13 | "bin": { 14 | "naw": "./dist/cli.js" 15 | }, 16 | "scripts": { 17 | "format": "prettier --write '**'", 18 | "build": "rm -rf dist && mkdir dist && npm run -s build:codegen && npm run -s build:schema && npm run -s build:src && npm run -s build:dockerfiles", 19 | "build:codegen": "quicktype ./src/config/types.src.ts -o ./src/config/types.gen.ts -l ts --runtime-typecheck --top-level Config --converters top-level --acronym-style original", 20 | "build:schema": "quicktype ./src/config/types.src.ts -o ./dist/naw-config.schema.json -l schema", 21 | "build:src": "tsc && chmod +x ./dist/cli.js", 22 | "build:dockerfiles": "mkdir -p dist && cp -r ./src/dockerfiles ./dist", 23 | "prepublishOnly": "npm run -s build" 24 | }, 25 | "dependencies": { 26 | "chalk": "^2.4.2", 27 | "cross-spawn": "^7.0.0", 28 | "extract-stack": "^2.0.0", 29 | "find-up": "^4.1.0", 30 | "make-dir": "^3.0.0", 31 | "meow": "^5.0.0", 32 | "path-exists": "^4.0.0", 33 | "string.prototype.replaceall": "^1.0.0" 34 | }, 35 | "devDependencies": { 36 | "@types/cross-spawn": "^6.0.0", 37 | "@types/meow": "^5.0.0", 38 | "@types/node": "^12.7.5", 39 | "@typescript-eslint/eslint-plugin": "^1.3.0", 40 | "@typescript-eslint/parser": "^2.3.1", 41 | "prettier": "^1.18.2", 42 | "quicktype": "^15.0.202", 43 | "typescript": "3.3.3" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import meow from "meow" 3 | import chalk from "chalk" 4 | import replaceAll from "string.prototype.replaceall" 5 | import extractStack from "extract-stack" 6 | import * as commands from "./commands" 7 | import { println } from "./logger" 8 | import { ProcessError } from "./spawn" 9 | 10 | let ERROR_TYPE_REGEX = /^([a-zA-Z]*Error)(: )?/ 11 | let startTime = Date.now() 12 | 13 | let cli = meow({ 14 | help: ` 15 | Usage 16 | $ naw 17 | $ naw --init Init a new naw project 18 | $ naw Run 19 | $ naw --build/-b Build 20 | $ naw --test/-t Test 21 | $ naw --debug/-d Debug 22 | $ naw --debug --test Debug tests 23 | $ naw --build --debug Build+Debug 24 | `, 25 | flags: { 26 | init: { 27 | type: "boolean", 28 | }, 29 | build: { 30 | type: "boolean", 31 | alias: "b", 32 | }, 33 | test: { 34 | type: "boolean", 35 | alias: "t", 36 | }, 37 | debug: { 38 | type: "boolean", 39 | alias: "d", 40 | }, 41 | }, 42 | }) 43 | 44 | interface Flags { 45 | init?: boolean 46 | build?: boolean 47 | test?: boolean 48 | debug?: boolean 49 | } 50 | 51 | async function main(cwd: string, input: string[], flags: Flags) { 52 | let taskName = input[0] 53 | let init = flags.init 54 | let build = flags.build 55 | let test = flags.test 56 | let debug = flags.debug 57 | 58 | if (build || test || debug) { 59 | if (init) { 60 | throw new Error("--init should not have any other flags") 61 | } 62 | 63 | if (!taskName) { 64 | throw new Error("Missing input") 65 | } 66 | } 67 | 68 | if (!taskName && !init && !build && !test && !debug) { 69 | await commands.listTasks(cwd) 70 | } else if (!taskName && init && !build && !test && !debug) { 71 | await commands.initProject(cwd) 72 | } else if (taskName && !init && !build && !test && !debug) { 73 | await commands.runTask(cwd, taskName) 74 | } else if (taskName && build && !init && !test && !debug) { 75 | await commands.buildTask(cwd, taskName) 76 | } else if (taskName && test && !init && !build && !debug) { 77 | await commands.testTask(cwd, taskName) 78 | } else if (taskName && test && build && !init && !debug) { 79 | // Allow unnecessary --build 80 | await commands.testTask(cwd, taskName) 81 | } else if (taskName && debug && !init && !build && !test) { 82 | await commands.debugTask(cwd, taskName) 83 | } else if (taskName && debug && test && !init && !build) { 84 | await commands.debugTaskTests(cwd, taskName) 85 | } else if (taskName && debug && test && build && !init) { 86 | // Allow unnecessary --build 87 | await commands.debugTaskTests(cwd, taskName) 88 | } else if (taskName && build && debug && !init && !test) { 89 | await commands.buildAndDebugTask(cwd, taskName) 90 | } else { 91 | throw new Error("Unexpected set of flags") 92 | } 93 | } 94 | 95 | let argv = process.argv.slice(2) 96 | let finalError: null | Error = null 97 | 98 | println("{dim %s ({magenta v%s})}", ["naw", ...argv].join(" "), cli.pkg.version) 99 | 100 | main(process.cwd(), cli.input, cli.flags) 101 | .catch(err => { 102 | finalError = err 103 | 104 | if (err instanceof ProcessError && err.code === 1) { 105 | return 106 | } 107 | 108 | let [type] = err.stack.match(ERROR_TYPE_REGEX) 109 | let message = replaceAll(err.message, /"(.*?)"/g, chalk.cyan('"$1"')) 110 | let stack = chalk.italic(extractStack(err)) 111 | 112 | println("") 113 | println("{bold.red %s}{bold %s}\n{dim %s}", type, message, stack) 114 | println("") 115 | }) 116 | .then(() => { 117 | let endTime = Date.now() 118 | let duration = (endTime - startTime) / 1000 119 | let rounded = Math.round(duration * 100) / 100 120 | 121 | if (!finalError) { 122 | println("{dim %s ({cyan %ds})}", ["naw", ...argv].join(" "), rounded) 123 | process.exit(0) 124 | return 125 | } 126 | 127 | println("{dim %s ({red %ds})}", ["naw", ...argv].join(" "), rounded) 128 | 129 | if (!(finalError instanceof ProcessError)) { 130 | process.exit(2) 131 | return 132 | } 133 | 134 | if (finalError.signal) { 135 | process.kill(process.pid, finalError.signal) 136 | } else { 137 | process.exit(finalError.code) 138 | } 139 | }) 140 | -------------------------------------------------------------------------------- /src/commands.ts: -------------------------------------------------------------------------------- 1 | import * as Config from "./config" 2 | import * as Tasks from "./tasks" 3 | import * as Init from "./init" 4 | import { Mode } from "./spawn" 5 | import { println } from "./logger" 6 | 7 | export async function listTasks(cwd: string) { 8 | let config = await Config.getConfig(cwd) 9 | println("") 10 | println("{bold Available tasks:}") 11 | println("") 12 | for (let task of config.tasks) { 13 | println(" {bold.cyan %s} {dim %s}", task.taskName, task.taskDescription) 14 | } 15 | println("") 16 | println("{bold {magenta Tip!} To run a task:}") 17 | println("") 18 | println(" {magenta $} {bold naw {cyan }}") 19 | println("") 20 | println("{bold {magenta Tip!} For more help:}") 21 | println("") 22 | println(" {magenta $} {bold naw --help}") 23 | println("") 24 | } 25 | 26 | export async function initProject(cwd: string) { 27 | await Init.initProject(cwd) 28 | } 29 | 30 | export async function runTask(cwd: string, taskName: string) { 31 | let config = await Config.getConfig(cwd) 32 | let task = Tasks.findTask(config, taskName) 33 | println("") 34 | try { 35 | await Tasks.runTask(task, Tasks.Target.Builder, config.dirname) 36 | println("") 37 | } catch (err) { 38 | if (err.code !== 1) { 39 | println("") 40 | println("{bold {magenta Tip!} You may need to build this task:}") 41 | println("") 42 | println(" {magenta $} {bold naw {cyan %s} --build}", taskName) 43 | println("") 44 | println("{bold {magenta Tip!} To debug the container:}") 45 | println("") 46 | println(" {magenta $} {bold naw {cyan %s} --debug} ", taskName) 47 | } 48 | throw err 49 | } 50 | } 51 | 52 | export async function buildAndRunTask(cwd: string, taskName: string) { 53 | let config = await Config.getConfig(cwd) 54 | let task = Tasks.findTask(config, taskName) 55 | println("") 56 | println("{bold.magenta [1/1]} {bold Building} {bold.cyan %s}", taskName) 57 | await Tasks.buildTask(task, Mode.Quiet, config.dirname) 58 | println("") 59 | try { 60 | await Tasks.runTask(task, Tasks.Target.Builder, config.dirname) 61 | println("") 62 | } catch (err) { 63 | if (err.code !== 1) { 64 | println("") 65 | println("{bold {magenta Tip!} You may need to build this task:}") 66 | println("") 67 | println(" {magenta $} {bold naw {cyan %s} --build}", taskName) 68 | println("") 69 | println("{bold {magenta Tip!} To debug the container:}") 70 | println("") 71 | println(" {magenta $} {bold naw {cyan %s} --debug} ", taskName) 72 | } 73 | throw err 74 | } 75 | } 76 | 77 | export async function buildTask(cwd: string, taskName: string) { 78 | let config = await Config.getConfig(cwd) 79 | let task = Tasks.findTask(config, taskName) 80 | println("") 81 | println("{bold.magenta [1/1]} {bold Building} {bold.cyan %s}", taskName) 82 | await Tasks.buildTask(task, Mode.Quiet, config.dirname) 83 | println("{bold.green [success]} {bold Built} {bold.cyan %s}", taskName) 84 | println("") 85 | println("{bold {magenta Tip!} To run this task:}") 86 | println("") 87 | println(" {magenta $} {bold naw {cyan %s}}", taskName) 88 | println("") 89 | } 90 | 91 | export async function testTask(cwd: string, taskName: string) { 92 | let config = await Config.getConfig(cwd) 93 | let task = Tasks.findTask(config, taskName) 94 | println("") 95 | println("{bold.magenta [1/2]} {bold Building {cyan %s} tests}", taskName) 96 | await Tasks.buildTaskTester(task, Mode.Quiet, config.dirname) 97 | println("{bold.magenta [2/2]} {bold Testing {cyan %s}}", taskName) 98 | println("") 99 | await Tasks.runTask(task, Tasks.Target.Tester, cwd) 100 | println("") 101 | println("{bold.green [success]} {bold Tested {cyan %s}}", taskName) 102 | println("") 103 | } 104 | 105 | export async function debugTask(cwd: string, taskName: string) { 106 | let config = await Config.getConfig(cwd) 107 | let task = Tasks.findTask(config, taskName) 108 | println("") 109 | await Tasks.shellTask(task, Tasks.Target.Builder, config.dirname) 110 | println("") 111 | } 112 | 113 | export async function debugTaskTests(cwd: string, taskName: string) { 114 | let config = await Config.getConfig(cwd) 115 | let task = Tasks.findTask(config, taskName) 116 | println("") 117 | println("{bold.magenta [1/1]} {bold Building {cyan %s} tests}", taskName) 118 | await Tasks.buildTaskTester(task, Mode.Quiet, config.dirname) 119 | println("") 120 | await Tasks.shellTask(task, Tasks.Target.Tester, config.dirname) 121 | println("") 122 | } 123 | 124 | export async function buildAndDebugTask(cwd: string, taskName: string) { 125 | let config = await Config.getConfig(cwd) 126 | let task = Tasks.findTask(config, taskName) 127 | println("") 128 | println("{bold.magenta [1/1]} {bold Building {cyan %s}}", taskName) 129 | await Tasks.buildTask(task, Mode.Quiet, config.dirname) 130 | println("") 131 | await Tasks.shellTask(task, Tasks.Target.Builder, config.dirname) 132 | println("") 133 | } 134 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import path from "path" 2 | import fs from "fs" 3 | import { promisify } from "util" 4 | import { Convert } from "./config/types.gen" 5 | import { Config, Tasks, Task, TaskBuild } from "./config/types.src" 6 | import findUp from "find-up" 7 | 8 | let readFile = promisify(fs.readFile) 9 | 10 | export interface FinalConfig { 11 | dirname: string 12 | tasks: FinalTask[] 13 | } 14 | 15 | export interface FinalTaskBuild { 16 | buildContext: string 17 | buildDockerfile?: string 18 | buildArgs: string[] 19 | } 20 | 21 | export interface FinalTask extends FinalTaskBuild { 22 | taskName: string 23 | taskDescription: string 24 | environment: string[] 25 | args: string[] 26 | } 27 | 28 | export async function getConfig(cwd: string): Promise { 29 | let configPath = await findConfig(cwd) 30 | let config = await readConfig(configPath) 31 | return config 32 | } 33 | 34 | export async function findConfig(cwd: string): Promise { 35 | let found = await findUp(["naw.json"], { cwd }) 36 | if (!found) { 37 | throw new Error("Could not find naw.json from current directory") 38 | } 39 | return found 40 | } 41 | 42 | export async function readConfig(configPath: string): Promise { 43 | let dirname = path.dirname(configPath) 44 | let configFile = await readFile(configPath, "utf-8") 45 | let config = Convert.toConfig(configFile) 46 | return toFinalConfig(dirname, config) 47 | } 48 | 49 | function toFinalConfig(dirname: string, config: Config): FinalConfig { 50 | return { dirname, tasks: toFinalTasks(dirname, config.tasks) } 51 | } 52 | 53 | function toFinalTasks(dirname: string, tasks: Tasks): FinalTask[] { 54 | return Object.keys(tasks).map(taskName => { 55 | return toFinalTask(dirname, taskName, tasks[taskName]) 56 | }) 57 | } 58 | 59 | function toFinalTask(dirname: string, taskName: string, task: Task): FinalTask { 60 | return { 61 | taskName, 62 | taskDescription: task.description, 63 | ...toFinalTaskBuild(dirname, task.build), 64 | environment: toArrayOfKeyValuePairs(task.environment), 65 | args: task.args || [], 66 | } 67 | } 68 | 69 | function toFinalTaskBuild( 70 | dirname: string, 71 | build: string | TaskBuild, 72 | ): FinalTaskBuild { 73 | if (typeof build === "string") { 74 | return { 75 | buildContext: path.resolve(dirname, build), 76 | buildArgs: [], 77 | } 78 | } else { 79 | return { 80 | buildContext: path.resolve(dirname, build.context), 81 | buildDockerfile: build.dockerfile, 82 | buildArgs: toArrayOfKeyValuePairs(build.args), 83 | } 84 | } 85 | } 86 | 87 | function toArrayOfKeyValuePairs( 88 | input: undefined | string[] | { [key: string]: string }, 89 | ): string[] { 90 | if (typeof input === "undefined") { 91 | return [] 92 | } else if (Array.isArray(input)) { 93 | return input 94 | } else { 95 | return Object.keys(input).map(key => `${key}=${input[key]}`) 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/config/.gitignore: -------------------------------------------------------------------------------- 1 | types.gen.ts 2 | -------------------------------------------------------------------------------- /src/config/types.gen.d.ts: -------------------------------------------------------------------------------- 1 | import { Config } from "./types.src" 2 | 3 | export declare class Convert { 4 | static toConfig(json: string): Config 5 | static configToJson(value: Config): string 6 | } 7 | -------------------------------------------------------------------------------- /src/config/types.src.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Configuration 3 | */ 4 | export interface Config { 5 | tasks: Tasks 6 | } 7 | 8 | /** 9 | * Task configuration. 10 | */ 11 | export interface Tasks { 12 | [taskName: string]: Task 13 | } 14 | 15 | /** 16 | * A task. 17 | */ 18 | export interface Task { 19 | description: TaskDescription 20 | build: TaskBuild | TaskBuildContext 21 | args?: TaskArgs 22 | environment?: TaskEnvironment 23 | } 24 | 25 | /** 26 | * A description of the task 27 | */ 28 | export type TaskDescription = string 29 | 30 | /** 31 | * Configuration options that are applied at build time. 32 | */ 33 | export interface TaskBuild { 34 | context: TaskBuildContext 35 | dockerfile?: TaskBuildDockerfile 36 | args?: TaskBuildArgs 37 | } 38 | 39 | /** 40 | * A path to the build context. 41 | */ 42 | export type TaskBuildContext = string 43 | 44 | /** 45 | * Alternate Dockerfile. 46 | */ 47 | export type TaskBuildDockerfile = string 48 | 49 | /** 50 | * Add build arguments, which are environment variables accessible only during the build process. 51 | */ 52 | export type TaskBuildArgs = string[] | { [key: string]: string } 53 | 54 | /** 55 | * Replace arguments to pass to the container. 56 | */ 57 | export type TaskArgs = string[] 58 | 59 | /** 60 | * Add environment variables. 61 | */ 62 | export type TaskEnvironment = string[] | { [key: string]: string } 63 | -------------------------------------------------------------------------------- /src/dockerfiles/tester.Dockerfile: -------------------------------------------------------------------------------- 1 | ARG baseImage 2 | ARG testFiles 3 | FROM ${baseImage} 4 | WORKDIR / 5 | RUN git clone https://github.com/sstephenson/bats.git 6 | RUN ./bats/install.sh /usr/local 7 | COPY ${testFiles} . 8 | WORKDIR /workdir 9 | ENTRYPOINT [ "bats" ] 10 | CMD [ "/" ] 11 | -------------------------------------------------------------------------------- /src/init.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs" 2 | import path from "path" 3 | import util from "util" 4 | import makeDir from "make-dir" 5 | import pathExists from "path-exists" 6 | import { println } from "./logger" 7 | 8 | let writeFile = util.promisify(fs.writeFile) 9 | 10 | let CONFIG_FILE = JSON.stringify( 11 | { 12 | tasks: { 13 | example: { 14 | description: "Run an example build tool", 15 | build: "./tasks/example", 16 | args: [], 17 | }, 18 | }, 19 | }, 20 | null, 21 | 2, 22 | ) 23 | 24 | let DOCKERFILE = ` 25 | #### Stage: builder #### 26 | FROM buildpack-deps as builder 27 | WORKDIR / 28 | 29 | # Setup your tool... 30 | COPY script.sh . 31 | RUN chmod +x script.sh 32 | 33 | WORKDIR /workdir 34 | ENTRYPOINT [ "/script.sh" ] 35 | 36 | #### Stage: tester #### 37 | FROM builder as tester 38 | WORKDIR / 39 | RUN git clone https://github.com/sstephenson/bats.git 40 | RUN ./bats/install.sh /usr/local 41 | COPY test.bats . 42 | WORKDIR /workdir 43 | ENTRYPOINT [ "bats" ] 44 | CMD [ "/test.bats" ] 45 | `.trim() 46 | 47 | let SCRIPT_FILE = ` 48 | #!/bin/bash 49 | set -euo pipefail 50 | 51 | echo "Running an example build tool..." 52 | sleep 3 53 | echo "Success!" 54 | `.trim() 55 | 56 | let TEST_FILE = ` 57 | #!/usr/bin/env bats 58 | 59 | function setup() { 60 | touch fixture.txt 61 | } 62 | 63 | function teardown() { 64 | rm fixture.txt 65 | } 66 | 67 | @test "works" { 68 | run /script.sh 69 | [ "$status" -eq 0 ] 70 | [[ "$output" = *"Running an example build tool..."* ]] 71 | [[ "$output" = *"Success!"* ]] 72 | } 73 | `.trim() 74 | 75 | export async function initProject(cwd: string) { 76 | println("") 77 | 78 | if (await pathExists(path.join(cwd, "naw.json"))) { 79 | println("{bold Project already created.}") 80 | println("") 81 | return 82 | } 83 | 84 | println("{bold Creating a new naw project...}") 85 | println("") 86 | 87 | let dir = path.join(cwd, "tasks", "example") 88 | println("{green +} ./naw.json") 89 | await writeFile(path.join(cwd, "naw.json"), CONFIG_FILE + "\n") 90 | await makeDir(dir) 91 | println("{green +} ./tasks/example/Dockerfile") 92 | await writeFile(path.join(dir, "Dockerfile"), DOCKERFILE + "\n") 93 | println("{green +} ./tasks/example/script.sh") 94 | await writeFile(path.join(dir, "script.sh"), SCRIPT_FILE + "\n") 95 | println("{green +} ./tasks/example/test.bats") 96 | await writeFile(path.join(dir, "test.bats"), TEST_FILE + "\n") 97 | println("") 98 | } 99 | -------------------------------------------------------------------------------- /src/logger.ts: -------------------------------------------------------------------------------- 1 | import util from "util" 2 | import chalk from "chalk" 3 | 4 | export function println(message: string, ...values: unknown[]) { 5 | let formatted = util.format(message, ...values) 6 | let template: any = [formatted] // eslint-disable-line @typescript-eslint/no-explicit-any 7 | template.raw = template 8 | let colorized = chalk(template as TemplateStringsArray) 9 | process.stdout.write(colorized + "\n") 10 | } 11 | -------------------------------------------------------------------------------- /src/spawn.ts: -------------------------------------------------------------------------------- 1 | import crossSpawn from "cross-spawn" 2 | import readline from "readline" 3 | import chalk from "chalk" 4 | 5 | export enum Mode { 6 | Silent, 7 | Quiet, 8 | Loud, 9 | } 10 | 11 | export interface SpawnOptions { 12 | mode: Mode 13 | interactive: boolean 14 | } 15 | 16 | export class ProcessError extends Error { 17 | code?: number 18 | signal?: string 19 | constructor(code?: number, signal?: string) { 20 | super(`Child process failed (code: ${code}, signal: ${signal})`) 21 | this.code = code 22 | this.signal = signal 23 | } 24 | } 25 | 26 | function createOutputStream(mode: Mode) { 27 | let firstWrite = true 28 | 29 | function write(buffer: Buffer, kind: "stdout" | "stderr") { 30 | if (mode === Mode.Quiet) { 31 | let lines = buffer 32 | .toString() 33 | .trim() 34 | .split("\n") 35 | let latest = lines[lines.length - 1] 36 | if (firstWrite) { 37 | firstWrite = false 38 | } else { 39 | readline.clearLine(process.stdout, 0) 40 | readline.cursorTo(process.stdout, 0) 41 | } 42 | if (kind === "stderr") { 43 | process.stdout.write(chalk.red(latest)) 44 | } else { 45 | process.stdout.write(chalk.dim(latest)) 46 | } 47 | } 48 | } 49 | 50 | function end() { 51 | if (mode === Mode.Quiet) { 52 | if (!firstWrite) { 53 | readline.clearLine(process.stdout, 0) 54 | readline.cursorTo(process.stdout, 0) 55 | } 56 | } 57 | } 58 | 59 | return { write, end } 60 | } 61 | 62 | export default function spawn(cmd: string, args: string[], opts: SpawnOptions) { 63 | return new Promise((resolve, reject) => { 64 | let buffer = Buffer.from("") 65 | let child = crossSpawn(cmd, args, { 66 | stdio: opts.mode === Mode.Loud ? "inherit" : "pipe", 67 | shell: opts.interactive, 68 | }) 69 | let outputStream = createOutputStream(opts.mode) 70 | 71 | if (child.stdout) { 72 | child.stdout.on("data", (data: Buffer) => { 73 | buffer = Buffer.concat([buffer, data]) 74 | outputStream.write(data, "stdout") 75 | }) 76 | } 77 | 78 | if (child.stderr) { 79 | child.stderr.on("data", (data: Buffer) => { 80 | buffer = Buffer.concat([buffer, data]) 81 | outputStream.write(data, "stderr") 82 | }) 83 | } 84 | 85 | child.on("error", (error: Error) => { 86 | outputStream.end() 87 | if (opts.mode !== Mode.Loud && buffer.length) { 88 | process.stderr.write(buffer) 89 | } 90 | reject(error) 91 | }) 92 | 93 | child.on("exit", (code: number, signal: string) => { 94 | outputStream.end() 95 | if (code === 0) { 96 | return resolve() 97 | } else { 98 | if (opts.mode !== Mode.Loud && buffer.length) { 99 | console.log() 100 | process.stderr.write(buffer) 101 | } 102 | reject(new ProcessError(code, signal)) 103 | } 104 | }) 105 | }) 106 | } 107 | -------------------------------------------------------------------------------- /src/tasks.ts: -------------------------------------------------------------------------------- 1 | import spawn, { ProcessError, Mode } from "./spawn" 2 | import { FinalConfig, FinalTask } from "./config" 3 | import path from "path" 4 | 5 | let DOCKERFILES = path.resolve(__dirname, "dockerfiles") 6 | let TESTER_DOCKERFILE = path.join(DOCKERFILES, "tester.Dockerfile") 7 | 8 | export enum Target { 9 | Builder = "builder", 10 | Tester = "tester", 11 | } 12 | 13 | export function findTask(config: FinalConfig, taskName: string): FinalTask { 14 | let found = config.tasks.find(task => task.taskName === taskName) 15 | if (!found) { 16 | throw new Error(`Could not find a task named "${taskName}"`) 17 | } 18 | return found 19 | } 20 | 21 | export async function buildTask(task: FinalTask, mode: Mode, cwd: string) { 22 | await spawn( 23 | "docker", 24 | [ 25 | "build", 26 | task.buildContext, 27 | `--build-arg=cwd=${cwd}`, 28 | ...task.buildArgs.map(buildArg => { 29 | return `--build-arg=${buildArg}` 30 | }), 31 | `--tag=${getTag(task, Target.Builder)}`, 32 | ], 33 | { 34 | interactive: false, 35 | mode, 36 | }, 37 | ) 38 | } 39 | 40 | export async function buildTaskTester( 41 | task: FinalTask, 42 | mode: Mode, 43 | cwd: string, 44 | ) { 45 | await buildTask(task, mode, cwd) 46 | await spawn( 47 | "docker", 48 | [ 49 | "build", 50 | task.buildContext, 51 | `--file=${TESTER_DOCKERFILE}`, 52 | `--build-arg=baseImage=${getTag(task, Target.Builder)}`, 53 | `--build-arg=testFiles=${getTestFilesGlob(task)}`, 54 | `--tag=${getTag(task, Target.Tester)}`, 55 | ], 56 | { 57 | interactive: false, 58 | mode, 59 | }, 60 | ) 61 | } 62 | 63 | export async function runTask(task: FinalTask, target: Target, cwd: string) { 64 | await spawn( 65 | "docker", 66 | [ 67 | "run", 68 | `--name=${task.taskName}`, 69 | "--rm", 70 | "--network=host", 71 | ...(target === Target.Builder ? ["--interactive"] : []), 72 | "--tty", 73 | ...(target === Target.Builder ? [`--volume=${cwd}:/workdir`] : []), 74 | getTag(task, target), 75 | ...(target === Target.Builder ? task.args : []), 76 | ], 77 | { 78 | interactive: true, 79 | mode: Mode.Loud, 80 | }, 81 | ) 82 | } 83 | 84 | export async function shellTask(task: FinalTask, target: Target, cwd: string) { 85 | try { 86 | await spawn( 87 | "docker", 88 | [ 89 | "run", 90 | `--name=${task.taskName}`, 91 | "--rm", 92 | "--interactive", 93 | "--tty", 94 | "--network=host", 95 | ...(target === Target.Builder ? [`--volume=${cwd}:/workdir`] : []), 96 | "--entrypoint=/bin/bash", 97 | getTag(task, target), 98 | ], 99 | { 100 | interactive: true, 101 | mode: Mode.Loud, 102 | }, 103 | ) 104 | } catch (err) { 105 | if (err instanceof ProcessError && err.code === 130) { 106 | return 107 | } else { 108 | throw err 109 | } 110 | } 111 | } 112 | 113 | function getTag(task: FinalTask, target: Target) { 114 | return `naw-${target}-${task.taskName}:latest` 115 | } 116 | 117 | function getTestFilesGlob(task: FinalTask) { 118 | return path.join(task.buildContext, "*.bats") 119 | } 120 | -------------------------------------------------------------------------------- /tasks/eslint/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:12.1.0-stretch 2 | WORKDIR / 3 | COPY package.json . 4 | COPY package-lock.json . 5 | RUN npm ci && test -d node_modules 6 | RUN npm i -g chalk-cli@4.1.0 7 | COPY script.sh . 8 | RUN chmod +x script.sh 9 | WORKDIR /workdir 10 | ENTRYPOINT [ "/script.sh" ] 11 | -------------------------------------------------------------------------------- /tasks/eslint/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@babel/code-frame": { 6 | "version": "7.5.5", 7 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 8 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 9 | "requires": { 10 | "@babel/highlight": "^7.0.0" 11 | } 12 | }, 13 | "@babel/highlight": { 14 | "version": "7.5.0", 15 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 16 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 17 | "requires": { 18 | "chalk": "^2.0.0", 19 | "esutils": "^2.0.2", 20 | "js-tokens": "^4.0.0" 21 | } 22 | }, 23 | "@types/eslint-visitor-keys": { 24 | "version": "1.0.0", 25 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 26 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" 27 | }, 28 | "@types/json-schema": { 29 | "version": "7.0.3", 30 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", 31 | "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" 32 | }, 33 | "@typescript-eslint/eslint-plugin": { 34 | "version": "1.13.0", 35 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", 36 | "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", 37 | "requires": { 38 | "@typescript-eslint/experimental-utils": "1.13.0", 39 | "eslint-utils": "^1.3.1", 40 | "functional-red-black-tree": "^1.0.1", 41 | "regexpp": "^2.0.1", 42 | "tsutils": "^3.7.0" 43 | } 44 | }, 45 | "@typescript-eslint/experimental-utils": { 46 | "version": "1.13.0", 47 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", 48 | "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", 49 | "requires": { 50 | "@types/json-schema": "^7.0.3", 51 | "@typescript-eslint/typescript-estree": "1.13.0", 52 | "eslint-scope": "^4.0.0" 53 | } 54 | }, 55 | "@typescript-eslint/parser": { 56 | "version": "2.3.1", 57 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.3.1.tgz", 58 | "integrity": "sha512-ZlWdzhCJ2iZnSp/VBAJ/sowFbyHycIux8t0UEH0JsKgQvfSf7949hLYFMwTXdCMeEnpP1zRTHimrR+YHzs8LIw==", 59 | "requires": { 60 | "@types/eslint-visitor-keys": "^1.0.0", 61 | "@typescript-eslint/experimental-utils": "2.3.1", 62 | "@typescript-eslint/typescript-estree": "2.3.1", 63 | "eslint-visitor-keys": "^1.1.0" 64 | }, 65 | "dependencies": { 66 | "@typescript-eslint/experimental-utils": { 67 | "version": "2.3.1", 68 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.1.tgz", 69 | "integrity": "sha512-FaZEj73o4h6Wd0Lg+R4pZiJGdR0ZYbJr+O2+RbQ1aZjX8bZcfkVDtD+qm74Dv77rfSKkDKE64UTziLBo9UYHQA==", 70 | "requires": { 71 | "@types/json-schema": "^7.0.3", 72 | "@typescript-eslint/typescript-estree": "2.3.1", 73 | "eslint-scope": "^5.0.0" 74 | } 75 | }, 76 | "@typescript-eslint/typescript-estree": { 77 | "version": "2.3.1", 78 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.1.tgz", 79 | "integrity": "sha512-9SFhUgFuePJBB6jlLkOPPhMkZNiDCr+S8Ft7yAkkP2c5x5bxPhG3pe/exMiQaF8IGyVMDW6Ul0q4/cZ+uF3uog==", 80 | "requires": { 81 | "glob": "^7.1.4", 82 | "is-glob": "^4.0.1", 83 | "lodash.unescape": "4.0.1", 84 | "semver": "^6.3.0" 85 | } 86 | }, 87 | "eslint-scope": { 88 | "version": "5.0.0", 89 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 90 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 91 | "requires": { 92 | "esrecurse": "^4.1.0", 93 | "estraverse": "^4.1.1" 94 | } 95 | }, 96 | "semver": { 97 | "version": "6.3.0", 98 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 99 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 100 | } 101 | } 102 | }, 103 | "@typescript-eslint/typescript-estree": { 104 | "version": "1.13.0", 105 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", 106 | "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", 107 | "requires": { 108 | "lodash.unescape": "4.0.1", 109 | "semver": "5.5.0" 110 | } 111 | }, 112 | "acorn": { 113 | "version": "6.3.0", 114 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", 115 | "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" 116 | }, 117 | "acorn-jsx": { 118 | "version": "5.0.2", 119 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", 120 | "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==" 121 | }, 122 | "ajv": { 123 | "version": "6.10.2", 124 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 125 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 126 | "requires": { 127 | "fast-deep-equal": "^2.0.1", 128 | "fast-json-stable-stringify": "^2.0.0", 129 | "json-schema-traverse": "^0.4.1", 130 | "uri-js": "^4.2.2" 131 | } 132 | }, 133 | "ansi-escapes": { 134 | "version": "3.2.0", 135 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 136 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 137 | }, 138 | "ansi-regex": { 139 | "version": "3.0.0", 140 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 141 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 142 | }, 143 | "ansi-styles": { 144 | "version": "3.2.1", 145 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 146 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 147 | "requires": { 148 | "color-convert": "^1.9.0" 149 | } 150 | }, 151 | "argparse": { 152 | "version": "1.0.10", 153 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 154 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 155 | "requires": { 156 | "sprintf-js": "~1.0.2" 157 | } 158 | }, 159 | "astral-regex": { 160 | "version": "1.0.0", 161 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 162 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" 163 | }, 164 | "balanced-match": { 165 | "version": "1.0.0", 166 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 167 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 168 | }, 169 | "brace-expansion": { 170 | "version": "1.1.11", 171 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 172 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 173 | "requires": { 174 | "balanced-match": "^1.0.0", 175 | "concat-map": "0.0.1" 176 | } 177 | }, 178 | "callsites": { 179 | "version": "3.1.0", 180 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 181 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 182 | }, 183 | "chalk": { 184 | "version": "2.4.2", 185 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 186 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 187 | "requires": { 188 | "ansi-styles": "^3.2.1", 189 | "escape-string-regexp": "^1.0.5", 190 | "supports-color": "^5.3.0" 191 | } 192 | }, 193 | "chardet": { 194 | "version": "0.7.0", 195 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 196 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 197 | }, 198 | "cli-cursor": { 199 | "version": "2.1.0", 200 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 201 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 202 | "requires": { 203 | "restore-cursor": "^2.0.0" 204 | } 205 | }, 206 | "cli-width": { 207 | "version": "2.2.0", 208 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 209 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 210 | }, 211 | "color-convert": { 212 | "version": "1.9.3", 213 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 214 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 215 | "requires": { 216 | "color-name": "1.1.3" 217 | } 218 | }, 219 | "color-name": { 220 | "version": "1.1.3", 221 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 222 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 223 | }, 224 | "concat-map": { 225 | "version": "0.0.1", 226 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 227 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 228 | }, 229 | "cross-spawn": { 230 | "version": "6.0.5", 231 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 232 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 233 | "requires": { 234 | "nice-try": "^1.0.4", 235 | "path-key": "^2.0.1", 236 | "semver": "^5.5.0", 237 | "shebang-command": "^1.2.0", 238 | "which": "^1.2.9" 239 | } 240 | }, 241 | "debug": { 242 | "version": "4.1.1", 243 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 244 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 245 | "requires": { 246 | "ms": "^2.1.1" 247 | } 248 | }, 249 | "deep-is": { 250 | "version": "0.1.3", 251 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 252 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 253 | }, 254 | "doctrine": { 255 | "version": "3.0.0", 256 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 257 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 258 | "requires": { 259 | "esutils": "^2.0.2" 260 | } 261 | }, 262 | "emoji-regex": { 263 | "version": "7.0.3", 264 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 265 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 266 | }, 267 | "escape-string-regexp": { 268 | "version": "1.0.5", 269 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 270 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 271 | }, 272 | "eslint": { 273 | "version": "5.16.0", 274 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 275 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 276 | "requires": { 277 | "@babel/code-frame": "^7.0.0", 278 | "ajv": "^6.9.1", 279 | "chalk": "^2.1.0", 280 | "cross-spawn": "^6.0.5", 281 | "debug": "^4.0.1", 282 | "doctrine": "^3.0.0", 283 | "eslint-scope": "^4.0.3", 284 | "eslint-utils": "^1.3.1", 285 | "eslint-visitor-keys": "^1.0.0", 286 | "espree": "^5.0.1", 287 | "esquery": "^1.0.1", 288 | "esutils": "^2.0.2", 289 | "file-entry-cache": "^5.0.1", 290 | "functional-red-black-tree": "^1.0.1", 291 | "glob": "^7.1.2", 292 | "globals": "^11.7.0", 293 | "ignore": "^4.0.6", 294 | "import-fresh": "^3.0.0", 295 | "imurmurhash": "^0.1.4", 296 | "inquirer": "^6.2.2", 297 | "js-yaml": "^3.13.0", 298 | "json-stable-stringify-without-jsonify": "^1.0.1", 299 | "levn": "^0.3.0", 300 | "lodash": "^4.17.11", 301 | "minimatch": "^3.0.4", 302 | "mkdirp": "^0.5.1", 303 | "natural-compare": "^1.4.0", 304 | "optionator": "^0.8.2", 305 | "path-is-inside": "^1.0.2", 306 | "progress": "^2.0.0", 307 | "regexpp": "^2.0.1", 308 | "semver": "^5.5.1", 309 | "strip-ansi": "^4.0.0", 310 | "strip-json-comments": "^2.0.1", 311 | "table": "^5.2.3", 312 | "text-table": "^0.2.0" 313 | }, 314 | "dependencies": { 315 | "semver": { 316 | "version": "5.7.1", 317 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 318 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 319 | } 320 | } 321 | }, 322 | "eslint-formatter-pretty": { 323 | "version": "2.1.1", 324 | "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-2.1.1.tgz", 325 | "integrity": "sha512-gWfagucSWBn82WxzwFloBTLAcwYDgnpAfiV5pQfyAV5YpZikuLflRU8nc3Ts9wnNvLhwk4blzb42/C495Yw7BA==", 326 | "requires": { 327 | "ansi-escapes": "^3.1.0", 328 | "chalk": "^2.1.0", 329 | "eslint-rule-docs": "^1.1.5", 330 | "log-symbols": "^2.0.0", 331 | "plur": "^3.0.1", 332 | "string-width": "^2.0.0", 333 | "supports-hyperlinks": "^1.0.1" 334 | } 335 | }, 336 | "eslint-rule-docs": { 337 | "version": "1.1.158", 338 | "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.158.tgz", 339 | "integrity": "sha512-S4jQGXR245fsTtJXOwP7JLnXV0Nw+ZvWC1Vo9zILi/5CueV8yKi3Dr2eH4U8MXmBY90oMT32DyAVLymK2ioaog==" 340 | }, 341 | "eslint-scope": { 342 | "version": "4.0.3", 343 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 344 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 345 | "requires": { 346 | "esrecurse": "^4.1.0", 347 | "estraverse": "^4.1.1" 348 | } 349 | }, 350 | "eslint-utils": { 351 | "version": "1.4.2", 352 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", 353 | "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", 354 | "requires": { 355 | "eslint-visitor-keys": "^1.0.0" 356 | } 357 | }, 358 | "eslint-visitor-keys": { 359 | "version": "1.1.0", 360 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 361 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" 362 | }, 363 | "espree": { 364 | "version": "5.0.1", 365 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 366 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 367 | "requires": { 368 | "acorn": "^6.0.7", 369 | "acorn-jsx": "^5.0.0", 370 | "eslint-visitor-keys": "^1.0.0" 371 | } 372 | }, 373 | "esprima": { 374 | "version": "4.0.1", 375 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 376 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 377 | }, 378 | "esquery": { 379 | "version": "1.0.1", 380 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 381 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 382 | "requires": { 383 | "estraverse": "^4.0.0" 384 | } 385 | }, 386 | "esrecurse": { 387 | "version": "4.2.1", 388 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 389 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 390 | "requires": { 391 | "estraverse": "^4.1.0" 392 | } 393 | }, 394 | "estraverse": { 395 | "version": "4.3.0", 396 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 397 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 398 | }, 399 | "esutils": { 400 | "version": "2.0.3", 401 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 402 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 403 | }, 404 | "external-editor": { 405 | "version": "3.1.0", 406 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 407 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 408 | "requires": { 409 | "chardet": "^0.7.0", 410 | "iconv-lite": "^0.4.24", 411 | "tmp": "^0.0.33" 412 | } 413 | }, 414 | "fast-deep-equal": { 415 | "version": "2.0.1", 416 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 417 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 418 | }, 419 | "fast-json-stable-stringify": { 420 | "version": "2.0.0", 421 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 422 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 423 | }, 424 | "fast-levenshtein": { 425 | "version": "2.0.6", 426 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 427 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 428 | }, 429 | "figures": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 432 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 433 | "requires": { 434 | "escape-string-regexp": "^1.0.5" 435 | } 436 | }, 437 | "file-entry-cache": { 438 | "version": "5.0.1", 439 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 440 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 441 | "requires": { 442 | "flat-cache": "^2.0.1" 443 | } 444 | }, 445 | "flat-cache": { 446 | "version": "2.0.1", 447 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 448 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 449 | "requires": { 450 | "flatted": "^2.0.0", 451 | "rimraf": "2.6.3", 452 | "write": "1.0.3" 453 | } 454 | }, 455 | "flatted": { 456 | "version": "2.0.1", 457 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 458 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" 459 | }, 460 | "fs.realpath": { 461 | "version": "1.0.0", 462 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 463 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 464 | }, 465 | "functional-red-black-tree": { 466 | "version": "1.0.1", 467 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 468 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" 469 | }, 470 | "glob": { 471 | "version": "7.1.4", 472 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 473 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 474 | "requires": { 475 | "fs.realpath": "^1.0.0", 476 | "inflight": "^1.0.4", 477 | "inherits": "2", 478 | "minimatch": "^3.0.4", 479 | "once": "^1.3.0", 480 | "path-is-absolute": "^1.0.0" 481 | } 482 | }, 483 | "globals": { 484 | "version": "11.12.0", 485 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 486 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" 487 | }, 488 | "has-flag": { 489 | "version": "3.0.0", 490 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 491 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 492 | }, 493 | "iconv-lite": { 494 | "version": "0.4.24", 495 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 496 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 497 | "requires": { 498 | "safer-buffer": ">= 2.1.2 < 3" 499 | } 500 | }, 501 | "ignore": { 502 | "version": "4.0.6", 503 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 504 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" 505 | }, 506 | "import-fresh": { 507 | "version": "3.1.0", 508 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", 509 | "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", 510 | "requires": { 511 | "parent-module": "^1.0.0", 512 | "resolve-from": "^4.0.0" 513 | } 514 | }, 515 | "imurmurhash": { 516 | "version": "0.1.4", 517 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 518 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 519 | }, 520 | "inflight": { 521 | "version": "1.0.6", 522 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 523 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 524 | "requires": { 525 | "once": "^1.3.0", 526 | "wrappy": "1" 527 | } 528 | }, 529 | "inherits": { 530 | "version": "2.0.4", 531 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 532 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 533 | }, 534 | "inquirer": { 535 | "version": "6.5.2", 536 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 537 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 538 | "requires": { 539 | "ansi-escapes": "^3.2.0", 540 | "chalk": "^2.4.2", 541 | "cli-cursor": "^2.1.0", 542 | "cli-width": "^2.0.0", 543 | "external-editor": "^3.0.3", 544 | "figures": "^2.0.0", 545 | "lodash": "^4.17.12", 546 | "mute-stream": "0.0.7", 547 | "run-async": "^2.2.0", 548 | "rxjs": "^6.4.0", 549 | "string-width": "^2.1.0", 550 | "strip-ansi": "^5.1.0", 551 | "through": "^2.3.6" 552 | }, 553 | "dependencies": { 554 | "ansi-regex": { 555 | "version": "4.1.0", 556 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 557 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 558 | }, 559 | "strip-ansi": { 560 | "version": "5.2.0", 561 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 562 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 563 | "requires": { 564 | "ansi-regex": "^4.1.0" 565 | } 566 | } 567 | } 568 | }, 569 | "irregular-plurals": { 570 | "version": "2.0.0", 571 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", 572 | "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==" 573 | }, 574 | "is-extglob": { 575 | "version": "2.1.1", 576 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 577 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 578 | }, 579 | "is-fullwidth-code-point": { 580 | "version": "2.0.0", 581 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 582 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 583 | }, 584 | "is-glob": { 585 | "version": "4.0.1", 586 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 587 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 588 | "requires": { 589 | "is-extglob": "^2.1.1" 590 | } 591 | }, 592 | "is-promise": { 593 | "version": "2.1.0", 594 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 595 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 596 | }, 597 | "isexe": { 598 | "version": "2.0.0", 599 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 600 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 601 | }, 602 | "js-tokens": { 603 | "version": "4.0.0", 604 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 605 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 606 | }, 607 | "js-yaml": { 608 | "version": "3.13.1", 609 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 610 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 611 | "requires": { 612 | "argparse": "^1.0.7", 613 | "esprima": "^4.0.0" 614 | } 615 | }, 616 | "json-schema-traverse": { 617 | "version": "0.4.1", 618 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 619 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 620 | }, 621 | "json-stable-stringify-without-jsonify": { 622 | "version": "1.0.1", 623 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 624 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 625 | }, 626 | "levn": { 627 | "version": "0.3.0", 628 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 629 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 630 | "requires": { 631 | "prelude-ls": "~1.1.2", 632 | "type-check": "~0.3.2" 633 | } 634 | }, 635 | "lodash": { 636 | "version": "4.17.15", 637 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 638 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 639 | }, 640 | "lodash.unescape": { 641 | "version": "4.0.1", 642 | "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", 643 | "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" 644 | }, 645 | "log-symbols": { 646 | "version": "2.2.0", 647 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 648 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 649 | "requires": { 650 | "chalk": "^2.0.1" 651 | } 652 | }, 653 | "mimic-fn": { 654 | "version": "1.2.0", 655 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 656 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 657 | }, 658 | "minimatch": { 659 | "version": "3.0.4", 660 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 661 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 662 | "requires": { 663 | "brace-expansion": "^1.1.7" 664 | } 665 | }, 666 | "minimist": { 667 | "version": "0.0.8", 668 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 669 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 670 | }, 671 | "mkdirp": { 672 | "version": "0.5.1", 673 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 674 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 675 | "requires": { 676 | "minimist": "0.0.8" 677 | } 678 | }, 679 | "ms": { 680 | "version": "2.1.2", 681 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 682 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 683 | }, 684 | "mute-stream": { 685 | "version": "0.0.7", 686 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 687 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 688 | }, 689 | "natural-compare": { 690 | "version": "1.4.0", 691 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 692 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 693 | }, 694 | "nice-try": { 695 | "version": "1.0.5", 696 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 697 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 698 | }, 699 | "once": { 700 | "version": "1.4.0", 701 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 702 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 703 | "requires": { 704 | "wrappy": "1" 705 | } 706 | }, 707 | "onetime": { 708 | "version": "2.0.1", 709 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 710 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 711 | "requires": { 712 | "mimic-fn": "^1.0.0" 713 | } 714 | }, 715 | "optionator": { 716 | "version": "0.8.2", 717 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 718 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 719 | "requires": { 720 | "deep-is": "~0.1.3", 721 | "fast-levenshtein": "~2.0.4", 722 | "levn": "~0.3.0", 723 | "prelude-ls": "~1.1.2", 724 | "type-check": "~0.3.2", 725 | "wordwrap": "~1.0.0" 726 | } 727 | }, 728 | "os-tmpdir": { 729 | "version": "1.0.2", 730 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 731 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 732 | }, 733 | "parent-module": { 734 | "version": "1.0.1", 735 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 736 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 737 | "requires": { 738 | "callsites": "^3.0.0" 739 | } 740 | }, 741 | "path-is-absolute": { 742 | "version": "1.0.1", 743 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 744 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 745 | }, 746 | "path-is-inside": { 747 | "version": "1.0.2", 748 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 749 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 750 | }, 751 | "path-key": { 752 | "version": "2.0.1", 753 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 754 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 755 | }, 756 | "plur": { 757 | "version": "3.1.1", 758 | "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", 759 | "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", 760 | "requires": { 761 | "irregular-plurals": "^2.0.0" 762 | } 763 | }, 764 | "prelude-ls": { 765 | "version": "1.1.2", 766 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 767 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 768 | }, 769 | "progress": { 770 | "version": "2.0.3", 771 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 772 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 773 | }, 774 | "punycode": { 775 | "version": "2.1.1", 776 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 777 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 778 | }, 779 | "regexpp": { 780 | "version": "2.0.1", 781 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 782 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" 783 | }, 784 | "resolve-from": { 785 | "version": "4.0.0", 786 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 787 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 788 | }, 789 | "restore-cursor": { 790 | "version": "2.0.0", 791 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 792 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 793 | "requires": { 794 | "onetime": "^2.0.0", 795 | "signal-exit": "^3.0.2" 796 | } 797 | }, 798 | "rimraf": { 799 | "version": "2.6.3", 800 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 801 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 802 | "requires": { 803 | "glob": "^7.1.3" 804 | } 805 | }, 806 | "run-async": { 807 | "version": "2.3.0", 808 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 809 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 810 | "requires": { 811 | "is-promise": "^2.1.0" 812 | } 813 | }, 814 | "rxjs": { 815 | "version": "6.5.3", 816 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 817 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 818 | "requires": { 819 | "tslib": "^1.9.0" 820 | } 821 | }, 822 | "safer-buffer": { 823 | "version": "2.1.2", 824 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 825 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 826 | }, 827 | "semver": { 828 | "version": "5.5.0", 829 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 830 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" 831 | }, 832 | "shebang-command": { 833 | "version": "1.2.0", 834 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 835 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 836 | "requires": { 837 | "shebang-regex": "^1.0.0" 838 | } 839 | }, 840 | "shebang-regex": { 841 | "version": "1.0.0", 842 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 843 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 844 | }, 845 | "signal-exit": { 846 | "version": "3.0.2", 847 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 848 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 849 | }, 850 | "slice-ansi": { 851 | "version": "2.1.0", 852 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 853 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 854 | "requires": { 855 | "ansi-styles": "^3.2.0", 856 | "astral-regex": "^1.0.0", 857 | "is-fullwidth-code-point": "^2.0.0" 858 | } 859 | }, 860 | "sprintf-js": { 861 | "version": "1.0.3", 862 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 863 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 864 | }, 865 | "string-width": { 866 | "version": "2.1.1", 867 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 868 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 869 | "requires": { 870 | "is-fullwidth-code-point": "^2.0.0", 871 | "strip-ansi": "^4.0.0" 872 | } 873 | }, 874 | "strip-ansi": { 875 | "version": "4.0.0", 876 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 877 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 878 | "requires": { 879 | "ansi-regex": "^3.0.0" 880 | } 881 | }, 882 | "strip-json-comments": { 883 | "version": "2.0.1", 884 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 885 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 886 | }, 887 | "supports-color": { 888 | "version": "5.5.0", 889 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 890 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 891 | "requires": { 892 | "has-flag": "^3.0.0" 893 | } 894 | }, 895 | "supports-hyperlinks": { 896 | "version": "1.0.1", 897 | "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", 898 | "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", 899 | "requires": { 900 | "has-flag": "^2.0.0", 901 | "supports-color": "^5.0.0" 902 | }, 903 | "dependencies": { 904 | "has-flag": { 905 | "version": "2.0.0", 906 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 907 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" 908 | } 909 | } 910 | }, 911 | "table": { 912 | "version": "5.4.6", 913 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 914 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 915 | "requires": { 916 | "ajv": "^6.10.2", 917 | "lodash": "^4.17.14", 918 | "slice-ansi": "^2.1.0", 919 | "string-width": "^3.0.0" 920 | }, 921 | "dependencies": { 922 | "ansi-regex": { 923 | "version": "4.1.0", 924 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 925 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 926 | }, 927 | "string-width": { 928 | "version": "3.1.0", 929 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 930 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 931 | "requires": { 932 | "emoji-regex": "^7.0.1", 933 | "is-fullwidth-code-point": "^2.0.0", 934 | "strip-ansi": "^5.1.0" 935 | } 936 | }, 937 | "strip-ansi": { 938 | "version": "5.2.0", 939 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 940 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 941 | "requires": { 942 | "ansi-regex": "^4.1.0" 943 | } 944 | } 945 | } 946 | }, 947 | "text-table": { 948 | "version": "0.2.0", 949 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 950 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" 951 | }, 952 | "through": { 953 | "version": "2.3.8", 954 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 955 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 956 | }, 957 | "tmp": { 958 | "version": "0.0.33", 959 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 960 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 961 | "requires": { 962 | "os-tmpdir": "~1.0.2" 963 | } 964 | }, 965 | "tslib": { 966 | "version": "1.10.0", 967 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 968 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" 969 | }, 970 | "tsutils": { 971 | "version": "3.17.1", 972 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 973 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 974 | "requires": { 975 | "tslib": "^1.8.1" 976 | } 977 | }, 978 | "type-check": { 979 | "version": "0.3.2", 980 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 981 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 982 | "requires": { 983 | "prelude-ls": "~1.1.2" 984 | } 985 | }, 986 | "typescript": { 987 | "version": "3.3.3", 988 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", 989 | "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==" 990 | }, 991 | "uri-js": { 992 | "version": "4.2.2", 993 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 994 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 995 | "requires": { 996 | "punycode": "^2.1.0" 997 | } 998 | }, 999 | "which": { 1000 | "version": "1.3.1", 1001 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1002 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1003 | "requires": { 1004 | "isexe": "^2.0.0" 1005 | } 1006 | }, 1007 | "wordwrap": { 1008 | "version": "1.0.0", 1009 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1010 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1011 | }, 1012 | "wrappy": { 1013 | "version": "1.0.2", 1014 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1015 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1016 | }, 1017 | "write": { 1018 | "version": "1.0.3", 1019 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1020 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1021 | "requires": { 1022 | "mkdirp": "^0.5.1" 1023 | } 1024 | } 1025 | } 1026 | } 1027 | -------------------------------------------------------------------------------- /tasks/eslint/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@typescript-eslint/eslint-plugin": "^1.3.0", 4 | "@typescript-eslint/parser": "^2.3.1", 5 | "eslint": "^5.16.0", 6 | "eslint-formatter-pretty": "^2.1.1", 7 | "typescript": "3.3.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /tasks/eslint/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | set -f # disable automatic globbing 4 | 5 | chalk -t "{bold {magenta [eslint]} Linting...}" 6 | 7 | exit_code=0 8 | 9 | # shellcheck disable=SC2068 10 | /node_modules/.bin/eslint $@ \ 11 | --ext=js,ts,tsx \ 12 | --cache \ 13 | --max-warnings 0 \ 14 | --color \ 15 | --format=pretty || exit_code=$? 16 | 17 | if [ $exit_code -eq 0 ]; then 18 | chalk -t "\n{bold {cyan [eslint]} No problems found.}" 19 | fi 20 | 21 | exit $exit_code 22 | -------------------------------------------------------------------------------- /tasks/eslint/test.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | function setup() { 4 | echo "{ \"extends\": \"eslint:recommended\" }" > ./.eslintrc 5 | } 6 | 7 | function teardown() { 8 | rm -rf ./* 9 | } 10 | 11 | @test "eslint --help" { 12 | run /script.sh --help 13 | [[ "$output" = *"[eslint] Linting..."* ]] 14 | [[ "$output" = *"[options] file.js [file.js] [dir]"* ]] 15 | } 16 | 17 | @test "eslint ." { 18 | echo "var value = 42" > badfile.js 19 | run /script.sh . 20 | [ "$status" -eq 1 ] 21 | [[ "$output" = *"badfile.js"* ]] 22 | [[ "$output" = *"is assigned a value but never used."* ]] 23 | [[ "$output" = *"no-unused-vars"* ]] 24 | [[ "$output" = *"1 error"* ]] 25 | } 26 | 27 | @test "eslint --fix" { 28 | echo "label: while (true) {}" > badfile.js 29 | run /script.sh . --fix 30 | [[ "$(cat badfile.js)" != *"label:"* ]] 31 | [[ "$(cat badfile.js)" = *"while (true) {}"* ]] 32 | } 33 | -------------------------------------------------------------------------------- /tasks/example/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM buildpack-deps 2 | WORKDIR / 3 | COPY script.sh . 4 | RUN chmod +x script.sh 5 | WORKDIR /workdir 6 | ENTRYPOINT [ "/script.sh" ] 7 | -------------------------------------------------------------------------------- /tasks/example/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | echo "Running an example build tool..." 5 | sleep 3 6 | echo "Success!" 7 | -------------------------------------------------------------------------------- /tasks/example/test.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | function setup() { 4 | touch fixture.txt 5 | } 6 | 7 | function teardown() { 8 | rm fixture.txt 9 | } 10 | 11 | @test "works" { 12 | run /script.sh 13 | [ "$status" -eq 0 ] 14 | [[ "$output" = *"Running an example build tool..."* ]] 15 | [[ "$output" = *"Success!"* ]] 16 | } 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | // prettier-ignore 2 | { 3 | "compilerOptions": { 4 | /* Basic Options */ 5 | "target": "es2018", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ 6 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 7 | "lib": ["es2018"], /* Specify library files to be included in the compilation. */ 8 | // "allowJs": true, /* Allow javascript files to be compiled. */ 9 | // "checkJs": true, /* Report errors in .js files. */ 10 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 11 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 12 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 13 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 14 | // "outFile": "./", /* Concatenate and emit output to single file. */ 15 | "outDir": "./dist", /* Redirect output structure to the directory. */ 16 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 17 | // "composite": true, /* Enable project compilation */ 18 | // "removeComments": true, /* Do not emit comments to output. */ 19 | // "noEmit": true, /* Do not emit outputs. */ 20 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 21 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 22 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 23 | 24 | /* Strict Type-Checking Options */ 25 | "strict": true, /* Enable all strict type-checking options. */ 26 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 27 | // "strictNullChecks": true, /* Enable strict null checks. */ 28 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 29 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 30 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 31 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 32 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 33 | 34 | /* Additional Checks */ 35 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 36 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 37 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 38 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 39 | 40 | /* Module Resolution Options */ 41 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 42 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 43 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 44 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 45 | "typeRoots": [ /* List of folders to include type definitions from. */ 46 | "./node_modules/@types", 47 | "./types" 48 | ], 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | 54 | /* Source Map Options */ 55 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 56 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 57 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 58 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 59 | 60 | /* Experimental Options */ 61 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 62 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 63 | 64 | // other options: 65 | "resolveJsonModule": true 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /types/string.prototype.replaceall.d.ts: -------------------------------------------------------------------------------- 1 | declare module "string.prototype.replaceall" { 2 | export default function replaceAll( 3 | str: string, 4 | regex: RegExp, 5 | replacement: string, 6 | ): string 7 | } 8 | --------------------------------------------------------------------------------