indexzero
12/9/2011 - 12:08 PM

README.md

{
  "name" : "colors-explodes",
  "version" : "0.0.0",
  "description" : "color@0.6.0 + `npm link` === explode",
  "bin": {
    "explode": "./colors-explodes.js"
  },
  "dependencies" : {
    "colors" : "*"
  },
  "license" : "MIT",
  "engine" : {
    "node" : ">=0.4"
  }
}
mkdir colors-explodes
cd colors-explodes

#
# 1. Copy the package.json and colors-explodes.js 
# in this gist
#
$ npm install
colors@0.6.0 ./node_modules/colors 

#
# 2. Make a local copy of winston and link it
#
$ mkdir local
$ cd local
$ git clone https://github.com/flatiron/winston.git
$ cd winston
$ npm link
$ cd ../../
$ npm link winston
$ ./node_modules/winston -> /.local/lib/node_modules/winston -> /colors-explode/local/winston

#
# 3. Run colors-explodes.js and watch it explode
#
$ node colors-explodes.js 

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: underline already exists on String.prototype, cannot override.
    at /colors-explode/local/winston/node_modules/colors/colors.js:50:11
    at /colors-explode/local/winston/node_modules/colors/colors.js:68:3
    at Array.forEach (native)
    at Object.<anonymous> (/colors-explode/local/winston/node_modules/colors/colors.js:63:3)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at require (module.js:355:19)
    at Object.<anonymous> (/colors-explode/local/winston/lib/winston/config.js:9:14)
require('colors');
require('winston');

If two versions of colors exist on disk then this will always throw. This is extremely common in development scenarios with npm link but also if two packages depended on by a third both depend on colors but the parent does not.

  parent-app
  `--- pkg-a
  |   `---colors
  `--- pkg-b
     `---colors