Exemplo n.º 1
0
module.exports = function () {
  'use strict';
  var program = require('commander');

  program
    .version('0.3.5')
    .usage('[options] <value ...>')
    .option('-c, --cgi [path]', 'set mockup cgi data path')
    .option('-M, --MD5', 'enable MD5 replace mode')
    .option('-C, --CDN [path]', 'set CDN path')
    .option('-l, --local [path]', 'set local path')
    .option('-r, --record [path]', 'enable cgi recording')
    .option('-p, --path [path]', 'site path')
    .option('-e, --experiment', 'enable experiment feature')
    .parse(process.argv);

  var connect = require('connect')
    , httpProxy = require('http-proxy')
    , proxy = httpProxy.createProxyServer()
    , qs = require('qs')
    , bodyParser = require('body-parser')
    , serveStatic = require('serve-static')
    , fs = require('fs')
    , zlib = require('zlib')
    , path = require('path')
    , mkdirp = require('mkdirp')
    , URL = require('url')
    , Log = require('log')
    , debug = require('debug')
    , log = new Log('debug', fs.createWriteStream('badjs.log'))
    , send = require('send')
    , pipeMiddle = require('middleware-pipe')
    , replace = require('gulp-replace')
    , velocity = require('gulp-velocity')
    , logMap = {
      '2': ['info','green'],
      '4': ['warning','magenta'],
      '8': ['error','red']
    };

  debug.enable('badjs');

  var badjs = debug('badjs');


  var color = (function(){

    var color_16_base = {
        'black': 30,
        'red': 31,
        'green': 32,
        'yellow': 33,
        'blue': 34,
        'magenta': 35,
        'cyan': 36,
        'white': 37
    };

    var styles = {};

    for(var color in color_16_base){

        var code = color_16_base[color];

        styles[color+'_BASIC'] = '\u001b['+code+'m';
        styles[color+'_BG'] = '\u001b['+(code+60)+';3m';
        styles[color] = '\u001b['+(code+60)+'m';
        styles[color+'_UL'] = '\u001b['+(code+60)+';4m';
    }

    var ex = {};

    for(var key in styles){

        (function(p){
            ex[p] = function(text){
                return styles[p] + text + '\u001b[0m';
            }
        })(key);

    }

    return ex;

  })();

  function getQuery(req) {
    return ~req.url.indexOf('?') ?
      qs.parse(URL.parse(req.url).query) : {};
  }

  var app = connect()
              .use('/cgi-bin-dev/badjs_mock', function (req, res, next) {
                var query = getQuery(req);
                log[logMap[query.level][0]](query.msg);
                var msg = query.msg.split('|_|');
                badjs(logMap[query.level][0], color[logMap[query.level][1]](msg[0]) , msg[1]||'', msg[2]||'', msg[3]||'');
                res.writeHead(204, {'Content-Type': 'image/png'});
                res.statusCode = 204;
                res.end('');
              })
              .use('/cgi-bin-dev', bodyParser.json())
              .use('/cgi-bin-dev', bodyParser.urlencoded())
              .use('/cgi-bin-dev', function (req, res, next) {
                var url = req.url.replace(/\?.*$/, '')
                  , cgiPaths = program.cgi ?
                    program.cgi.split('|') :
                    [path.join(__dirname, '/mockup/cgi-bin')]
                  , ps = []
                  , isNext = true;

                cgiPaths.forEach(function (cgiPath) {
                  ps.push(path.join(cgiPath, url));
                });

                ps.every(function (p, i) {
                  if (fs.existsSync(p + '.js')) {
                    isNext = false;
                    p = p + '.js';

                    var script = fs.readFileSync(p).toString()
                      , foo
                      , mod = {
                        exports: {}
                      }
                      , query = URL.parse(req.url, true).query;

                    for (var i in query) {
                      req.body[i] = query[i];
                    }

                    foo = new Function('module', 'exports', script);
                    foo(mod);

                    res.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});
                    res.statusCode = 200;
                    res.end(JSON.stringify(mod.exports(req.body)));
                    return false;
                  } else if (fs.existsSync(p + '.json')) {
                    isNext = false;
                    p = p + '.json';

                    res.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});
                    res.statusCode = 200;
                    res.end(fs.readFileSync(p));
                    return false;
                  } else if (fs.existsSync(p + '.html')) {
                    isNext = false;
                    p = p + '.html';
                    res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
                    res.statusCode = 200;
                    res.end(fs.readFileSync(p));
                  }
                  return true;
                });

                isNext && next();
              });

  // enable middleware-pipe
  if (program.experiment) {
    app.use(program.path ? '/' + program.path : '/', pipeMiddle('./src', /\.html$/)
        .pipe(function (req) {
          return replace(/\<inline.*?src\=('|")(.*?)\1.*?\/?\>/, function (all, quz, src) {
            var file = path.resolve(path.dirname(path.join('./src', req.url)), src);
            return fs.readFileSync(file);
          });
        }))
      .use('/cgi-bin-dev', pipeMiddle('./src/vm', /\//, function (url) {
        var index = url.indexOf('?');
        if (~index) {
          return url.substring(0, index) + '.vm'
        } else {
          return url + '.vm';
        }
      }).pipe(function (req) {
        return velocity({
          root: './src/vm/',
          encoding: 'utf-8',
          dataPath: './',
          globalMacroPath: './src/vm/'
        });
      }));
  }

  if (program.MD5) {
    app.use('/' + program.CDN, function (req, res, next) {
      var file = path.join(__dirname, program.local || '/dev', req.url)
        , dirname = path.dirname(file)
        , basename = path.basename(file);

      if (!fs.existsSync(file)) {
        var nBasename = basename.split('.');
        nBasename[nBasename.length - 2] = '.*?';
        var dirs = fs.readdirSync(dirname)
          , reg = new RegExp(nBasename.join('\\.'));
        dirs.forEach(function (dir) {
          if (reg.test(dir)) {
            req.url = req.url.replace(basename, dir);
          }
        });
      }

      function error(err) {
        if (err.status === 404) return next();
        next(err);
      }

      send(req, URL.parse(req.url).pathname, { root: path.join(__dirname, program.local || '/dev') })
        .on('error', error)
        .pipe(res);
    });
  }

  var lpath = path.join(__dirname, program.local || '/dev');
  var rpaths = [];

  if (program.path) {
    console.log('path:'+path.join('', program.path));
    rpaths.push(  ('/' +program.path).replace(/\/+/g, '/')  );
  } else {
    rpaths.push('/');
  }

  if (program.CDN) {
    console.info('cdn:'+program.CDN);
    rpaths.push(  ('/' +program.CDN).replace(/\/+/g, '/')  );
  }

  rpaths.forEach(function(rpath){
    app.use(rpath, serveStatic(lpath));
  });

  var CGI_REG = /^\/cgi-bin/
    , RECORD_PATH = program.record === true ?
      '/mockup/record' + +new Date :
      !!program.record && path.join(__dirname, '/mockup/record' + +new Date);

  var configPath;

  if (RECORD_PATH) {
    configPath = path.join(__dirname, '/.mockupconfig');
    fs.readFile(configPath, function (err, data) {
      if (err && err.code === 'ENOENT')
        return writeConfig({
          cgi: RECORD_PATH
        });

      data = JSON.parse(data);
      data.cgi = RECORD_PATH;
      return writeConfig(data);
    });
  }

  function writeConfig(data) {
    fs.writeFile(configPath, JSON.stringify(data));
  }

  function writeCgi(buffer, url, isJSON) {
    url = url.replace(CGI_REG, '');
    var file = path.join(RECORD_PATH, url)
      , fileDir = path.dirname(file)
      , fileName = encodeURIComponent(path.basename(file)) + (isJSON ? '.json' : '.vm.html')
      , string = buffer.toString();
    file = path.join(fileDir, fileName);
    isJSON &&
      (string = JSON.stringify(JSON.parse(string), null, '    '));
    fs.writeFile(file, string, function (e) {
      if (e && e.code === 'ENOENT')
        return mkdirp(fileDir, '0777', function (e) {
          if (e) return;
          fs.writeFile(file, string);
        });
    });
  }

  app
    .use(function (req, res, next) {
      req.headers.host = req.headers.host.replace(/^dev\./, '');
      req.url === '/' && (req.url = '/index.html');
      if (program.record && CGI_REG.test(req.url)) {
        var buffers = [], isGzip;
        res.on('pipe', function (proxyReq) {
          proxyReq.on('data', function (buffer) {
            buffers.push(buffer);
            res.write(buffer);
          });
          isGzip = proxyReq.headers['content-encoding'] === 'gzip';
          res.on('finish', function () {
            var buffer = Buffer.concat(buffers);
            isGzip ?
              zlib.gunzip(Buffer.concat(buffers), function (err, buffer) {
                if (err) return;
                writeCgi(buffer, req.url, ~proxyReq.headers['content-type'].indexOf('application/json'));
              }) :
              writeCgi(buffer, req.url, ~proxyReq.headers['content-type'].indexOf('application/json'));
          });
        });
      }
      proxy.web(req, res, {
        target: 'http://' + req.headers.host
      }, function (e) {
        console.log(e);
        next(e);
      });
    })
    .listen(80);

}();
Exemplo n.º 2
0
Arquivo: app.js Projeto: imweb/Ques
var app = connect();

