├── .npmignore ├── .circleci └── config.yml ├── index.js ├── README.md ├── .github └── workflows │ └── run-danger-yarn.yml ├── package.json ├── logFormat.js ├── .gitignore ├── test └── index.js └── yarn.lock /.npmignore: -------------------------------------------------------------------------------- 1 | .circleci/ 2 | node_modules/ 3 | test/ 4 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | yarn: artsy/yarn@5.1.3 5 | 6 | workflows: 7 | build_and_verify: 8 | jobs: 9 | - yarn/workflow-queue 10 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var morgan = require('morgan'); 2 | var logFormat = require('./logFormat.js'); 3 | 4 | module.exports = process.env.NODE_ENV === 'development' ? morgan('dev') : morgan(logFormat); 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @artsy/morgan 2 | 3 | Colorful logging for Artsy Express apps. 4 | 5 | Point People: @izakp, @kanaabe 6 | 7 | Use: 8 | 9 | ``` 10 | var logger = require('@artsy/morgan'); 11 | app.use(logger); 12 | ``` 13 | -------------------------------------------------------------------------------- /.github/workflows/run-danger-yarn.yml: -------------------------------------------------------------------------------- 1 | name: ☢️ Danger - Yarn 2 | 3 | on: 4 | pull_request: 5 | types: [opened, reopened, synchronize] 6 | 7 | jobs: 8 | run-danger-yarn: 9 | uses: artsy/duchamp/.github/workflows/danger-yarn.yml@main 10 | secrets: 11 | danger-token: ${{ secrets.DANGER_TOKEN }} 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@artsy/morgan", 3 | "version": "1.0.2", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "author": { 7 | "name": "Cameron Rollheiser", 8 | "email": "cameron.rollheiser@artsymail.com" 9 | }, 10 | "scripts": { 11 | "test": "NODE_ENV=staging mocha -r should" 12 | }, 13 | "publishConfig": { 14 | "registry": "https://registry.npmjs.org/", 15 | "access": "public" 16 | }, 17 | "dependencies": { 18 | "chalk": "^1.1.3", 19 | "morgan": "^1.9.1" 20 | }, 21 | "devDependencies": { 22 | "mocha": "^3.2.0", 23 | "should": "^11.2.1" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /logFormat.js: -------------------------------------------------------------------------------- 1 | var chalk = require('chalk'); 2 | 3 | module.exports = function(tokens, req, res) { 4 | var status, url, urlStatus; 5 | url = tokens.url(req, res); 6 | status = tokens.status(req, res); 7 | urlStatus = (function() { 8 | switch (false) { 9 | case !(status >= 500): 10 | return chalk.red(url + ' ' + status); 11 | case !(status >= 400): 12 | return chalk.yellow(url + ' ' + status); 13 | case !(status >= 300): 14 | return chalk.cyan(url + ' ' + status); 15 | case !(status >= 200): 16 | return chalk.green(url + ' ' + status); 17 | default: 18 | return chalk.white(url + ' ' + status); 19 | } 20 | })(); 21 | return chalk.blue(tokens.method(req, res)) + 22 | ' ' + urlStatus + ' ' + chalk.cyan(tokens['response-time'](req, res) + 'ms') + 23 | ' ' + chalk.white(tokens['remote-addr'](req, res)) + 24 | ' "' + chalk.white(tokens['user-agent'](req, res)) + '"'; 25 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | var logFormat = require('../logFormat.js') 2 | 3 | describe('logger format', function() { 4 | 5 | it('logs 200 messages green', function() { 6 | var tokens; 7 | tokens = { 8 | status: function() { 9 | return 200; 10 | }, 11 | method: function() { 12 | return 'GET'; 13 | }, 14 | url: function() { 15 | return 'https://artsy.net'; 16 | }, 17 | 'response-time': function() { 18 | return 1000; 19 | }, 20 | 'remote-addr': function() { 21 | return '0.0.0.0'; 22 | }, 23 | 'user-agent': function() { 24 | return 'Mozilla'; 25 | } 26 | }; 27 | logFormat(tokens, {}, {}).should.equal('\u001b[34mGET\u001b[39m \u001b[32mhttps://artsy.net 200\u001b[39m \u001b[36m1000ms\u001b[39m \u001b[37m0.0.0.0\u001b[39m "\u001b[37mMozilla\u001b[39m"'); 28 | }); 29 | 30 | it('logs 300 messages in cyan', function() { 31 | var tokens; 32 | tokens = { 33 | status: function() { 34 | return 300; 35 | }, 36 | method: function() { 37 | return 'GET'; 38 | }, 39 | url: function() { 40 | return 'https://artsy.net'; 41 | }, 42 | 'response-time': function() { 43 | return 1000; 44 | }, 45 | 'remote-addr': function() { 46 | return '0.0.0.0'; 47 | }, 48 | 'user-agent': function() { 49 | return 'Mozilla'; 50 | } 51 | }; 52 | logFormat(tokens, {}, {}).should.equal('\u001b[34mGET\u001b[39m \u001b[36mhttps://artsy.net 300\u001b[39m \u001b[36m1000ms\u001b[39m \u001b[37m0.0.0.0\u001b[39m "\u001b[37mMozilla\u001b[39m"'); 53 | }); 54 | 55 | it('logs 400 messages in yellow', function() { 56 | var tokens; 57 | tokens = { 58 | status: function() { 59 | return 400; 60 | }, 61 | method: function() { 62 | return 'GET'; 63 | }, 64 | url: function() { 65 | return 'https://artsy.net'; 66 | }, 67 | 'response-time': function() { 68 | return 1000; 69 | }, 70 | 'remote-addr': function() { 71 | return '0.0.0.0'; 72 | }, 73 | 'user-agent': function() { 74 | return 'Mozilla'; 75 | } 76 | }; 77 | logFormat(tokens, {}, {}).should.equal('\u001b[34mGET\u001b[39m \u001b[33mhttps://artsy.net 400\u001b[39m \u001b[36m1000ms\u001b[39m \u001b[37m0.0.0.0\u001b[39m "\u001b[37mMozilla\u001b[39m"'); 78 | }); 79 | 80 | it('logs 500 messages in red', function() { 81 | var tokens; 82 | tokens = { 83 | status: function() { 84 | return 500; 85 | }, 86 | method: function() { 87 | return 'GET'; 88 | }, 89 | url: function() { 90 | return 'https://artsy.net'; 91 | }, 92 | 'response-time': function() { 93 | return 1000; 94 | }, 95 | 'remote-addr': function() { 96 | return '0.0.0.0'; 97 | }, 98 | 'user-agent': function() { 99 | return 'Mozilla'; 100 | } 101 | }; 102 | logFormat(tokens, {}, {}).should.equal('\u001b[34mGET\u001b[39m \u001b[31mhttps://artsy.net 500\u001b[39m \u001b[36m1000ms\u001b[39m \u001b[37m0.0.0.0\u001b[39m "\u001b[37mMozilla\u001b[39m"'); 103 | }); 104 | 105 | it('defaults no status in white', function() { 106 | var tokens; 107 | tokens = { 108 | status: function() { 109 | return null; 110 | }, 111 | method: function() { 112 | return 'GET'; 113 | }, 114 | url: function() { 115 | return 'https://artsy.net'; 116 | }, 117 | 'response-time': function() { 118 | return 1000; 119 | }, 120 | 'remote-addr': function() { 121 | return '0.0.0.0'; 122 | }, 123 | 'user-agent': function() { 124 | return 'Mozilla'; 125 | } 126 | }; 127 | logFormat(tokens, {}, {}).should.equal('\u001b[34mGET\u001b[39m \u001b[37mhttps://artsy.net null\u001b[39m \u001b[36m1000ms\u001b[39m \u001b[37m0.0.0.0\u001b[39m "\u001b[37mMozilla\u001b[39m"'); 128 | }); 129 | }); 130 | -------------------------------------------------------------------------------- /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 | balanced-match@^0.4.1: 14 | version "0.4.2" 15 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 16 | 17 | basic-auth@~2.0.0: 18 | version "2.0.1" 19 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 20 | dependencies: 21 | safe-buffer "5.1.2" 22 | 23 | brace-expansion@^1.0.0: 24 | version "1.1.7" 25 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 26 | dependencies: 27 | balanced-match "^0.4.1" 28 | concat-map "0.0.1" 29 | 30 | browser-stdout@1.3.0: 31 | version "1.3.0" 32 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 33 | 34 | chalk@^1.1.3: 35 | version "1.1.3" 36 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 37 | dependencies: 38 | ansi-styles "^2.2.1" 39 | escape-string-regexp "^1.0.2" 40 | has-ansi "^2.0.0" 41 | strip-ansi "^3.0.0" 42 | supports-color "^2.0.0" 43 | 44 | commander@2.9.0: 45 | version "2.9.0" 46 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 47 | dependencies: 48 | graceful-readlink ">= 1.0.0" 49 | 50 | concat-map@0.0.1: 51 | version "0.0.1" 52 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 53 | 54 | debug@2.2.0: 55 | version "2.2.0" 56 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 57 | dependencies: 58 | ms "0.7.1" 59 | 60 | debug@2.6.9: 61 | version "2.6.9" 62 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 63 | dependencies: 64 | ms "2.0.0" 65 | 66 | depd@~1.1.2: 67 | version "1.1.2" 68 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 69 | 70 | diff@1.4.0: 71 | version "1.4.0" 72 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 73 | 74 | ee-first@1.1.1: 75 | version "1.1.1" 76 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 77 | 78 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: 79 | version "1.0.5" 80 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 81 | 82 | fs.realpath@^1.0.0: 83 | version "1.0.0" 84 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 85 | 86 | glob@7.0.5: 87 | version "7.0.5" 88 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 89 | dependencies: 90 | fs.realpath "^1.0.0" 91 | inflight "^1.0.4" 92 | inherits "2" 93 | minimatch "^3.0.2" 94 | once "^1.3.0" 95 | path-is-absolute "^1.0.0" 96 | 97 | "graceful-readlink@>= 1.0.0": 98 | version "1.0.1" 99 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 100 | 101 | growl@1.9.2: 102 | version "1.9.2" 103 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 104 | 105 | has-ansi@^2.0.0: 106 | version "2.0.0" 107 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 108 | dependencies: 109 | ansi-regex "^2.0.0" 110 | 111 | has-flag@^1.0.0: 112 | version "1.0.0" 113 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 114 | 115 | inflight@^1.0.4: 116 | version "1.0.6" 117 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 118 | dependencies: 119 | once "^1.3.0" 120 | wrappy "1" 121 | 122 | inherits@2: 123 | version "2.0.3" 124 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 125 | 126 | json3@3.3.2: 127 | version "3.3.2" 128 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 129 | 130 | lodash._baseassign@^3.0.0: 131 | version "3.2.0" 132 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 133 | dependencies: 134 | lodash._basecopy "^3.0.0" 135 | lodash.keys "^3.0.0" 136 | 137 | lodash._basecopy@^3.0.0: 138 | version "3.0.1" 139 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 140 | 141 | lodash._basecreate@^3.0.0: 142 | version "3.0.3" 143 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 144 | 145 | lodash._getnative@^3.0.0: 146 | version "3.9.1" 147 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 148 | 149 | lodash._isiterateecall@^3.0.0: 150 | version "3.0.9" 151 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 152 | 153 | lodash.create@3.1.1: 154 | version "3.1.1" 155 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 156 | dependencies: 157 | lodash._baseassign "^3.0.0" 158 | lodash._basecreate "^3.0.0" 159 | lodash._isiterateecall "^3.0.0" 160 | 161 | lodash.isarguments@^3.0.0: 162 | version "3.1.0" 163 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 164 | 165 | lodash.isarray@^3.0.0: 166 | version "3.0.4" 167 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 168 | 169 | lodash.keys@^3.0.0: 170 | version "3.1.2" 171 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 172 | dependencies: 173 | lodash._getnative "^3.0.0" 174 | lodash.isarguments "^3.0.0" 175 | lodash.isarray "^3.0.0" 176 | 177 | minimatch@^3.0.2: 178 | version "3.0.3" 179 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 180 | dependencies: 181 | brace-expansion "^1.0.0" 182 | 183 | minimist@0.0.8: 184 | version "0.0.8" 185 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 186 | 187 | mkdirp@0.5.1: 188 | version "0.5.1" 189 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 190 | dependencies: 191 | minimist "0.0.8" 192 | 193 | mocha@^3.2.0: 194 | version "3.2.0" 195 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" 196 | dependencies: 197 | browser-stdout "1.3.0" 198 | commander "2.9.0" 199 | debug "2.2.0" 200 | diff "1.4.0" 201 | escape-string-regexp "1.0.5" 202 | glob "7.0.5" 203 | growl "1.9.2" 204 | json3 "3.3.2" 205 | lodash.create "3.1.1" 206 | mkdirp "0.5.1" 207 | supports-color "3.1.2" 208 | 209 | morgan@^1.9.1: 210 | version "1.9.1" 211 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" 212 | dependencies: 213 | basic-auth "~2.0.0" 214 | debug "2.6.9" 215 | depd "~1.1.2" 216 | on-finished "~2.3.0" 217 | on-headers "~1.0.1" 218 | 219 | ms@0.7.1: 220 | version "0.7.1" 221 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 222 | 223 | ms@2.0.0: 224 | version "2.0.0" 225 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 226 | 227 | on-finished@~2.3.0: 228 | version "2.3.0" 229 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 230 | dependencies: 231 | ee-first "1.1.1" 232 | 233 | on-headers@~1.0.1: 234 | version "1.0.1" 235 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 236 | 237 | once@^1.3.0: 238 | version "1.4.0" 239 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 240 | dependencies: 241 | wrappy "1" 242 | 243 | path-is-absolute@^1.0.0: 244 | version "1.0.1" 245 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 246 | 247 | safe-buffer@5.1.2: 248 | version "5.1.2" 249 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 250 | 251 | should-equal@^1.0.0: 252 | version "1.0.1" 253 | resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-1.0.1.tgz#0b6e9516f2601a9fb0bb2dcc369afa1c7e200af7" 254 | dependencies: 255 | should-type "^1.0.0" 256 | 257 | should-format@^3.0.2: 258 | version "3.0.3" 259 | resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" 260 | dependencies: 261 | should-type "^1.3.0" 262 | should-type-adaptors "^1.0.1" 263 | 264 | should-type-adaptors@^1.0.1: 265 | version "1.0.1" 266 | resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz#efe5553cdf68cff66e5c5f51b712dc351c77beaa" 267 | dependencies: 268 | should-type "^1.3.0" 269 | should-util "^1.0.0" 270 | 271 | should-type@^1.0.0, should-type@^1.3.0, should-type@^1.4.0: 272 | version "1.4.0" 273 | resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" 274 | 275 | should-util@^1.0.0: 276 | version "1.0.0" 277 | resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.0.tgz#c98cda374aa6b190df8ba87c9889c2b4db620063" 278 | 279 | should@^11.2.1: 280 | version "11.2.1" 281 | resolved "https://registry.yarnpkg.com/should/-/should-11.2.1.tgz#90f55145552d01cfc200666e4e818a1c9670eda2" 282 | dependencies: 283 | should-equal "^1.0.0" 284 | should-format "^3.0.2" 285 | should-type "^1.4.0" 286 | should-type-adaptors "^1.0.1" 287 | should-util "^1.0.0" 288 | 289 | strip-ansi@^3.0.0: 290 | version "3.0.1" 291 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 292 | dependencies: 293 | ansi-regex "^2.0.0" 294 | 295 | supports-color@3.1.2: 296 | version "3.1.2" 297 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 298 | dependencies: 299 | has-flag "^1.0.0" 300 | 301 | supports-color@^2.0.0: 302 | version "2.0.0" 303 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 304 | 305 | wrappy@1: 306 | version "1.0.2" 307 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 308 | --------------------------------------------------------------------------------