├── .editorconfig ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── package.json ├── src └── index.js ├── test └── index.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /node_modules 3 | *.sublime* 4 | .idea 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "6" 4 | - "7" 5 | notifications: 6 | email: false 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 3.0.0 4 | ##### Breaking 5 | Remove Babel transpilation. Node 6.4.0 or greater is now required. 6 | 7 | ##### Fixes 8 | Handle `browser.manage.logs()` failing. GeckoDriver currently doesn't support it and blows up with a stack trace. 9 | 10 | ## 2.0.1 11 | ##### Fixes 12 | * Don't print header when there are 0 results after filtering. 13 | 14 | ## 2.0.0 15 | ##### Breaking 16 | * Require `protractor` `> 2.2.0` as a `peerDependency`. 17 | 18 | ##### Fixes 19 | * Make plugin compatible with the new plugin system introduced in `protractor` `2.2.0`. 20 | 21 | ## 1.0.1 22 | ##### Fixes 23 | * Add `protractor` as a `< 2.1.0` `peerDependency` to indicate that `1.x` isn't compatible with `protractor` `2.2.0` and above. 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Updater Inc. 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 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # protractor-console [![build status](https://travis-ci.org/Updater/protractor-console.svg?branch=master)](https://travis-ci.org/Updater/protractor-console) 2 | 3 | Display log statements from the browser that occur while Protractor tests are running. Similar to the "Console Plugin" that comes with Protractor, but with some significant differences: 4 | 5 | * Associates logs with individual tests, printing them after each test run. "Console Plugin" only prints logs after all tests have run, making it more difficult to understand when they occured. For this to be truly beneficial, it should be used in conjunction with a more sophisticated test reporter like https://github.com/bcaudan/jasmine-spec-reporter. 6 | 7 | ![image](https://cloud.githubusercontent.com/assets/356320/8966068/2ef16484-35fd-11e5-9df0-90273fdd9534.png) 8 | 9 | * Allows filtering all log levels. 10 | 11 | ## Installation 12 | ```bash 13 | npm install --save-dev protractor-console 14 | ``` 15 | 16 | ## Usage 17 | This module is implemented as a Protractor plugin. Add it in the Protractor config like so: 18 | 19 | ```javascript 20 | exports.config = { 21 | plugins: [{ 22 | package: 'protractor-console', 23 | logLevels: ['severe'] 24 | }], 25 | ``` 26 | 27 | ### Configuration 28 | * `logLevels`: Inclusive `Array` filter for which log levels to show. Can be any of `'debug'`, `'info'`, `'warning'` and `'severe'`. Defaults to `['severe', 'warning']`. 29 | 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "protractor-console", 3 | "version": "3.0.0", 4 | "description": "Print console logging statements that occur during Protractor test runs.", 5 | "main": "src/index.js", 6 | "license": "MIT", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/Updater/protractor-console.git" 10 | }, 11 | "keywords": [ 12 | "protractor", 13 | "protractor-plugin", 14 | "log", 15 | "console" 16 | ], 17 | "scripts": { 18 | "test": "mocha" 19 | }, 20 | "engines": { 21 | "node": ">=6.4.0" 22 | }, 23 | "peerDependencies": { 24 | "protractor": ">= 2.2.0" 25 | }, 26 | "dependencies": { 27 | "chalk": "^1.1.0", 28 | "lodash": "^3.10.0" 29 | }, 30 | "devDependencies": { 31 | "chai": "^3.2.0", 32 | "chai-as-promised": "^5.1.0", 33 | "mocha": "^2.2.4", 34 | "sinon": "^1.15.4", 35 | "sinon-chai": "^2.8.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const Chalk = require('chalk'); 3 | 4 | // Need to explicitly enable colors, probably for the same reason as: 5 | // https://github.com/bcaudan/jasmine-spec-reporter/issues/36 6 | var chalk = new Chalk.constructor({ 7 | enabled: true 8 | }); 9 | 10 | const LEVELS = { 11 | debug: { 12 | name: 'debug', 13 | color: 'cyan' 14 | }, 15 | info: { 16 | name: 'info', 17 | color: 'magenta' 18 | }, 19 | warning: { 20 | name: 'warning', 21 | color: 'yellow' 22 | }, 23 | severe: { 24 | name: 'severe', 25 | color: 'red' 26 | } 27 | }; 28 | 29 | const DEFAULT_LOG_LEVELS = [ 30 | LEVELS.warning.name, 31 | LEVELS.severe.name 32 | ]; 33 | 34 | // http://stackoverflow.com/questions/1879860/most-reliable-split-character 35 | const SPLIT_CHAR = '\u0007'; 36 | 37 | module.exports = { 38 | enabled: true, 39 | 40 | setup: function() { 41 | // Disable the plugin if `browser.manage().logs()` isn't supported by the browser driver. 42 | // E.g. GeckoDriver currently doesn't support this call and blows up with a stacktrace. 43 | // https://github.com/SeleniumHQ/selenium/issues/2972 44 | browser.manage().logs().get('browser').then(null, () => { 45 | this.enabled = false; 46 | 47 | logPrinter({ 48 | message: 'Protractor Console: This browser does not appear to support retrieving logs.', 49 | level: 'warning', 50 | }); 51 | }); 52 | }, 53 | 54 | postTest: function() { 55 | let config = this.config; 56 | 57 | if (!this.enabled) { 58 | return; 59 | } 60 | 61 | return browser.manage().logs().get('browser') 62 | .then(result => { 63 | result = result.filter(byLogLevel, config); 64 | 65 | if (result.length === 0) { 66 | return; 67 | } 68 | 69 | printHeader.call(config); 70 | 71 | _(result) 72 | .chain() 73 | .reduce(group, {}) 74 | .forEach(printLog, config) 75 | .value(); 76 | }); 77 | } 78 | }; 79 | 80 | function getLogLevels() { 81 | return this.logLevels || DEFAULT_LOG_LEVELS; 82 | } 83 | 84 | function byLogLevel(log) { 85 | return getLogLevels.call(this) 86 | .map(name => name.toLowerCase()) 87 | .indexOf(log.level.name.toLowerCase()) !== -1; 88 | } 89 | 90 | function group(result, log) { 91 | let message = log.message; 92 | let id = [message, log.level.name].join(SPLIT_CHAR); 93 | result[id] = result[id] ? ++result[id] : 1; 94 | return result; 95 | } 96 | 97 | function printHeader() { 98 | (this.headerPrinter || headerPrinter).call(this); 99 | } 100 | 101 | function headerPrinter() { 102 | let header = `Test console output (log levels: ${getLogLevels.call(this).join(', ')})`; 103 | console.log(chalk.underline(header)); 104 | } 105 | 106 | function printLog(count, log) { 107 | let split = log.split(SPLIT_CHAR); 108 | let options = { 109 | message: split[0], 110 | level: split[1], 111 | count 112 | }; 113 | let printer = this.logPrinter || logPrinter; 114 | printer.call(printer, options); 115 | } 116 | 117 | function logPrinter({message, level, count}) { 118 | let color = chalk[LEVELS[level.toLowerCase()].color]; 119 | let args = [color(message)]; 120 | 121 | if (count > 1) { 122 | args.push(`(${count})`); 123 | } 124 | 125 | console.log.apply(console, args); 126 | } 127 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | const sinon = require('sinon'); 2 | const chai = require('chai'); 3 | const sinonChai = require('sinon-chai'); 4 | const _ = require('lodash'); 5 | const Reporter = require('../src/index'); 6 | 7 | let expect = chai.expect; 8 | chai.use(sinonChai); 9 | 10 | describe('protractor-console', () => { 11 | let reporter, printerSpy, headerSpy; 12 | 13 | beforeEach(() => { 14 | let browser = global.browser = {}; 15 | browser.manage = () => { 16 | return { 17 | logs: () => { 18 | return { 19 | get: () => { 20 | return Promise.resolve(getSampleOutput()); 21 | } 22 | }; 23 | } 24 | }; 25 | }; 26 | 27 | // Workaround for lack of "new"ing the plugin, resetting before each test run. 28 | reporter = _.cloneDeep(Reporter); 29 | reporter.config = {}; 30 | printerSpy = sinon.spy(); 31 | reporter.config.logPrinter = printerSpy; 32 | 33 | headerSpy = sinon.spy(); 34 | reporter.config.headerPrinter = headerSpy; 35 | }); 36 | 37 | afterEach(() => { 38 | printerSpy.reset(); 39 | headerSpy.reset(); 40 | }); 41 | 42 | it('should filter by log level', () => { 43 | reporter.config.logLevels = ['debug']; 44 | 45 | return reporter.postTest() 46 | .then(() => { 47 | expect(printerSpy).to.have.callCount(0); 48 | expect(headerSpy).to.have.callCount(0); 49 | 50 | reporter.config.logLevels = ['severe']; 51 | return reporter.postTest.call(reporter); 52 | }) 53 | .then(() => { 54 | expect(printerSpy).to.have.callCount(1); 55 | expect(headerSpy).to.have.callCount(1); 56 | }); 57 | }); 58 | 59 | it('should group identical logs into a single line', () => { 60 | reporter.config.logLevels = ['warning']; 61 | 62 | return reporter.postTest().then(() => { 63 | let match1 = getSampleOutput()[1]; 64 | let match2 = getSampleOutput()[6]; 65 | 66 | expect(printerSpy).to.have.been.calledTwice; 67 | expect(printerSpy).to.have.been.calledWithMatch({ 68 | message: match1.message, 69 | level: match1.level.name, 70 | count: 5 71 | }); 72 | expect(printerSpy).to.have.been.calledWithMatch({ 73 | message: match2.message, 74 | level: match2.level.name, 75 | count: 1 76 | }); 77 | }); 78 | }); 79 | }); 80 | 81 | function getSampleOutput() { 82 | return [{ 83 | level: { 84 | value: 800, 85 | name: 'INFO' 86 | }, 87 | message: 'Could not read chrome manifest \'file:///Applications/Firefox.app/Contents/Resources/chrome.manifest\'.', 88 | timestamp: 1437581541737, 89 | type: '' 90 | }, { 91 | level: { 92 | value: 900, 93 | name: 'WARNING' 94 | }, 95 | message: 'Expected \'none\' or URL but found \'progid\'. Error in parsing value for \'filter\'. Declaration dropped.', 96 | timestamp: 1437581545462, 97 | type: '' 98 | }, { 99 | level: { 100 | value: 900, 101 | name: 'WARNING' 102 | }, 103 | message: 'Expected \'none\' or URL but found \'progid\'. Error in parsing value for \'filter\'. Declaration dropped.', 104 | timestamp: 1437581545462, 105 | type: '' 106 | }, { 107 | level: { 108 | value: 900, 109 | name: 'WARNING' 110 | }, 111 | message: 'Expected \'none\' or URL but found \'progid\'. Error in parsing value for \'filter\'. Declaration dropped.', 112 | timestamp: 1437581545462, 113 | type: '' 114 | }, { 115 | level: { 116 | value: 900, 117 | name: 'WARNING' 118 | }, 119 | message: 'Expected \'none\' or URL but found \'progid\'. Error in parsing value for \'filter\'. Declaration dropped.', 120 | timestamp: 1437581545463, 121 | type: '' 122 | }, { 123 | level: { 124 | value: 900, 125 | name: 'WARNING' 126 | }, 127 | message: 'Expected \'none\' or URL but found \'progid\'. Error in parsing value for \'filter\'. Declaration dropped.', 128 | timestamp: 1437581545463, 129 | type: '' 130 | }, { 131 | level: { 132 | value: 900, 133 | name: 'WARNING' 134 | }, 135 | message: 'mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create', 136 | timestamp: 1437581545969, 137 | type: '' 138 | }, { 139 | level: { 140 | value: 1000, 141 | name: 'SEVERE' 142 | }, 143 | message: 'http://api.site.com/ 0:0 Failed to load resource: the server responded with a status of 401 (Unauthorized)', 144 | timestamp: 1437581551742, 145 | type: '' 146 | }]; 147 | } 148 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.1.1" 7 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 8 | 9 | ansi-styles@^2.2.1: 10 | version "2.2.1" 11 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 12 | 13 | assertion-error@^1.0.1: 14 | version "1.0.2" 15 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 16 | 17 | chai-as-promised@^5.1.0: 18 | version "5.3.0" 19 | resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-5.3.0.tgz#09d7a402908aa70dfdbead53e5853fc79d3ef21c" 20 | 21 | chai@^3.2.0: 22 | version "3.5.0" 23 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 24 | dependencies: 25 | assertion-error "^1.0.1" 26 | deep-eql "^0.1.3" 27 | type-detect "^1.0.0" 28 | 29 | chalk@^1.1.0: 30 | version "1.1.3" 31 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 32 | dependencies: 33 | ansi-styles "^2.2.1" 34 | escape-string-regexp "^1.0.2" 35 | has-ansi "^2.0.0" 36 | strip-ansi "^3.0.0" 37 | supports-color "^2.0.0" 38 | 39 | commander@0.6.1: 40 | version "0.6.1" 41 | resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" 42 | 43 | commander@2.3.0: 44 | version "2.3.0" 45 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" 46 | 47 | debug@2.2.0: 48 | version "2.2.0" 49 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 50 | dependencies: 51 | ms "0.7.1" 52 | 53 | deep-eql@^0.1.3: 54 | version "0.1.3" 55 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 56 | dependencies: 57 | type-detect "0.1.1" 58 | 59 | diff@1.4.0: 60 | version "1.4.0" 61 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 62 | 63 | escape-string-regexp@1.0.2: 64 | version "1.0.2" 65 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" 66 | 67 | escape-string-regexp@^1.0.2: 68 | version "1.0.5" 69 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 70 | 71 | formatio@1.1.1: 72 | version "1.1.1" 73 | resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" 74 | dependencies: 75 | samsam "~1.1" 76 | 77 | glob@3.2.11: 78 | version "3.2.11" 79 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" 80 | dependencies: 81 | inherits "2" 82 | minimatch "0.3" 83 | 84 | growl@1.9.2: 85 | version "1.9.2" 86 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 87 | 88 | has-ansi@^2.0.0: 89 | version "2.0.0" 90 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 91 | dependencies: 92 | ansi-regex "^2.0.0" 93 | 94 | inherits@2: 95 | version "2.0.3" 96 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 97 | 98 | inherits@2.0.1: 99 | version "2.0.1" 100 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 101 | 102 | jade@0.26.3: 103 | version "0.26.3" 104 | resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" 105 | dependencies: 106 | commander "0.6.1" 107 | mkdirp "0.3.0" 108 | 109 | lodash@^3.10.0: 110 | version "3.10.1" 111 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 112 | 113 | lolex@1.3.2: 114 | version "1.3.2" 115 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" 116 | 117 | lru-cache@2: 118 | version "2.7.3" 119 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 120 | 121 | minimatch@0.3: 122 | version "0.3.0" 123 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" 124 | dependencies: 125 | lru-cache "2" 126 | sigmund "~1.0.0" 127 | 128 | minimist@0.0.8: 129 | version "0.0.8" 130 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 131 | 132 | mkdirp@0.3.0: 133 | version "0.3.0" 134 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" 135 | 136 | mkdirp@0.5.1: 137 | version "0.5.1" 138 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 139 | dependencies: 140 | minimist "0.0.8" 141 | 142 | mocha@^2.2.4: 143 | version "2.5.3" 144 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" 145 | dependencies: 146 | commander "2.3.0" 147 | debug "2.2.0" 148 | diff "1.4.0" 149 | escape-string-regexp "1.0.2" 150 | glob "3.2.11" 151 | growl "1.9.2" 152 | jade "0.26.3" 153 | mkdirp "0.5.1" 154 | supports-color "1.2.0" 155 | to-iso-string "0.0.2" 156 | 157 | ms@0.7.1: 158 | version "0.7.1" 159 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 160 | 161 | samsam@1.1.2, samsam@~1.1: 162 | version "1.1.2" 163 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" 164 | 165 | sigmund@~1.0.0: 166 | version "1.0.1" 167 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 168 | 169 | sinon-chai@^2.8.0: 170 | version "2.11.0" 171 | resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.11.0.tgz#93d90f989fff67ce45767077ffe575dde1faea6d" 172 | 173 | sinon@^1.15.4: 174 | version "1.17.7" 175 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" 176 | dependencies: 177 | formatio "1.1.1" 178 | lolex "1.3.2" 179 | samsam "1.1.2" 180 | util ">=0.10.3 <1" 181 | 182 | strip-ansi@^3.0.0: 183 | version "3.0.1" 184 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 185 | dependencies: 186 | ansi-regex "^2.0.0" 187 | 188 | supports-color@1.2.0: 189 | version "1.2.0" 190 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" 191 | 192 | supports-color@^2.0.0: 193 | version "2.0.0" 194 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 195 | 196 | to-iso-string@0.0.2: 197 | version "0.0.2" 198 | resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" 199 | 200 | type-detect@0.1.1: 201 | version "0.1.1" 202 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 203 | 204 | type-detect@^1.0.0: 205 | version "1.0.0" 206 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 207 | 208 | "util@>=0.10.3 <1": 209 | version "0.10.3" 210 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 211 | dependencies: 212 | inherits "2.0.1" 213 | --------------------------------------------------------------------------------