config.addon &&
  config.addon.forEach(function (addon) {
    addon = require('./addon/' + addon);
    addon.init ?
      addon.init(app) :
      addon.router ?
        app.use(addon.router, addon.middleware) :
        app.use(addon);
  });

app.use(
    '/lib',
    middlePipe(src + '/lib', /(\.js)$/)
      .pipe(ques.js())
  )
  .use(
    '/lib',
    middlePipe(src + '/lib')
  )
  .use(
    '/components',
    middlePipe(src + '/components', /(\.html\.js)$/, function (url) {
      return url.replace(/\.js$/, '');
    }).pipe(ques.tpl())
  )
  .use(
    '/components',
    middlePipe(src + '/components', /\.js$/, function (p) {
Exemplo n.º 3
0
var connect = require('connect')
  , replace = require('gulp-replace')
  , less = require('gulp-less')
  , pipeMiddle = require('middleware-pipe')
  , fs = require('fs')
  , path = require('path');

connect()
  // match html
  .use(
    pipeMiddle(path.join(__dirname, 'src'), /\.html$/)
      .pipe(replace(/\<inline src\=\"\.\/inline\/hello.html\" \/>/, function (all, quz, src) {
          return fs.readFileSync(path.join(__dirname, 'src/inline/hello.html'), 'utf-8');
      }))
  )
  // match css
  .use('/css', 
    pipeMiddle(path.join(__dirname, 'src/css'), /\.css$/, function (url) {
      // fixed the actual path
      return url.replace(/\.css$/, '.less');
    }).pipe(
      less({
        paths: [path.join(__dirname, 'src/css')]
      })
    )
  )
  .listen(3000);
Exemplo n.º 4
0
.use('/sub', function (req, res) {
    db.subscribe(roomid, function (data) {
        res.end(JSON.stringify(data));
    });
}).use('/init', function (req, res) {
    if (db.has(roomid)) {
        res.end(db.get(roomid).stringify());
    } else {
        res.end('{}');
    }
}).use('/upload', multipart())
.use('/upload', function (req, res) {
    var files = req.files, ids = [];
    Object.keys(req.files).forEach(function (key) {
        var file = files[key].jpg || files[key].jpeg,
            id = uid(10);
        // fs.renameSync(file.path, './files/' + id + '.jpg');
        fs.writeFileSync('./files/' + id + '.jpg', fs.readFileSync(file.path));
        ids.push({ id: id });
        // get Room & add a image
        db.get(roomid).add(id);
    });
    res.end(JSON.stringify(ids));
}).use(
    '/files', 
    middlePipe('./files')
).use(
    middlePipe('./app')
).listen(80, function () {
    console.log('demo start up');
});