text: var staticModule = require('static-module');
  var quote = require('quote-stream');
  var through = require('through2');
  var fs = require('fs');
  var path = require('path');
  var resolve = require('resolve');
  
  module.exports = function (file, opts) {
      if (/\.json$/.test(file)) return through();
      
      function resolver (p) {
          return resolve.sync(p, { basedir: path.dirname(file) });
      }
      var vars = {
          __filename: file,
          __dirname: path.dirname(file),
          require: { resolve: resolver }
      };
      if (!opts) opts = {};
      if (opts.vars) Object.keys(opts.vars).forEach(function (key) {
          vars[key] = opts.vars[key];
      });
      
      var sm = staticModule(
          {
              fs: {
                  readFileSync: readFileSync,
                  readFile: readFile,
                  readdirSync: readdirSync,
                  readdir: readdir
              }
          },
          {
              vars: vars,
              varModules: { path: path },
              parserOpts: opts && opts.parserOpts,
              sourceMap: opts && (opts.sourceMap || opts._flags && opts._flags.debug),
              inputFilename: file
          }
      );
      return sm;
      
      function readFile (file, enc, cb) {
          if (typeof enc === 'function') {
              cb = enc;
              enc = null;
          }
          if (enc && typeof enc === 'object' && enc.encoding) {
              enc = enc.encoding;
          }
          var isBuffer = false;
          if (enc === null || enc === undefined) {
              isBuffer = true;
              enc = 'base64';
          }
          
          var stream = through(write, end);
          stream.push('process.nextTick(function(){(' + cb + ')(null,');
          if (isBuffer) stream.push('Buffer(');
          
          var s = fs.createReadStream(file, { encoding: enc });
          s.on('error', function (err) { sm.emit('error', err) });
          return s.pipe(quote()).pipe(stream);
          
          function write (buf, enc, next) {
              this.push(buf);
              next();
          }
          function end (next) {
              if (isBuffer) this.push(',"base64")');
              this.push(')})');
              this.push(null);
              sm.emit('file', file);
              next()
          }
      }
      
      function readFileSync (file, enc) {
          var isBuffer = false;
          if (enc === null || enc === undefined) {
              isBuffer = true;
              enc = 'base64';
          }
          if (enc && typeof enc === 'object' && enc.encoding) {
              enc = enc.encoding;
          }
          var stream = fs.createReadStream(file,  { encoding: enc })
              .on('error', function (err) { sm.emit('error', err) })
              .pipe(quote()).pipe(through(write, end))
          ;
          if (isBuffer) {
              stream.push('Buffer(');
          }
          return stream;
          
          function write (buf, enc, next) {
              this.push(buf);
              next();
          }
          function end (next) {
              if (isBuffer) this.push(',"base64")');
              this.push(null);
              sm.emit('file', file);
              next();
          }
      }
      
      function readdir(path, cb) {
          var stream = through(write, end);
  
          stream.push('process.nextTick(function(){(' + cb + ')(null,');
          fs.readdir(path, function (err, src) {
              if (err) {
                  stream.emit('error', err);
                  return;
              }
              stream.push(JSON.stringify(src));
              stream.end(')})');
          });
          return stream;
  
          function write (buf, enc, next) {
              this.push(buf);
              next();
          }
          function end (next) {
              this.push(null);
              next();
          }
      }
  
      function readdirSync (path) {
          var stream = through(write, end);
          fs.readdir(path, function (err, src) {
              if (err) {
                  stream.emit('error', err);
                  return;
              }
              stream.end(JSON.stringify(src));
          });
          return stream;
  
          function write (buf, enc, next) {
              this.push(buf);
              next();
          }
          function end (next) {
              this.push(null);
              next();
          }
      }
  };
  