deviant

Override node's builtin require to use browserify transform streams directly in node

deviant

Deviant breaks the rules a bit and overrides node's builtin require behavior to allow you to use browserify's transform streams directly in node.

This is handy for a few reasons, for example using installify to automatically install missing dependencies, es6ify to get a bunch of ES6 features without needing to use the --harmony flag, or sweetify to get hygenic macros from sweet.js.

You can find a list of browserify transforms here.

The easiest way to get started is from the command-line, using the -t argument as you would with browserify to add transforms:

# Install the command-line tool globally
$ npm install -g deviant
# Followed by your source transform modules:
$ npm install coffeeify installify
# Then you're good to go:
$ deviant -t coffeeify -t installify ./index.coffee

If you prefer to load deviant directly, you just have to run the following code before making any other calls to require:

// Specify the transforms you want to use 
// here, if any 
require('deviant')([
    'es6ify'
  , 'sweetify'
  , 'installify'
])
 
// Now you can make require calls 
// as usual, but with transforms 
// enabled 
require('./app')

Using the execSync module, we can fork out to a separate process to get the results of a transform synchronously. It's pretty hacky, but I believe the functionality is coming to node 0.12.x.

Launching a new process is expensive – especially when it's pulling in a lot of dependencies – so a TCP server is created and kept alive, with execSync being used to spawn light processes which just pipe the data onto the server while still blocking the main loop. The server has to be run in a separate process, because otherwise execSync will block it and prevent the response from ever being recieved.

Overriding require is done by replacing Module.prototype._compile, e.g:

// This will read in all of your dependencies 
// uppercased, and probably breaking them in 
// the process: 
var Module = require('module')
var _compile = Module.prototype._compile
 
Module.prototype._compile = function(contentfilename) {
  content = content.toUpperCase()
  return _compile.call(this, content, filename)
}

MIT. See LICENSE.md for details.