├── .gitignore ├── .jshintrc ├── LICENSE ├── README.md ├── assets ├── beer.png ├── logo.png └── screens │ ├── notification.png │ └── server.png ├── custom.js ├── errorServerRoot ├── index.html └── style.css ├── index.js ├── lib ├── ErrorList.js ├── ErrorServer.js └── errorHandler.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/macOS,node 3 | 4 | ### macOS ### 5 | *.DS_Store 6 | .AppleDouble 7 | .LSOverride 8 | 9 | # Icon must end with two \r 10 | Icon 11 | 12 | 13 | # Thumbnails 14 | ._* 15 | 16 | # Files that might appear in the root of a volume 17 | .DocumentRevisions-V100 18 | .fseventsd 19 | .Spotlight-V100 20 | .TemporaryItems 21 | .Trashes 22 | .VolumeIcon.icns 23 | .com.apple.timemachine.donotpresent 24 | 25 | # Directories potentially created on remote AFP share 26 | .AppleDB 27 | .AppleDesktop 28 | Network Trash Folder 29 | Temporary Items 30 | .apdisk 31 | 32 | ### Node ### 33 | # Logs 34 | logs 35 | *.log 36 | npm-debug.log* 37 | yarn-debug.log* 38 | yarn-error.log* 39 | 40 | # Runtime data 41 | pids 42 | *.pid 43 | *.seed 44 | *.pid.lock 45 | 46 | # Directory for instrumented libs generated by jscoverage/JSCover 47 | lib-cov 48 | 49 | # Coverage directory used by tools like istanbul 50 | coverage 51 | 52 | # nyc test coverage 53 | .nyc_output 54 | 55 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 56 | .grunt 57 | 58 | # Bower dependency directory (https://bower.io/) 59 | bower_components 60 | 61 | # node-waf configuration 62 | .lock-wscript 63 | 64 | # Compiled binary addons (http://nodejs.org/api/addons.html) 65 | build/Release 66 | 67 | # Dependency directories 68 | node_modules/ 69 | jspm_packages/ 70 | 71 | # Typescript v1 declaration files 72 | typings/ 73 | 74 | # Optional npm cache directory 75 | .npm 76 | 77 | # Optional eslint cache 78 | .eslintcache 79 | 80 | # Optional REPL history 81 | .node_repl_history 82 | 83 | # Output of 'npm pack' 84 | *.tgz 85 | 86 | # Yarn Integrity file 87 | .yarn-integrity 88 | 89 | # dotenv environment variables file 90 | .env 91 | 92 | 93 | # End of https://www.gitignore.io/api/macOS,node 94 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 6, 3 | "browser": true, 4 | "browserify": true, 5 | "jquery": true, 6 | "devel": true, 7 | 8 | "eqeqeq": true, 9 | "eqnull": true, 10 | "undef": true, 11 | "unused": true, 12 | "plusplus": true, 13 | "quotmark": "single", 14 | "expr": true 15 | } 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Lorenzo Zottar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ![gulp-beer](https://raw.githubusercontent.com/lordgiotto/gulp-beer/master/assets/logo.png) 3 | 4 | **gulp-beer**: better error reporting. 5 | 6 | gulp-beer is a simple error handler function that provides some extra features: 7 | 8 | - **Interactive System Notification** (thanks to [node-notifier](https://github.com/mikaelbr/node-notifier)) 9 | - **Custom Server for Errors** (opened on notification click) that display all your errors in a more pleasent and straightforward way. 10 | 11 | **Interactive System Notification** 12 | ![system notification](https://raw.githubusercontent.com/lordgiotto/gulp-beer/master/assets/screens/notification.png) 13 | 14 | **Custom Server for Errors** 15 | ![error server](https://raw.githubusercontent.com/lordgiotto/gulp-beer/master/assets/screens/server.png) 16 | 17 | ## Installation 18 | 19 | ``` 20 | $ npm install --save-dev gulp-beer 21 | ``` 22 | 23 | ## Usage 24 | 25 | Require gulp-beer in your *gulpfile.js*: 26 | 27 | ```js 28 | var gulpBeer = require('gulp-beer'); 29 | ``` 30 | 31 | than simply pass required function as error handler function wherever you like: 32 | 33 | ```js 34 | gulp.src('*') 35 | // stream error 36 | .on('error', gulpBeer) 37 | // Plumber 38 | .pipe(plumber({errorHandler: gulpBeer})) 39 | // Other error listener 40 | .pipe(sass().on('error', gulpBeer)) 41 | ``` 42 | 43 | You can also call it manually if an error object must be handled 44 | 45 | ```js 46 | var customFunction(err, result) { 47 | if (err) gulpBeer(err); 48 | } 49 | ``` 50 | 51 | ## (!!) Start error server (!!) 52 | 53 | Since error server prevents the gulp process to finish, it has to be started manually when needed (usually when performing a watching task). 54 | 55 | Error Handler function expose the server object, so you can do: 56 | 57 | ```js 58 | gulpBeer.server.start() // to start the error server 59 | ``` 60 | 61 | ```js 62 | gulpBeer.server.stop() // to stop the error server 63 | ``` 64 | 65 | A simple usage example: 66 | 67 | ```js 68 | var gulp = require('gulp'); 69 | var gulpBeer = require('gulp-beer'); 70 | var plumber = require('gulp-plumber'); 71 | var sass = require('gulp-sass'); 72 | 73 | function build() { 74 | return gulp.src('./src/css/*.scss') 75 | .pipe(plumber({errorHandler: gulpBeer})) 76 | .pipe(sass()) 77 | .pipe(gulp.dest('./dist/css')); 78 | } 79 | 80 | gulp.task('build', build); 81 | gulp.task('watch', function() { 82 | gulpBeer.server.start(); 83 | gulp.watch('./src/css/*.scss', ['build']); 84 | }); 85 | 86 | 87 | ``` 88 | 89 | Otherwise, if you prefer start it automatically, take a look at the option server.autostart in the "customize handler" section. 90 | 91 | 92 | ## Customize Handler 93 | 94 | If you like, you can customize the error handler function and the error server. 95 | 96 | First of all require the custom module: 97 | 98 | ```js 99 | var gulpBeerFactory = require('gulp-beer/custom'); 100 | ``` 101 | This will return a factory for the error handler function, which accepts some options as first parameter. 102 | 103 | ```js 104 | var errorHandler = gulpBeerFactory(options); 105 | ``` 106 | 107 | #### Options 108 | --- 109 | 110 | `consoleError` [function] : the function that will be used to print the error in the console. 111 | 112 | It receives the error object as first argument, decorated with a custom property: 113 | 114 | - `serverUrl` [string | false]: the link to the custom error server related to this specific error 115 | 116 | --- 117 | 118 | `title` [string] Title of the system notification 119 | 120 | --- 121 | 122 | `sound` [boolean | string] Notification sound as described [here](https://github.com/mikaelbr/node-notifier#cross-platform-advanced-usage) 123 | 124 | --- 125 | 126 | `icon` [boolean | string] Notification sound as described [here](https://github.com/mikaelbr/node-notifier#cross-platform-advanced-usage) 127 | 128 | --- 129 | 130 | `server` [object | false] Server configuration object. If `false` the server start will be prevented also if started manually. 131 | 132 | Server configuration object accepts the following properties: 133 | 134 | - `port` [number] : Port on which the server will listen 135 | - `autostart` [boolean] : If true, the server will be started automatically 136 | - `silent` [boolean] : Silents server console output 137 | -------------------------------------------------------------------------------- /assets/beer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lordgiotto/gulp-beer/0568f213e818a074f15251f1e77d675ee7f92fc8/assets/beer.png -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lordgiotto/gulp-beer/0568f213e818a074f15251f1e77d675ee7f92fc8/assets/logo.png -------------------------------------------------------------------------------- /assets/screens/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lordgiotto/gulp-beer/0568f213e818a074f15251f1e77d675ee7f92fc8/assets/screens/notification.png -------------------------------------------------------------------------------- /assets/screens/server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lordgiotto/gulp-beer/0568f213e818a074f15251f1e77d675ee7f92fc8/assets/screens/server.png -------------------------------------------------------------------------------- /custom.js: -------------------------------------------------------------------------------- 1 | const handler = require('./lib/errorHandler'); 2 | 3 | module.exports = handler; -------------------------------------------------------------------------------- /errorServerRoot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Error 5 | 6 | 7 | 8 |
9 |
10 | 11 |
12 | (be)tter (e)rror (r)eporting 13 |
14 |
15 | {{#errors}} 16 | {{#isSingle}} 17 | All Errors 18 |
{{date}}
19 | {{/isSingle}} 20 | {{^isSingle}} 21 | {{date}} 22 | {{/isSingle}} 23 |
24 | Message 25 |
{{message}}
26 | Stack 27 |
{{stack}}
28 |
29 | {{/errors}} 30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /errorServerRoot/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #bdc3c7; 3 | font-family: sans-serif; 4 | font-size: 14px; 5 | } 6 | 7 | .header { 8 | text-align: center; 9 | padding-bottom: 20px; 10 | } 11 | 12 | .header .logo { 13 | font-size: 64px; 14 | } 15 | 16 | .header .brand { 17 | font-size: 12px; 18 | text-transform: lowercase; 19 | color: #444444; 20 | } 21 | 22 | .header .brand em { 23 | font-style: normal; 24 | font-weight: bold; 25 | } 26 | 27 | .wrapper { 28 | box-sizing: border-box; 29 | width: 100%; 30 | max-width: 900px; 31 | margin: 0 auto; 32 | padding: 20px; 33 | } 34 | 35 | .errorBar { 36 | display: block; 37 | padding: 10px; 38 | margin: 5px 0; 39 | font-size: .7rem; 40 | text-align: center; 41 | background-color: #393939; 42 | color: #ecf0f1; 43 | text-decoration: none; 44 | box-shadow: 0 0 8px #aaaaaa; 45 | } 46 | 47 | .errorBar.archive { 48 | margin-top: 27px; 49 | } 50 | 51 | .errorBar.archive:hover { 52 | background-color: #c0392b; 53 | } 54 | 55 | .goback { 56 | display: inline-block; 57 | padding: 5px 10px; 58 | font-size: 10px; 59 | color: black; 60 | background-color: #fbfbfb; 61 | text-decoration: none; 62 | text-transform: uppercase; 63 | box-shadow: 0 0 8px #aaaaaa; 64 | } 65 | 66 | .goback:hover { 67 | background-color: #dddddd; 68 | } 69 | 70 | .goback:before { 71 | content: ""; 72 | display: inline-block; 73 | width: 0; 74 | height: 0; 75 | margin-right: 5px; 76 | border-style: solid; 77 | border-width: 4.5px 5px 4.5px 0; 78 | border-color: transparent #000000 transparent transparent; 79 | } 80 | 81 | .section { 82 | padding: 20px; 83 | background-color: #fbfbfb; 84 | box-shadow: 0 0 8px #aaaaaa; 85 | margin-bottom: 20px; 86 | } 87 | 88 | pre { 89 | overflow-x: auto; 90 | max-width: 100%; 91 | font-size: .8rem; 92 | line-height: 1.5em; 93 | padding: 15px 10px !important; 94 | } 95 | 96 | /* desert scheme ported from vim to google prettify */ 97 | pre.prettyprint { display: block; background-color: #333 } 98 | pre .nocode { background-color: none; color: #000 } 99 | pre .str { color: #ffa0a0 } /* string - pink */ 100 | pre .kwd { color: #f0e68c; font-weight: bold } 101 | pre .com { color: #87ceeb } /* comment - skyblue */ 102 | pre .typ { color: #98fb98 } /* type - lightgreen */ 103 | pre .lit { color: #cd5c5c } /* literal - darkred */ 104 | pre .pun { color: #fff } /* punctuation */ 105 | pre .pln { color: #fff } /* plaintext */ 106 | pre .tag { color: #f0e68c; font-weight: bold } /* html/xml tag - lightyellow */ 107 | pre .atn { color: #bdb76b; font-weight: bold } /* attribute name - khaki */ 108 | pre .atv { color: #ffa0a0 } /* attribute value - pink */ 109 | pre .dec { color: #98fb98 } /* decimal - lightgreen */ 110 | 111 | /* Specify class=linenums on a pre to get line numbering */ 112 | ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE } /* IE indents via margin-left */ 113 | li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none } 114 | /* Alternate shading for lines */ 115 | li.L1,li.L3,li.L5,li.L7,li.L9 { } 116 | 117 | @media print { 118 | pre.prettyprint { background-color: none } 119 | pre .str, code .str { color: #060 } 120 | pre .kwd, code .kwd { color: #006; font-weight: bold } 121 | pre .com, code .com { color: #600; font-style: italic } 122 | pre .typ, code .typ { color: #404; font-weight: bold } 123 | pre .lit, code .lit { color: #044 } 124 | pre .pun, code .pun { color: #440 } 125 | pre .pln, code .pln { color: #000 } 126 | pre .tag, code .tag { color: #006; font-weight: bold } 127 | pre .atn, code .atn { color: #404 } 128 | pre .atv, code .atv { color: #060 } 129 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const handler = require('./lib/errorHandler'); 2 | 3 | module.exports = handler(); -------------------------------------------------------------------------------- /lib/ErrorList.js: -------------------------------------------------------------------------------- 1 | const uniqid = require('uniqid'); 2 | const moment = require('moment'); 3 | const stripAnsi = require('strip-ansi'); 4 | 5 | class ErrorList { 6 | 7 | constructor() { 8 | this._errors = []; 9 | } 10 | 11 | add(err) { 12 | const errorId = uniqid(); 13 | this._errors.unshift({ 14 | errorId: errorId, 15 | date: moment().format('MM-DD-YYYY HH:mm:ss'), 16 | message: stripAnsi(err.message || ''), 17 | stack: stripAnsi(err.stack || '') 18 | }); 19 | return errorId; 20 | } 21 | 22 | getError(errorId) { 23 | const matchedErrors = this._errors.filter((error) => { 24 | return error.errorId === errorId; 25 | }); 26 | return matchedErrors.length > 0 ? matchedErrors[0] : false; 27 | } 28 | 29 | get all() { 30 | return this._errors; 31 | } 32 | } 33 | 34 | module.exports = ErrorList; -------------------------------------------------------------------------------- /lib/ErrorServer.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const url = require('url'); 3 | 4 | const gutil = require('gulp-util'); 5 | const express = require('express'); 6 | const mustacheExpress = require('mustache-express'); 7 | const extend = require('extend'); 8 | 9 | const ErrorList = require('./ErrorList'); 10 | 11 | 12 | class ErrorServer { 13 | constructor(options = {}) { 14 | this.errors = new ErrorList(); 15 | this._listener = false; 16 | if (options !== false) { 17 | this._options = extend({}, ErrorServer.DEFAULT_OPTIONS, options); 18 | this._port = this._options.port; 19 | this._serverRoot = this._options.serverRoot; 20 | this._server = this._createServer(); 21 | if (this._options.autostart) { 22 | this.start(); 23 | } 24 | } 25 | } 26 | 27 | start() { 28 | if (!this._server) { 29 | if (!this._options.silent) gutil.log(gutil.colors.black.bgRed.bold(' !! Error Server Disabled ')); 30 | return; 31 | } 32 | if (this._listener) { 33 | if (!this._options.silent) gutil.log(gutil.colors.black.bgRed.bold(' !! Error Server already started ')); 34 | return; 35 | } 36 | this._listener = this._server.listen(this._port || 4001, () => { 37 | if (!this._options.silent) gutil.log(gutil.colors.black.bgGreen.bold(' @ Starting Error Server')); 38 | }); 39 | } 40 | 41 | stop() { 42 | if (!this._listener) { 43 | if (!this._options.silent) gutil.log(gutil.colors.black.bgRed.bold(' !! Error Server is not running ')); 44 | return; 45 | } 46 | if (!this._options.silent) gutil.log(gutil.colors.black.bgRed.bold(' @ Stopping Error Server')); 47 | this._listener.close(); 48 | this._listener = false; 49 | } 50 | 51 | addError(err) { 52 | const errorId = this.errors.add(err); 53 | err.serverUrl = this.getErrorLink(errorId); 54 | return err; 55 | } 56 | 57 | getErrorLink(errorId) { 58 | const error = this.errors.getError(errorId); 59 | if (!this.isUp || !error) return false; 60 | const urlParts = { 61 | protocol: 'http', 62 | hostname: 'localhost', 63 | port: this._port, 64 | pathname: errorId 65 | }; 66 | return url.format(urlParts); 67 | } 68 | 69 | _createServer() { 70 | const app = express(); 71 | app.engine('html', mustacheExpress()); 72 | app.set('view engine', 'mustache'); 73 | app.set('views', this._serverRoot); 74 | app.get('/', (req, res) => { 75 | res.render('index.html', { 76 | isSingle: false, 77 | errors: this.errors.all 78 | }); 79 | }); 80 | app.get('/:errorId', (req, res, next) => { 81 | const matchedErrors = this.errors.getError(req.params.errorId); 82 | if (matchedErrors) { 83 | res.render('index.html', { 84 | isSingle: true, 85 | errors: matchedErrors 86 | }); 87 | } else { 88 | next(); 89 | } 90 | }); 91 | app.use(express.static(this._serverRoot)); 92 | return app; 93 | } 94 | 95 | get isUp() { 96 | return !!this._listener; 97 | } 98 | 99 | } 100 | 101 | ErrorServer.DEFAULT_OPTIONS = { 102 | port: 4001, 103 | serverRoot: path.join(__dirname, '../errorServerRoot'), 104 | autostart: false, 105 | silent: false 106 | }; 107 | 108 | module.exports = ErrorServer; -------------------------------------------------------------------------------- /lib/errorHandler.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const extend = require('extend'); 3 | const gutil = require('gulp-util'); 4 | const notifier = require('node-notifier'); 5 | const opn = require('opn'); 6 | 7 | const ErrorServer = require('./ErrorServer'); 8 | 9 | const defaultConsoleError = (err) => { 10 | const errorElements = ['plugin', 'file', 'fileName', 'line', 'lineNumber']; 11 | gutil.log('*********************************************'); 12 | gutil.log(gutil.colors.bgRed.white('Compilation error.')); 13 | errorElements.forEach((el) => { 14 | if (err.hasOwnProperty(el)) { 15 | console.log('\n' + gutil.colors.red.bold(el.toUpperCase() + ': ', err[el])); 16 | } 17 | }); 18 | console.log ('\n' + gutil.colors.red(err.message || err.stack)); 19 | if (err.serverUrl) { 20 | console.log ('\n🍺 ' + err.serverUrl + '\n'); 21 | } 22 | gutil.log('*********************************************'); 23 | }; 24 | 25 | const DEFAULT_OPTIONS = { 26 | consoleError: defaultConsoleError, 27 | title: 'Compile Error', 28 | sound: true, 29 | icon: path.join(__dirname, '../assets/beer.png'), 30 | server: { 31 | port: 4001 32 | }, 33 | }; 34 | 35 | function errorHandlerFactory(options) { 36 | const handlerOptions = extend(true, {}, DEFAULT_OPTIONS, options || {}); 37 | 38 | const server = new ErrorServer(handlerOptions.server); 39 | 40 | const errorHandler = function(err) { 41 | const savedError = server.addError(err); 42 | 43 | handlerOptions.consoleError(err); 44 | 45 | notifier.notify({ 46 | 'title': handlerOptions.title, 47 | 'subtitle': path.basename(err.file || ''), 48 | 'message': err.message, 49 | 'sound': handlerOptions.sound, 50 | 'icon': handlerOptions.icon, 51 | 'closeLabel': !!savedError.serverUrl ? 'Hide': void 0, 52 | 'actions': !!savedError.serverUrl ? 'View': void 0, 53 | 'timeout': !!savedError.serverUrl ? 10 : void 0, 54 | 'wait': !!savedError.serverUrl, 55 | 'sender': Date.now() 56 | }, (err, response) => { 57 | if (err || !savedError.serverUrl) return; 58 | const proceed = (response.indexOf('clicked') !== -1) || 59 | (response.indexOf('activate') !== -1); 60 | if (proceed) opn(savedError.serverUrl); 61 | }); 62 | }; 63 | 64 | errorHandler.server = server; 65 | 66 | return errorHandler; 67 | } 68 | 69 | module.exports = errorHandlerFactory; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gulp-beer", 3 | "version": "1.0.2", 4 | "description": "Gulp (Be)tter (E)rror (R)eporting", 5 | "keywords": [ 6 | "gulp", 7 | "error", 8 | "report", 9 | "beer" 10 | ], 11 | "main": "index.js", 12 | "scripts": { 13 | "test": "echo \"Error: no test specified\" && exit 1" 14 | }, 15 | "author": "Lorenzo Zottar ", 16 | "repository": "https://github.com/lordgiotto/gulp-beer.git", 17 | "license": "MIT", 18 | "dependencies": { 19 | "express": "^4.15.2", 20 | "extend": "^3.0.0", 21 | "gulp-plumber": "^1.1.0", 22 | "gulp-util": "^3.0.8", 23 | "moment": "^2.18.0", 24 | "mustache": "^2.3.0", 25 | "mustache-express": "^1.2.4", 26 | "node-notifier": "^5.1.2", 27 | "opn": "^4.0.2", 28 | "strip-ansi": "^3.0.1", 29 | "through2": "^2.0.3", 30 | "uniqid": "^4.1.1" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.3: 6 | version "1.3.3" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 8 | dependencies: 9 | mime-types "~2.1.11" 10 | negotiator "0.6.1" 11 | 12 | ansi-regex@^2.0.0: 13 | version "2.1.1" 14 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 15 | 16 | ansi-styles@^2.2.1: 17 | version "2.2.1" 18 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 19 | 20 | array-differ@^1.0.0: 21 | version "1.0.0" 22 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 23 | 24 | array-flatten@1.1.1: 25 | version "1.1.1" 26 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 27 | 28 | array-uniq@^1.0.2: 29 | version "1.0.3" 30 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 31 | 32 | async@~0.2.10: 33 | version "0.2.10" 34 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 35 | 36 | beeper@^1.0.0: 37 | version "1.1.1" 38 | resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" 39 | 40 | buffer-shims@^1.0.0: 41 | version "1.0.0" 42 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 43 | 44 | chalk@^1.0.0, chalk@^1.1.1: 45 | version "1.1.3" 46 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 47 | dependencies: 48 | ansi-styles "^2.2.1" 49 | escape-string-regexp "^1.0.2" 50 | has-ansi "^2.0.0" 51 | strip-ansi "^3.0.0" 52 | supports-color "^2.0.0" 53 | 54 | clone-stats@^0.0.1: 55 | version "0.0.1" 56 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 57 | 58 | clone@^1.0.0: 59 | version "1.0.2" 60 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 61 | 62 | content-disposition@0.5.2: 63 | version "0.5.2" 64 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 65 | 66 | content-type@~1.0.2: 67 | version "1.0.2" 68 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 69 | 70 | cookie-signature@1.0.6: 71 | version "1.0.6" 72 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 73 | 74 | cookie@0.3.1: 75 | version "0.3.1" 76 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 77 | 78 | core-util-is@~1.0.0: 79 | version "1.0.2" 80 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 81 | 82 | dateformat@^2.0.0: 83 | version "2.0.0" 84 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" 85 | 86 | debug@2.6.1: 87 | version "2.6.1" 88 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" 89 | dependencies: 90 | ms "0.7.2" 91 | 92 | depd@1.1.0, depd@~1.1.0: 93 | version "1.1.0" 94 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 95 | 96 | destroy@~1.0.4: 97 | version "1.0.4" 98 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 99 | 100 | duplexer2@0.0.2: 101 | version "0.0.2" 102 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" 103 | dependencies: 104 | readable-stream "~1.1.9" 105 | 106 | ee-first@1.1.1: 107 | version "1.1.1" 108 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 109 | 110 | encodeurl@~1.0.1: 111 | version "1.0.1" 112 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 113 | 114 | escape-html@~1.0.3: 115 | version "1.0.3" 116 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 117 | 118 | escape-string-regexp@^1.0.2: 119 | version "1.0.5" 120 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 121 | 122 | etag@~1.8.0: 123 | version "1.8.0" 124 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" 125 | 126 | express@^4.15.2: 127 | version "4.15.2" 128 | resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35" 129 | dependencies: 130 | accepts "~1.3.3" 131 | array-flatten "1.1.1" 132 | content-disposition "0.5.2" 133 | content-type "~1.0.2" 134 | cookie "0.3.1" 135 | cookie-signature "1.0.6" 136 | debug "2.6.1" 137 | depd "~1.1.0" 138 | encodeurl "~1.0.1" 139 | escape-html "~1.0.3" 140 | etag "~1.8.0" 141 | finalhandler "~1.0.0" 142 | fresh "0.5.0" 143 | merge-descriptors "1.0.1" 144 | methods "~1.1.2" 145 | on-finished "~2.3.0" 146 | parseurl "~1.3.1" 147 | path-to-regexp "0.1.7" 148 | proxy-addr "~1.1.3" 149 | qs "6.4.0" 150 | range-parser "~1.2.0" 151 | send "0.15.1" 152 | serve-static "1.12.1" 153 | setprototypeof "1.0.3" 154 | statuses "~1.3.1" 155 | type-is "~1.6.14" 156 | utils-merge "1.0.0" 157 | vary "~1.1.0" 158 | 159 | extend@^3.0.0: 160 | version "3.0.0" 161 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 162 | 163 | fancy-log@^1.1.0: 164 | version "1.3.0" 165 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" 166 | dependencies: 167 | chalk "^1.1.1" 168 | time-stamp "^1.0.0" 169 | 170 | finalhandler@~1.0.0: 171 | version "1.0.0" 172 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.0.tgz#b5691c2c0912092f18ac23e9416bde5cd7dc6755" 173 | dependencies: 174 | debug "2.6.1" 175 | encodeurl "~1.0.1" 176 | escape-html "~1.0.3" 177 | on-finished "~2.3.0" 178 | parseurl "~1.3.1" 179 | statuses "~1.3.1" 180 | unpipe "~1.0.0" 181 | 182 | forwarded@~0.1.0: 183 | version "0.1.0" 184 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" 185 | 186 | fresh@0.5.0: 187 | version "0.5.0" 188 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" 189 | 190 | glogg@^1.0.0: 191 | version "1.0.0" 192 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" 193 | dependencies: 194 | sparkles "^1.0.0" 195 | 196 | growly@^1.3.0: 197 | version "1.3.0" 198 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 199 | 200 | gulp-plumber@^1.1.0: 201 | version "1.1.0" 202 | resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.1.0.tgz#f12176c2d0422f60306c242fff6a01a394faba09" 203 | dependencies: 204 | gulp-util "^3" 205 | through2 "^2" 206 | 207 | gulp-util@^3, gulp-util@^3.0.8: 208 | version "3.0.8" 209 | resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" 210 | dependencies: 211 | array-differ "^1.0.0" 212 | array-uniq "^1.0.2" 213 | beeper "^1.0.0" 214 | chalk "^1.0.0" 215 | dateformat "^2.0.0" 216 | fancy-log "^1.1.0" 217 | gulplog "^1.0.0" 218 | has-gulplog "^0.1.0" 219 | lodash._reescape "^3.0.0" 220 | lodash._reevaluate "^3.0.0" 221 | lodash._reinterpolate "^3.0.0" 222 | lodash.template "^3.0.0" 223 | minimist "^1.1.0" 224 | multipipe "^0.1.2" 225 | object-assign "^3.0.0" 226 | replace-ext "0.0.1" 227 | through2 "^2.0.0" 228 | vinyl "^0.5.0" 229 | 230 | gulplog@^1.0.0: 231 | version "1.0.0" 232 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 233 | dependencies: 234 | glogg "^1.0.0" 235 | 236 | has-ansi@^2.0.0: 237 | version "2.0.0" 238 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 239 | dependencies: 240 | ansi-regex "^2.0.0" 241 | 242 | has-gulplog@^0.1.0: 243 | version "0.1.0" 244 | resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" 245 | dependencies: 246 | sparkles "^1.0.0" 247 | 248 | http-errors@~1.6.1: 249 | version "1.6.1" 250 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" 251 | dependencies: 252 | depd "1.1.0" 253 | inherits "2.0.3" 254 | setprototypeof "1.0.3" 255 | statuses ">= 1.3.1 < 2" 256 | 257 | inherits@2.0.3, inherits@~2.0.1: 258 | version "2.0.3" 259 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 260 | 261 | ipaddr.js@1.2.0: 262 | version "1.2.0" 263 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4" 264 | 265 | isarray@0.0.1: 266 | version "0.0.1" 267 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 268 | 269 | isarray@~1.0.0: 270 | version "1.0.0" 271 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 272 | 273 | isexe@^1.1.1: 274 | version "1.1.2" 275 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 276 | 277 | lodash._basecopy@^3.0.0: 278 | version "3.0.1" 279 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 280 | 281 | lodash._basetostring@^3.0.0: 282 | version "3.0.1" 283 | resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" 284 | 285 | lodash._basevalues@^3.0.0: 286 | version "3.0.0" 287 | resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" 288 | 289 | lodash._getnative@^3.0.0: 290 | version "3.9.1" 291 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 292 | 293 | lodash._isiterateecall@^3.0.0: 294 | version "3.0.9" 295 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 296 | 297 | lodash._reescape@^3.0.0: 298 | version "3.0.0" 299 | resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" 300 | 301 | lodash._reevaluate@^3.0.0: 302 | version "3.0.0" 303 | resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" 304 | 305 | lodash._reinterpolate@^3.0.0: 306 | version "3.0.0" 307 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 308 | 309 | lodash._root@^3.0.0: 310 | version "3.0.1" 311 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 312 | 313 | lodash.escape@^3.0.0: 314 | version "3.2.0" 315 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" 316 | dependencies: 317 | lodash._root "^3.0.0" 318 | 319 | lodash.isarguments@^3.0.0: 320 | version "3.1.0" 321 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 322 | 323 | lodash.isarray@^3.0.0: 324 | version "3.0.4" 325 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 326 | 327 | lodash.keys@^3.0.0: 328 | version "3.1.2" 329 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 330 | dependencies: 331 | lodash._getnative "^3.0.0" 332 | lodash.isarguments "^3.0.0" 333 | lodash.isarray "^3.0.0" 334 | 335 | lodash.restparam@^3.0.0: 336 | version "3.6.1" 337 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 338 | 339 | lodash.template@^3.0.0: 340 | version "3.6.2" 341 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 342 | dependencies: 343 | lodash._basecopy "^3.0.0" 344 | lodash._basetostring "^3.0.0" 345 | lodash._basevalues "^3.0.0" 346 | lodash._isiterateecall "^3.0.0" 347 | lodash._reinterpolate "^3.0.0" 348 | lodash.escape "^3.0.0" 349 | lodash.keys "^3.0.0" 350 | lodash.restparam "^3.0.0" 351 | lodash.templatesettings "^3.0.0" 352 | 353 | lodash.templatesettings@^3.0.0: 354 | version "3.1.1" 355 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" 356 | dependencies: 357 | lodash._reinterpolate "^3.0.0" 358 | lodash.escape "^3.0.0" 359 | 360 | lru-cache@~2.5.0: 361 | version "2.5.2" 362 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.5.2.tgz#1fddad938aae1263ce138680be1b3f591c0ab41c" 363 | 364 | macaddress@^0.2.8: 365 | version "0.2.8" 366 | resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" 367 | 368 | media-typer@0.3.0: 369 | version "0.3.0" 370 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 371 | 372 | merge-descriptors@1.0.1: 373 | version "1.0.1" 374 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 375 | 376 | methods@~1.1.2: 377 | version "1.1.2" 378 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 379 | 380 | mime-db@~1.26.0: 381 | version "1.26.0" 382 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" 383 | 384 | mime-types@~2.1.11, mime-types@~2.1.13: 385 | version "2.1.14" 386 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" 387 | dependencies: 388 | mime-db "~1.26.0" 389 | 390 | mime@1.3.4: 391 | version "1.3.4" 392 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 393 | 394 | minimist@^1.1.0: 395 | version "1.2.0" 396 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 397 | 398 | moment@^2.18.0: 399 | version "2.18.0" 400 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.0.tgz#6cfec6a495eca915d02600a67020ed994937252c" 401 | 402 | ms@0.7.2: 403 | version "0.7.2" 404 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 405 | 406 | multipipe@^0.1.2: 407 | version "0.1.2" 408 | resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" 409 | dependencies: 410 | duplexer2 "0.0.2" 411 | 412 | mustache-express@^1.2.4: 413 | version "1.2.4" 414 | resolved "https://registry.yarnpkg.com/mustache-express/-/mustache-express-1.2.4.tgz#4cbc876367b676cf8b7020921781c6a1912bf1ab" 415 | dependencies: 416 | async "~0.2.10" 417 | lru-cache "~2.5.0" 418 | mustache "~2.3.0" 419 | 420 | mustache@^2.3.0, mustache@~2.3.0: 421 | version "2.3.0" 422 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" 423 | 424 | negotiator@0.6.1: 425 | version "0.6.1" 426 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 427 | 428 | node-notifier@^5.1.2: 429 | version "5.1.2" 430 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" 431 | dependencies: 432 | growly "^1.3.0" 433 | semver "^5.3.0" 434 | shellwords "^0.1.0" 435 | which "^1.2.12" 436 | 437 | object-assign@^3.0.0: 438 | version "3.0.0" 439 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 440 | 441 | object-assign@^4.0.1: 442 | version "4.1.1" 443 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 444 | 445 | on-finished@~2.3.0: 446 | version "2.3.0" 447 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 448 | dependencies: 449 | ee-first "1.1.1" 450 | 451 | opn@^4.0.2: 452 | version "4.0.2" 453 | resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" 454 | dependencies: 455 | object-assign "^4.0.1" 456 | pinkie-promise "^2.0.0" 457 | 458 | parseurl@~1.3.1: 459 | version "1.3.1" 460 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 461 | 462 | path-to-regexp@0.1.7: 463 | version "0.1.7" 464 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 465 | 466 | pinkie-promise@^2.0.0: 467 | version "2.0.1" 468 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 469 | dependencies: 470 | pinkie "^2.0.0" 471 | 472 | pinkie@^2.0.0: 473 | version "2.0.4" 474 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 475 | 476 | process-nextick-args@~1.0.6: 477 | version "1.0.7" 478 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 479 | 480 | proxy-addr@~1.1.3: 481 | version "1.1.3" 482 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.3.tgz#dc97502f5722e888467b3fa2297a7b1ff47df074" 483 | dependencies: 484 | forwarded "~0.1.0" 485 | ipaddr.js "1.2.0" 486 | 487 | qs@6.4.0: 488 | version "6.4.0" 489 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 490 | 491 | range-parser@~1.2.0: 492 | version "1.2.0" 493 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 494 | 495 | readable-stream@^2.1.5: 496 | version "2.2.6" 497 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.6.tgz#8b43aed76e71483938d12a8d46c6cf1a00b1f816" 498 | dependencies: 499 | buffer-shims "^1.0.0" 500 | core-util-is "~1.0.0" 501 | inherits "~2.0.1" 502 | isarray "~1.0.0" 503 | process-nextick-args "~1.0.6" 504 | string_decoder "~0.10.x" 505 | util-deprecate "~1.0.1" 506 | 507 | readable-stream@~1.1.9: 508 | version "1.1.14" 509 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 510 | dependencies: 511 | core-util-is "~1.0.0" 512 | inherits "~2.0.1" 513 | isarray "0.0.1" 514 | string_decoder "~0.10.x" 515 | 516 | replace-ext@0.0.1: 517 | version "0.0.1" 518 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 519 | 520 | semver@^5.3.0: 521 | version "5.3.0" 522 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 523 | 524 | send@0.15.1: 525 | version "0.15.1" 526 | resolved "https://registry.yarnpkg.com/send/-/send-0.15.1.tgz#8a02354c26e6f5cca700065f5f0cdeba90ec7b5f" 527 | dependencies: 528 | debug "2.6.1" 529 | depd "~1.1.0" 530 | destroy "~1.0.4" 531 | encodeurl "~1.0.1" 532 | escape-html "~1.0.3" 533 | etag "~1.8.0" 534 | fresh "0.5.0" 535 | http-errors "~1.6.1" 536 | mime "1.3.4" 537 | ms "0.7.2" 538 | on-finished "~2.3.0" 539 | range-parser "~1.2.0" 540 | statuses "~1.3.1" 541 | 542 | serve-static@1.12.1: 543 | version "1.12.1" 544 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.1.tgz#7443a965e3ced647aceb5639fa06bf4d1bbe0039" 545 | dependencies: 546 | encodeurl "~1.0.1" 547 | escape-html "~1.0.3" 548 | parseurl "~1.3.1" 549 | send "0.15.1" 550 | 551 | setprototypeof@1.0.3: 552 | version "1.0.3" 553 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 554 | 555 | shellwords@^0.1.0: 556 | version "0.1.0" 557 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" 558 | 559 | sparkles@^1.0.0: 560 | version "1.0.0" 561 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" 562 | 563 | "statuses@>= 1.3.1 < 2", statuses@~1.3.1: 564 | version "1.3.1" 565 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 566 | 567 | string_decoder@~0.10.x: 568 | version "0.10.31" 569 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 570 | 571 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 572 | version "3.0.1" 573 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 574 | dependencies: 575 | ansi-regex "^2.0.0" 576 | 577 | supports-color@^2.0.0: 578 | version "2.0.0" 579 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 580 | 581 | through2@^2, through2@^2.0.0, through2@^2.0.3: 582 | version "2.0.3" 583 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 584 | dependencies: 585 | readable-stream "^2.1.5" 586 | xtend "~4.0.1" 587 | 588 | time-stamp@^1.0.0: 589 | version "1.0.1" 590 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" 591 | 592 | type-is@~1.6.14: 593 | version "1.6.14" 594 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" 595 | dependencies: 596 | media-typer "0.3.0" 597 | mime-types "~2.1.13" 598 | 599 | uniqid@^4.1.1: 600 | version "4.1.1" 601 | resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" 602 | dependencies: 603 | macaddress "^0.2.8" 604 | 605 | unpipe@~1.0.0: 606 | version "1.0.0" 607 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 608 | 609 | util-deprecate@~1.0.1: 610 | version "1.0.2" 611 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 612 | 613 | utils-merge@1.0.0: 614 | version "1.0.0" 615 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 616 | 617 | vary@~1.1.0: 618 | version "1.1.0" 619 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" 620 | 621 | vinyl@^0.5.0: 622 | version "0.5.3" 623 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" 624 | dependencies: 625 | clone "^1.0.0" 626 | clone-stats "^0.0.1" 627 | replace-ext "0.0.1" 628 | 629 | which@^1.2.12: 630 | version "1.2.12" 631 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 632 | dependencies: 633 | isexe "^1.1.1" 634 | 635 | xtend@~4.0.1: 636 | version "4.0.1" 637 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 638 | --------------------------------------------------------------------------------