提交 d8fe89e5d3b5b8e76f445c7134ed1d6b7df317ac

作者 fanwh
0 个父辈

init

  1 +node_modules/
  1 +{
  2 + // 使用 IntelliSense 了解相关属性。
  3 + // 悬停以查看现有属性的描述。
  4 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  5 + "version": "0.2.0",
  6 + "configurations": [
  7 + {
  8 + "type": "node",
  9 + "request": "launch",
  10 + "name": "hro-v2-service",
  11 + "program": "${workspaceFolder}/app.js"
  12 + }
  13 + ]
  14 +}
  1 +// var express = require('express');
  2 +// var path = require('path');
  3 +// var favicon = require('serve-favicon');
  4 +// var logger = require('morgan');
  5 +// var cookieParser = require('cookie-parser');
  6 +// var bodyParser = require('body-parser');
  7 +
  8 +// var routes = require('./routes/index');
  9 +// var users = require('./routes/users');
  10 +
  11 +// var app = express();
  12 +
  13 +// // view engine setup
  14 +// app.set('views', path.join(__dirname, 'views'));
  15 +// app.set('view engine', 'ejs');
  16 +
  17 +// // uncomment after placing your favicon in /public
  18 +// //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  19 +// app.use(logger('dev'));
  20 +// app.use(bodyParser.json());
  21 +// app.use(bodyParser.urlencoded({ extended: false }));
  22 +// app.use(cookieParser());
  23 +// app.use(express.static(path.join(__dirname, 'public')));
  24 +
  25 +// app.use('/', routes);
  26 +// app.use('/users', users);
  27 +
  28 +// // catch 404 and forward to error handler
  29 +// app.use(function(req, res, next) {
  30 +// var err = new Error('Not Found');
  31 +// err.status = 404;
  32 +// next(err);
  33 +// });
  34 +
  35 +// // error handlers
  36 +
  37 +// // development error handler
  38 +// // will print stacktrace
  39 +// if (app.get('env') === 'development') {
  40 +// app.use(function(err, req, res, next) {
  41 +// res.status(err.status || 500);
  42 +// res.render('error', {
  43 +// message: err.message,
  44 +// error: err
  45 +// });
  46 +// });
  47 +// }
  48 +
  49 +// // production error handler
  50 +// // no stacktraces leaked to user
  51 +// app.use(function(err, req, res, next) {
  52 +// res.status(err.status || 500);
  53 +// res.render('error', {
  54 +// message: err.message,
  55 +// error: {}
  56 +// });
  57 +// });
  58 +var path = require('path');
  59 +var IoC = require('electrolyte');
  60 +var bootable = require('./bootable');
  61 +var http = require('http');
  62 +var express = require('express');
  63 +
  64 +process.chdir(__dirname);
  65 +
  66 +
  67 +//依赖注入
  68 +IoC.use(IoC.dir(path.join(__dirname, 'boot')));
  69 +IoC.use('igloo', require('./igloo'));
  70 +// IoC.use('controllers', IoC.dir(path.join(__dirname, 'controllers')));
  71 +// IoC.use('services', IoC.dir(path.join(__dirname, 'services')));
  72 +// IoC.use('models', IoC.dir(path.join(__dirname, 'models')));
  73 +// IoC.use('utils', IoC.dir(path.join(__dirname, 'utils')));
  74 +// execute initializers
  75 +// IoC.use("settings", IoC.dir(path.join(__dirname, 'igloo', 'boot', 'settings')));
  76 +
  77 +
  78 +var app = bootable(express());
  79 +
  80 +app.phase(bootable.di.initializers());
  81 +app.phase(bootable.di.routes('./routes'));
  82 +
  83 +IoC.create('igloo/server').then(function (server) {
  84 + app.phase(server);
  85 + app.boot(function (err) {
  86 +
  87 + if (err) {
  88 + console.log(err);
  89 + process.exit(-1);
  90 + return;
  91 + }
  92 +
  93 + });
  94 +});
  95 +
  96 +
  97 +module.exports = app;
  1 +#!/usr/bin/env node
  2 +
  3 +/**
  4 + * Module dependencies.
  5 + */
  6 +
  7 +var app = require('../app');
  8 +var debug = require('debug')('hro-v2-service:server');
  9 +var http = require('http');
  10 +
  11 +/**
  12 + * Get port from environment and store in Express.
  13 + */
  14 +
  15 +var port = normalizePort(process.env.PORT || '3000');
  16 +app.set('port', port);
  17 +
  18 +/**
  19 + * Create HTTP server.
  20 + */
  21 +
  22 +var server = http.createServer(app);
  23 +
  24 +/**
  25 + * Listen on provided port, on all network interfaces.
  26 + */
  27 +
  28 +server.listen(port);
  29 +server.on('error', onError);
  30 +server.on('listening', onListening);
  31 +
  32 +/**
  33 + * Normalize a port into a number, string, or false.
  34 + */
  35 +
  36 +function normalizePort(val) {
  37 + var port = parseInt(val, 10);
  38 +
  39 + if (isNaN(port)) {
  40 + // named pipe
  41 + return val;
  42 + }
  43 +
  44 + if (port >= 0) {
  45 + // port number
  46 + return port;
  47 + }
  48 +
  49 + return false;
  50 +}
  51 +
  52 +/**
  53 + * Event listener for HTTP server "error" event.
  54 + */
  55 +
  56 +function onError(error) {
  57 + if (error.syscall !== 'listen') {
  58 + throw error;
  59 + }
  60 +
  61 + var bind = typeof port === 'string'
  62 + ? 'Pipe ' + port
  63 + : 'Port ' + port;
  64 +
  65 + // handle specific listen errors with friendly messages
  66 + switch (error.code) {
  67 + case 'EACCES':
  68 + console.error(bind + ' requires elevated privileges');
  69 + process.exit(1);
  70 + break;
  71 + case 'EADDRINUSE':
  72 + console.error(bind + ' is already in use');
  73 + process.exit(1);
  74 + break;
  75 + default:
  76 + throw error;
  77 + }
  78 +}
  79 +
  80 +/**
  81 + * Event listener for HTTP server "listening" event.
  82 + */
  83 +
  84 +function onListening() {
  85 + var addr = server.address();
  86 + var bind = typeof addr === 'string'
  87 + ? 'pipe ' + addr
  88 + : 'port ' + addr.port;
  89 + debug('Listening on ' + bind);
  90 +}
  1 +// # config
  2 +
  3 +var path = require('path');
  4 +
  5 +
  6 +exports = module.exports = function () {
  7 +
  8 + return {
  9 + defaults: {
  10 + server: {
  11 + env: 'development'
  12 + }
  13 + },
  14 + test: {
  15 + cache: true,
  16 + url: 'http://localhost:5999',
  17 + restful: {
  18 + url: 'http://172.21.0.8:20000/',
  19 + ossUrl: 'http://172.21.0.8:10001/v1/',
  20 + version: '/v1'
  21 + },
  22 + server: {
  23 + host: '0.0.0.0',
  24 + env: 'production',
  25 + port: 5999,
  26 + cluster: false
  27 + },
  28 + redis: {
  29 + prefix: 'igloo_production_test_develop',
  30 + host: '172.21.0.8',
  31 + port: 38888,
  32 + pass: 'Q*Kr4?#Rg!'
  33 + },
  34 + logger: {
  35 + 'console': true,
  36 + requests: true,
  37 + mongo: false,
  38 + file: {
  39 + filename: '/opt/work/hro/frontend/hro-develop/igloo.log',
  40 + timestamp: true
  41 + }
  42 + }
  43 + },
  44 + development: {
  45 + cache: true,
  46 + url: 'http://localhost:3000',
  47 + server: {
  48 + env: 'development',
  49 + port: 3000,
  50 + },
  51 + redis: {
  52 + prefix: 'igloo-development',
  53 + host: '127.0.0.1',
  54 + port: 6379,
  55 + pass: '',
  56 + }
  57 + },
  58 + production: {
  59 + cache: false,
  60 + url: 'http://localhost:6868',
  61 + restful: {
  62 + url: 'http://192.168.2.72:20000/',
  63 + ossUrl: 'http://192.168.2.72:20000/',
  64 + version: '/v1'
  65 + },
  66 + server: {
  67 + host: '0.0.0.0',
  68 + env: 'production',
  69 + port: 6868,
  70 + cluster: false
  71 + }
  72 + }
  73 + };
  74 +};
  75 +
  76 +exports['@singleton'] = true;
  1 +var path = require('path');
  2 +var serviceDir = path.join(__dirname, '..');
  3 +exports = module.exports = function () {
  4 + return {
  5 + server: {
  6 + host: '0.0.0.0',
  7 + port: 3000,
  8 + env: 'development',
  9 + dir: path.join(serviceDir, 'public'),
  10 + engine: 'ejs',
  11 + publicPath: '/',
  12 + staticServerPath: path.join(serviceDir, 'public'),
  13 + cluster: false,
  14 + ssl: {
  15 + enabled: false,
  16 + options: {}
  17 + },
  18 + staticServer: {
  19 + maxAge: 24 * 60 * 60 * 1000
  20 + }
  21 + },
  22 + logger: {
  23 + console: true
  24 + },
  25 + output: {
  26 +
  27 + }
  28 + };
  29 +};
  30 +
  31 +exports['@singleton'] = true;
  1 +
  2 +/**
  3 + * Export phases.
  4 + */
  5 +exports.initializers = require('./initializers');
  6 +exports.routes = require('./routes');
  1 +
  2 +/**
  3 + * Module dependencies.
  4 + */
  5 +var path = require('path')
  6 + , fs = require('fs')
  7 + , existsSync = fs.existsSync || path.existsSync // node <=0.6
  8 + , debug = require('debug')('bootable-di');
  9 +var IoC = require('electrolyte');
  10 +var async = require('asyncawait/async');
  11 +var await = require('asyncawait/await');
  12 +
  13 +
  14 +/**
  15 + * Initializer execution phase.
  16 + *
  17 + * This phase will execute all initializer scripts in a directory, allowing the
  18 + * application to initialize modules, including connecting to databases and
  19 + * other network services. Any annotated dependencies (using `exports['@require']`)
  20 + * will be injected into the function when invoked.
  21 + *
  22 + * Examples:
  23 + *
  24 + * app.phase(bootabledi.initializers());
  25 + *
  26 + * app.phase(bootabledi.initializers('config/initializers'));
  27 + *
  28 + * @param {String|Object} options
  29 + * @return {Function}
  30 + * @api public
  31 + */
  32 +module.exports = function (options, container) {
  33 + if (!container) {
  34 + try {
  35 + container = require('electrolyte');
  36 + } catch (_) {
  37 + // workaround when `npm link`'ed for development
  38 + var prequire = require('../utils/parent-require');
  39 + container = prequire('electrolyte');
  40 + }
  41 + }
  42 +
  43 + if ('string' == typeof options) {
  44 + options = { dirname: options };
  45 + }
  46 + options = options || {};
  47 + var dirname = options.dirname || 'etc/init'
  48 + , extensions = options.extensions || Object.keys(require.extensions).map(function (ext) { return ext; })
  49 + , exts = extensions.map(function (ext) {
  50 + if ('.' != ext[0]) { return ext; }
  51 + return ext.slice(1);
  52 + })
  53 + , regex = new RegExp('\\.(' + exts.join('|') + ')$');
  54 +
  55 + return function initializers(done) {
  56 + var dir = path.resolve(dirname);
  57 + if (!existsSync(dir)) { return done(); }
  58 + var self = this
  59 + , files = fs.readdirSync(dir).sort()
  60 + , idx = 0;
  61 + function next(err) {
  62 + if (err) { return done(err); }
  63 +
  64 + var file = files[idx++];
  65 + // all done
  66 + if (!file) { return done(); }
  67 +
  68 + if (regex.test(file)) {
  69 + try {
  70 + debug('initializer %s', file);
  71 + var mod = require(path.join(dir, file))
  72 + , deps = mod['@require'] || []
  73 + , args = [];
  74 + var loadDeps = async(function () {
  75 + for (var i = 0, len = deps.length; i < len; ++i) {
  76 + var inst = await(IoC.create(deps[i]));
  77 + args.push(inst);
  78 + }
  79 + });
  80 + loadDeps().then(function () {//异步加载依赖
  81 + if (typeof mod == 'function') {
  82 + var arity = mod.length;
  83 + if (arity == deps.length + 1) {
  84 + // Async initializer. Exported function will be invoked, with next
  85 + // being called when the initializer finishes.
  86 + args.push(next);
  87 + mod.apply(self, args);
  88 + } else {
  89 + // Sync initializer. Exported function will be invoked, with next
  90 + // being called immediately.
  91 + mod.apply(self, args);
  92 + next();
  93 + }
  94 + } else {
  95 + // Initializer does not export a function. Requiring the initializer
  96 + // is sufficient to invoke it, next immediately.
  97 + next();
  98 + }
  99 + });
  100 + } catch (ex) {
  101 + next(ex);
  102 + }
  103 + } else {
  104 + next();
  105 + }
  106 + }
  107 + next();
  108 + };
  109 +};
  1 +/**
  2 + * Module dependencies.
  3 + */
  4 +var scripts = require('../utils/scripts')
  5 + , path = require('path')
  6 + , fs = require('fs')
  7 + , existsSync = fs.existsSync || path.existsSync // node <=0.6
  8 + , debug = require('debug')('bootable-di');
  9 +var IoC = require('electrolyte');
  10 +var async = require('asyncawait/async');
  11 +var await = require('asyncawait/await');
  12 +
  13 +/**
  14 + * Route drawing phase.
  15 + *
  16 + * This phase will `require` a routes file, and invoke the exported function,
  17 + * allowing the application to draw its routes. Any annotated dependencies
  18 + * (using `exports['@require']`) will be injected into the function when
  19 + * invoked.
  20 + *
  21 + * This phase is typically the last phase before instructing the server to
  22 + * listen. Any initializers should be run prior to drawing routes, ensuring
  23 + * that the application is fully prepared to handle requests.
  24 + *
  25 + * Examples:
  26 + *
  27 + * app.phase(bootabledi.routes('routes.js'));
  28 + *
  29 + * @param {String|Object} options
  30 + * @return {Function}
  31 + * @api public
  32 + */
  33 +module.exports = function (options, container) {
  34 + if (!container) {
  35 + try {
  36 + container = require('electrolyte');
  37 + } catch (_) {
  38 + // workaround when `npm link`'ed for development
  39 + var prequire = require('../utils/parent-require');
  40 + container = prequire('electrolyte');
  41 + }
  42 + }
  43 +
  44 + if ('string' == typeof options) {
  45 + options = { filename: options };
  46 + }
  47 + options = options || {};
  48 + var filename = options.filename || 'routes'
  49 + , extensions = options.extensions;
  50 +
  51 + return function routes(done) {
  52 + var script = scripts.resolve(path.resolve(filename), extensions);
  53 + if (!existsSync(script)) { return; }
  54 +
  55 + var mod = require(script);
  56 + var deps = mod['@require'] || []
  57 + , args = [], self = this;
  58 +
  59 + // for (var i = 0, len = deps.length; i < len; ++i) {
  60 + // debug('create %s', deps[i]);
  61 + // var inst = container.create(deps[i], this);
  62 + // args.push(inst);
  63 + // }
  64 +
  65 + var loadDeps = async(function () {
  66 + for (var i = 0, len = deps.length; i < len; ++i) {
  67 + debug('create %s', deps[i]);
  68 + var inst = await(IoC.create(deps[i]));
  69 + args.push(inst);
  70 + }
  71 + });
  72 + loadDeps().then(function () {//异步加载依赖
  73 + mod.apply(self, args);
  74 + done();
  75 + });
  76 + };
  77 +};
  1 +/**
  2 + * Module dependencies.
  3 + */
  4 +var Initializer = require('./initializer');
  5 +
  6 +
  7 +/**
  8 + * Make `app` bootable.
  9 + *
  10 + * This function makes an application bootable. Booting consists of executing
  11 + * a sequence of phases to initialize the application.
  12 + *
  13 + * Examples:
  14 + *
  15 + * var app = bootable(express());
  16 + * app.phase(bootable.initializers());
  17 + * app.phase(bootable.routes());
  18 + *
  19 + * app.boot(function(err) {
  20 + * if (err) { throw err; }
  21 + * app.listen(3001);
  22 + * });
  23 + *
  24 + * @param {Object} app
  25 + * @returns {Object} app
  26 + * @api public
  27 + */
  28 +exports = module.exports = function (app, phases) {
  29 + phases = [].slice.call(arguments, 1);
  30 + // Mixin initializer.
  31 + app._initializer = new Initializer();
  32 +
  33 + /**
  34 + * Boot application.
  35 + *
  36 + * @param {Function} cb
  37 + * @param {Object} [thisArg]
  38 + * @api public
  39 + */
  40 + app.boot = function (cb, thisArg) {
  41 + this._initializer.run(cb, thisArg || this);
  42 + };
  43 +
  44 + /**
  45 + * Add phase to boot sequence.
  46 + *
  47 + * @param {Function} fn
  48 + * @return {Object} for chaining
  49 + * @api public
  50 + */
  51 + app.phase = function (fn) {
  52 + this._initializer.phase(fn);
  53 + return this;
  54 + };
  55 +
  56 + // Register phases, if any.
  57 + for (var i = 0; i < phases.length; ++i) {
  58 + app.phase(phases[i]);
  59 + }
  60 + return app;
  61 +};
  62 +
  63 +
  64 +/**
  65 + * Export constructors.
  66 + */
  67 +exports.Initializer = Initializer;
  68 +
  69 +/**
  70 + * Export phases.
  71 + */
  72 +exports.initializers = require('./phases/initializers');
  73 +exports.routes = require('./phases/routes');
  74 +
  75 +/**
  76 + * Export dependency injection-capable phases.
  77 + */
  78 +exports.di = require('./bootable-di');
  1 +/**
  2 + * 依赖模块
  3 + */
  4 +var debug = require('debug')('bootable');
  5 +
  6 +
  7 +/**
  8 + * 创建一个初始化实例
  9 + *
  10 + * @constructor
  11 + * @api public
  12 + */
  13 +function Initializer() {
  14 + this._phases = [];
  15 +}
  16 +
  17 +/**
  18 + * 运行所有的启动项
  19 + *
  20 + * 在运行初始化方法时, 所有的启动项将会按照注册顺序执行, 当所有启动项执行完毕
  21 + * 回调用方法才会被执行
  22 + *
  23 + * @param {Function} cb
  24 + * @param {Object} [thisArg]
  25 + * @api public
  26 + */
  27 +Initializer.prototype.run = function (cb, thisArg) {
  28 + var phases = this._phases
  29 + , idx = 0;
  30 +
  31 + function next(err) {
  32 + if (err) { return cb(err); }
  33 +
  34 + var phase = phases[idx++];
  35 + // 所有启动项执行完毕
  36 + if (!phase) { return cb(); }
  37 +
  38 + try {
  39 + if (typeof phase == 'object') {
  40 + debug('%s', phase.constructor ? phase.constructor.name + '#boot' : 'anonymous#boot');
  41 + phase.boot(next);
  42 + } else {
  43 + debug('%s', phase.name || 'anonymous');
  44 + var arity = phase.length;
  45 + if (arity == 1) {
  46 + phase.call(thisArg, next);
  47 + } else {
  48 + phase.call(thisArg);
  49 + next();
  50 + }
  51 + }
  52 + } catch (ex) {
  53 + next(ex);
  54 + }
  55 + }
  56 + next();
  57 +};
  58 +
  59 +/**
  60 + * 注册一个启动项
  61 + *
  62 + * 一个启动项可以是同步也可以是异步的. 同步启动项如下面的片段
  63 + *
  64 + * function myPhase() {
  65 + * // perform initialization
  66 + * }
  67 + *
  68 + * 异步启动项像下面这样定义
  69 + *
  70 + * function myAsyncPhase(done) {
  71 + * // perform initialization
  72 + * done(); // or done(err);
  73 + * }
  74 + *
  75 + * 启动项也可以是一个有boot function的对象,在这样的例子中,对象上的boot function会在启动序列
  76 + * 执行的时候被调用。这种方式通常被应用在持久链接。例如数据库或是消息队列。
  77 + *
  78 + * @param {Function|Object} fn
  79 + * @returns {Initializer} `this`, for a fluent interface.
  80 + * @api public
  81 + */
  82 +Initializer.prototype.phase = function (fn) {
  83 + this._phases.push(fn);
  84 + return this;
  85 +};
  86 +
  87 +
  88 +/**
  89 + * 曝露初始化对象
  90 + */
  91 +module.exports = Initializer;
  1 +/**
  2 + * Module dependencies.
  3 + */
  4 +var path = require('path')
  5 + , fs = require('fs')
  6 + , existsSync = fs.existsSync || path.existsSync // node <=0.6
  7 + , debug = require('debug')('bootable');
  8 +
  9 +
  10 +/**
  11 + * Initializer execution phase.
  12 + *
  13 + * This phase will execute all initializer scripts in a directory, allowing the
  14 + * application to initialize modules, including connecting to databases and
  15 + * other network services.
  16 + *
  17 + * Examples:
  18 + *
  19 + * app.phase(bootable.initializers());
  20 + *
  21 + * app.phase(bootable.initializers('config/initializers'));
  22 + *
  23 + * @param {String|Object} options
  24 + * @return {Function}
  25 + * @api public
  26 + */
  27 +module.exports = function (options) {
  28 + if ('string' == typeof options) {
  29 + options = { dirname: options };
  30 + }
  31 + options = options || {};
  32 + var dirname = options.dirname || 'etc/init'
  33 + , extensions = options.extensions || Object.keys(require.extensions).map(function (ext) { return ext; })
  34 + , exts = extensions.map(function (ext) {
  35 + if ('.' != ext[0]) { return ext; }
  36 + return ext.slice(1);
  37 + })
  38 + , regex = new RegExp('\\.(' + exts.join('|') + ')$');
  39 +
  40 + return function initializers(done) {
  41 + var dir = path.resolve(dirname);
  42 + if (!existsSync(dir)) { return done(); }
  43 +
  44 + var self = this
  45 + , files = fs.readdirSync(dir).sort()
  46 + , idx = 0;
  47 + function next(err) {
  48 + if (err) { return done(err); }
  49 +
  50 + var file = files[idx++];
  51 + // all done
  52 + if (!file) { return done(); }
  53 +
  54 + if (regex.test(file)) {
  55 + try {
  56 + debug('initializer %s', file);
  57 + var mod = require(path.join(dir, file));
  58 + if (typeof mod == 'function') {
  59 + var arity = mod.length;
  60 + if (arity == 1) {
  61 + // Async initializer. Exported function will be invoked, with next
  62 + // being called when the initializer finishes.
  63 + mod.call(self, next);
  64 + } else {
  65 + // Sync initializer. Exported function will be invoked, with next
  66 + // being called immediately.
  67 + mod.call(self);
  68 + next();
  69 + }
  70 + } else {
  71 + // Initializer does not export a function. Requiring the initializer
  72 + // is sufficient to invoke it, next immediately.
  73 + next();
  74 + }
  75 + } catch (ex) {
  76 + next(ex);
  77 + }
  78 + } else {
  79 + next();
  80 + }
  81 + }
  82 + next();
  83 + };
  84 +};
  1 +/**
  2 + * Module dependencies.
  3 + */
  4 +var scripts = require('../utils/scripts')
  5 + , path = require('path')
  6 + , fs = require('fs')
  7 + , existsSync = fs.existsSync || path.existsSync; // node <=0.6
  8 +
  9 +
  10 +/**
  11 + * Route drawing phase.
  12 + *
  13 + * This phase will `require` a routes file, allowing the application to draw its
  14 + * routes.
  15 + *
  16 + * This phase is typically the last phase before instructing the server to
  17 + * listen. Any initializers should be run prior to drawing routes, ensuring
  18 + * that the application is fully prepared to handle requests.
  19 + *
  20 + * Examples:
  21 + *
  22 + * app.phase(bootable.routes('routes.js'));
  23 + *
  24 + * @param {String|Object} options
  25 + * @return {Function}
  26 + * @api public
  27 + */
  28 +module.exports = function (options) {
  29 + if ('string' == typeof options) {
  30 + options = { filename: options };
  31 + }
  32 + options = options || {};
  33 + var filename = options.filename || 'routes'
  34 + , extensions = options.extensions;
  35 +
  36 + return function routes() {
  37 + var script = scripts.resolve(path.resolve(filename), extensions);
  38 +
  39 + if (!existsSync(script)) { return; }
  40 + require(script).call(this);
  41 + };
  42 +};
  1 +module.exports = function (id) {
  2 + var parent = module.parent;
  3 + for (; parent; parent = parent.parent) {
  4 + try {
  5 + return parent.require(id);
  6 + } catch (ex) { }
  7 + }
  8 + throw new Error("Cannot find module '" + id + "' from parent");
  9 +};
  1 +var path = require('path')
  2 + , fs = require('fs')
  3 + , existsSync = fs.existsSync || path.existsSync; // node <=0.6
  4 +
  5 +
  6 +exports.resolve = function (p, exts) {
  7 + if (existsSync(p)) { return p; }
  8 +
  9 + if (!exts) {
  10 + exts = Object.keys(require.extensions).map(function (ext) { return ext; });
  11 + } else if ('string' == typeof exts) {
  12 + exts = [exts];
  13 + }
  14 +
  15 + var ext, f;
  16 + for (var i = 0, len = exts.length; i < len; ++i) {
  17 + ext = exts[i];
  18 + if ('.' != ext[0]) { ext = '.' + ext; }
  19 + f = p + ext;
  20 + if (existsSync(f)) { return f; }
  21 + }
  22 +
  23 + return p + '.js';
  24 +};
  1 +
  2 +// # settings
  3 +
  4 +var compress = require('compression');
  5 +var IoC = require('electrolyte');
  6 +var https = require('https');
  7 +var http = require('http');
  8 +
  9 +exports = module.exports = function (settings) {
  10 + var app = this;
  11 + // 设置环境变量
  12 + app.set('env', settings.server.env);
  13 +
  14 + //设置默认的试图目录
  15 + app.set('views', settings.server.dir);
  16 +
  17 + //设置默认的试图引擎
  18 + app.set('view engine', settings.server.engine);
  19 +
  20 + if (settings.server.env === 'development') {
  21 + //开发模式下视图美化输出
  22 + app.locals.pretty = true;
  23 + }
  24 + if (settings.server.env === 'production') {
  25 + //启动视图缓存
  26 + app.enable('view cache');
  27 + //默认gzip压缩返回数据
  28 + // this overwrites res.write and res.end functions
  29 + app.use(compress());
  30 + }
  31 + if (settings.server.ssl.enabled) {
  32 + this.server = https.createServer(settings.server.ssl.options, this);
  33 + } else {
  34 + this.server = http.createServer(this);
  35 + }
  36 +
  37 +};
  38 +
  39 +exports['@require'] = ['igloo/settings'];
  1 +
  2 +// # middleware
  3 +
  4 +
  5 +
  6 +var path = require('path');
  7 +var IoC = require('electrolyte');
  8 +var serveStatic = require('serve-static');
  9 +var bodyParser = require('body-parser');
  10 +// var winstonRequestLogger = require('winston-request-logger');
  11 +// var responseTime = require('response-time');
  12 +
  13 +
  14 +exports = module.exports = function (logger, settings) {
  15 +
  16 + var app = this;
  17 +
  18 + // static server (always keep this first)
  19 + // <http://goo.gl/j2BEl5>
  20 + app.use(serveStatic(settings.server.staticServerPath, settings.server.staticServer));
  21 +
  22 + // adds X-Response-Time header
  23 + // app.use(responseTime({
  24 + // digits: 5
  25 + // }));
  26 +
  27 + // prepare req.log for error handler
  28 + // app.use(function (req, res, next) {
  29 + // req.log = {
  30 + // response_time: new Date().getTime(),
  31 + // path: req.path,
  32 + // query: req.query,
  33 + // body: req.body,
  34 + // params: req.params
  35 + // };
  36 + // next();
  37 + // });
  38 +
  39 + // winston request logger before everything else
  40 + // but only if it was enabled in settings
  41 + // if (settings.logger.requests) {
  42 + // app.use(winstonRequestLogger.create(logger));
  43 + // }
  44 +
  45 + // parse request bodies
  46 + app.use(
  47 + bodyParser.json({ limit: '10mb' }),
  48 + bodyParser.urlencoded({
  49 + limit: '10mb',
  50 + extended: true
  51 + })
  52 + );
  53 +};
  54 +
  55 +exports['@require'] = ['igloo/logger', 'igloo/settings'];
  1 +
  2 +// # boot - logger
  3 +
  4 +var _ = require('underscore')
  5 +var mergeDefaults = require('../utils/merge-defaults')
  6 +var winston = require('winston')
  7 +
  8 +exports = module.exports = function (settings) {
  9 +
  10 + if (!_.isObject(settings.logger))
  11 + throw new Error('Settings did not have a `logger` object')
  12 +
  13 + if (!_.isObject(settings.output))
  14 + throw new Error('Settings did not have a `output` object')
  15 +
  16 + var transports = []
  17 +
  18 + if (settings.logger['console'])
  19 + transports.push(
  20 + new winston.transports.Console({
  21 + level: 'info',
  22 + timestamp: true,
  23 + colorize: true
  24 + })
  25 + )
  26 +
  27 + if (settings.logger.file)
  28 + transports.push(
  29 + new winston.transports.File(
  30 + mergeDefaults(
  31 + settings.output,
  32 + settings.logger.file
  33 + )
  34 + )
  35 + )
  36 +
  37 + var logger = winston.createLogger({
  38 + format: winston.format.combine(
  39 + winston.format.splat(),
  40 + winston.format.json()
  41 + ),
  42 + transports: transports
  43 + })
  44 +
  45 + // if (settings.server.env === 'development')
  46 + // logger = expandErrors(logger)
  47 +
  48 + return logger
  49 +
  50 + // Extend a winston by making it expand errors when passed in as the
  51 + // second argument (the first argument is the log level).
  52 + // <https://gist.github.com/johndgiese/59bd96360ce411042294>
  53 + // <https://gist.github.com/getvega/6211610>
  54 + function expandErrors(logger) {
  55 + var oldLogFunc = logger.log
  56 + logger.log = function () {
  57 + var args = Array.prototype.slice.call(arguments, 0)
  58 + if (args.length >= 2 && args[1] instanceof Error) {
  59 + args[1] = args[1].stack
  60 + }
  61 + return oldLogFunc.apply(this, args)
  62 + };
  63 + return logger
  64 + }
  65 +
  66 +
  67 +}
  68 +
  69 +exports['@singleton'] = true
  70 +exports['@require'] = ['igloo/settings']
  1 +
  2 +
  3 +// # boot - server
  4 +
  5 +// Inspired by `bixby-server` by Jared Hanson
  6 +
  7 +var cluster = require('cluster')
  8 +var os = require('os')
  9 +var path = require('path')
  10 +
  11 +exports = module.exports = function (logger, settings) {
  12 +
  13 + return function (done) {
  14 +
  15 + if (cluster.isMaster && settings.server.cluster) {
  16 +
  17 + var size = settings.server.cluster.size || os.cpus().length
  18 +
  19 + logger.info('creating cluster with %d workers', size)
  20 +
  21 + for (var i = 0; i < size; i++) {
  22 + logger.info('spawning worker #%d', i + 1)
  23 + cluster.fork()
  24 + }
  25 +
  26 + cluster.on('fork', function (worker) {
  27 + logger.info('worker #%s with pid %d spawned', worker.id, worker.process.pid)
  28 + })
  29 +
  30 + cluster.on('online', function (worker) {
  31 + logger.info('worker #%s with pid %d online', worker.id, worker.process.pid)
  32 + })
  33 +
  34 + cluster.on('listening', function (worker, addr) {
  35 + logger.info('worker #%s with pid %d listening on %s:%d', worker.id, worker.process.pid, addr.address, addr.port)
  36 + })
  37 +
  38 + cluster.on('disconnect', function (worker) {
  39 + logger.info('worker #%s with pid %d disconnected', worker.id, worker.process.pid)
  40 + })
  41 +
  42 + cluster.on('exit', function (worker, code, signal) {
  43 + logger.error('worker #%s with pid %d exited with code/signal', worker.id, worker.process.pid, signal, code)
  44 + if (worker.suicide) return
  45 + logger.info('worker #%s restarting', worker.id)
  46 + cluster.fork()
  47 + })
  48 +
  49 + } else {
  50 +
  51 + this.httpServer = this.server.listen(settings.server.port, settings.server.host, function (err) {
  52 + if (err) { return done(err); }
  53 + var addr = this.address()
  54 + logger.info('app listening on %s:%d', addr.address, addr.port)
  55 + done()
  56 + })
  57 +
  58 + }
  59 +
  60 + }
  61 +
  62 +}
  63 +
  64 +exports['@singleton'] = true
  65 +exports['@require'] = ['igloo/logger', 'igloo/settings']
  1 +
  2 +// # boot - sessions
  3 +
  4 +var session = require('express-session')
  5 +var RedisStore = require('connect-redis')(session)
  6 +
  7 +exports = module.exports = function (logger, settings) {
  8 +
  9 + var connection = new RedisStore(settings.redis)
  10 +
  11 + connection.on('error', function (err) {
  12 + logger.error('redis connection error: %s', err.message || err)
  13 + })
  14 +
  15 + connection.on('connect', function () {
  16 + logger.info('redis connected')
  17 + })
  18 +
  19 + return connection
  20 +
  21 +}
  22 +
  23 +exports['@singleton'] = true
  24 +exports['@require'] = ['igloo/logger', 'igloo/settings']
  1 +
  2 +
  3 +// # boot - settings
  4 +
  5 +var _ = require('underscore')
  6 +var util = require('util')
  7 +var mergeDefaults = require('../utils/merge-defaults')
  8 +var IoC = require('electrolyte');
  9 +exports = module.exports = function (config) {
  10 +
  11 + var settings = {}
  12 +
  13 + var env = process.env.NODE_ENV || 'development'
  14 +
  15 + if (!_.isObject(config[env]))
  16 + throw new Error(util.format('Unknown environment %s', env))
  17 +
  18 + if (env === 'development') {
  19 + try {
  20 + return IoC.create('local').then(function (data) {
  21 + var local = data;
  22 + if (_.isObject(local)) {
  23 + return mergeDefaults(settings, local)
  24 + }
  25 + });
  26 +
  27 + } catch (e) {
  28 + }
  29 + }
  30 +
  31 + mergeDefaults(settings, config[env], config.defaults)
  32 +
  33 + return settings
  34 +
  35 +};
  36 +
  37 +exports['@singleton'] = true;
  38 +exports['@require'] = ['config'];
  1 +
  2 +
  3 +
  4 +// igloo
  5 +// Copyright (c) 2014- Nick Baugh <niftylettuce@gmail.com> (http://niftylettuce.com)
  6 +// MIT Licensed
  7 +
  8 +// Igloo is a lightweight, fast, and minimal framework for rapid development
  9 +
  10 +// * Author: [@niftylettuce](https://twitter.com/#!/niftylettuce)
  11 +// * Source: <https://github.com/niftylettuce/igloo>
  12 +
  13 +// Special thanks to TJ Holowaychuk for being an inspiration,
  14 +// Jared Hanson for introducing me to `electrolyte`,
  15 +// and many others which I'd love to credit...
  16 +
  17 +// # igloo
  18 +
  19 +var path = require('path')
  20 +
  21 +module.exports = function (id) {
  22 + return require(path.join(__dirname, 'boot', id))
  23 +}
  1 +
  2 +var _ = require('lodash');
  3 +
  4 +/**
  5 + * defaultsDeep
  6 + *
  7 + * Implement a deep version of `_.defaults`.
  8 + *
  9 + * This method is hopefully temporary, until lodash has something
  10 + * similar that can be called in a single method. For now, it's
  11 + * worth it to use a temporary module for readability.
  12 + * (i.e. I know what `_.defaults` means offhand- not true for `_.partialRight`)
  13 + */
  14 +
  15 +// In case the end user decided to do `_.defaults = require('merge-defaults')`,
  16 +// before doing anything else, let's make SURE we have a reference to the original
  17 +// `_.defaults()` method definition.
  18 +var origLodashDefaults = _.defaults;
  19 +
  20 +// Corrected: see https://github.com/lodash/lodash/issues/540
  21 +// module.exports = function (/* ... */) {
  22 +
  23 +// if (typeof arguments[0] !== 'object') return origLodashDefaults.apply(_, Array.prototype.slice.call(arguments));
  24 +// else {
  25 +// var result = _mergeDefaults.apply(_, Array.prototype.slice.call(arguments));
  26 +
  27 +// // Ensure that original object is mutated
  28 +// _.merge(arguments[0], result);
  29 +
  30 +// return result;
  31 +// }
  32 +// };
  33 +
  34 +module.exports = _.partialRight(_.merge, function recursiveDefaults( /* ... */) {
  35 +
  36 + // Ensure dates and arrays are not recursively merged
  37 + if (_.isArray(arguments[0]) || _.isDate(arguments[0])) {
  38 + return arguments[0];
  39 + }
  40 + return _.merge(arguments[0], arguments[1], recursiveDefaults);
  41 +});
  42 +
  43 +//origLodashDefaults.apply(_, Array.prototype.slice.call(arguments));
  44 +
  45 +// module.exports = _.partialRight(_.merge, _.defaults);
  46 +
  47 +// module.exports = _.partialRight(_.merge, function deep(a, b) {
  48 +// // Ensure dates and arrays are not recursively merged
  49 +// if (_.isArray(a) || _.isDate(a)) {
  50 +// return a;
  51 +// }
  52 +// else return _.merge(a, b, deep);
  53 +// });
  1 +{
  2 + "name": "hro-v2-service",
  3 + "version": "0.0.0",
  4 + "private": true,
  5 + "scripts": {
  6 + "start": "node --inspect ./app "
  7 + },
  8 + "main": "./lib",
  9 + "dependencies": {
  10 + "asyncawait": "^1.0.8",
  11 + "bluebird": "^3.5.4",
  12 + "body-parser": "^1.19.0",
  13 + "cluster": "^0.7.7",
  14 + "compression": "^1.7.4",
  15 + "connect-redis": "^3.4.1",
  16 + "cookie-parser": "~1.3.5",
  17 + "debug": "^4.1.1",
  18 + "ejs": "~2.3.3",
  19 + "electrolyte": "^0.5.1",
  20 + "express": "~4.13.1",
  21 + "express-session": "^1.16.1",
  22 + "lodash": "^4.17.11",
  23 + "morgan": "~1.6.1",
  24 + "serve-favicon": "~2.3.0",
  25 + "serve-static": "^1.13.2",
  26 + "underscore": "^1.9.1",
  27 + "winston": "^3.2.1"
  28 + }
  29 +}
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +
  4 +<head>
  5 + <meta charset="UTF-8">
  6 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7 + <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8 + <title>Document</title>
  9 +</head>
  10 +
  11 +<body>
  12 + hello word!!!!!
  13 +</body>
  14 +
  15 +</html>
  1 +body {
  2 + padding: 50px;
  3 + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
  4 +}
  5 +
  6 +a {
  7 + color: #00B7FF;
  8 +}
  1 +
  2 +// app - routes
  3 +
  4 +var bootable = require('../bootable');
  5 +var IoC = require('electrolyte');
  6 +
  7 +exports = module.exports = function (settings) {
  8 +
  9 + var app = this;
  10 +
  11 +
  12 +
  13 + //auth
  14 + app.phase(bootable.di.routes('./routes/users.js'));
  15 +
  16 +};
  17 +
  18 +exports['@require'] = ['igloo/settings'];
  1 +var express = require('express');
  2 +var IoC = require('electrolyte');
  3 +
  4 +exports = module.exports = function (settings) {
  5 + var app = this;
  6 + var router = express.Router();
  7 + var controller = {
  8 + get: function () {
  9 +
  10 + }, post: function () {
  11 +
  12 + }, put: function () {
  13 +
  14 + }, patch: function () {
  15 +
  16 + }, head: function () {
  17 +
  18 + }, patch: function () {
  19 +
  20 + }, delete: function () {
  21 +
  22 + }
  23 + };
  24 +
  25 + router.get(
  26 + '/*',
  27 + controller.get
  28 + );
  29 +
  30 + router.post(
  31 + '/*',
  32 + controller.post
  33 + );
  34 +
  35 + router.put(
  36 + '/*',
  37 + controller.put
  38 + );
  39 +
  40 + router.patch(
  41 + '/*',
  42 + controller.patch
  43 + );
  44 +
  45 + router.head(
  46 + '/*',
  47 + controller.head
  48 + );
  49 +
  50 + router.delete(
  51 + '/*',
  52 + controller.delete
  53 + );
  54 +
  55 + app.use('/api', router);
  56 + app.use('/', function (req, res, next) {
  57 + res.render('index', { 'csrfToken': 'xxxx' });
  58 + next();
  59 + });
  60 +};
  61 +
  62 +exports['@singleton'] = true;
  63 +exports['@require'] = ['igloo/settings'];
  1 +<h1><%= message %></h1>
  2 +<h2><%= error.status %></h2>
  3 +<pre><%= error.stack %></pre>
  1 +<!DOCTYPE html>
  2 +<html>
  3 + <head>
  4 + <title><%= title %></title>
  5 + <link rel='stylesheet' href='/stylesheets/style.css' />
  6 + </head>
  7 + <body>
  8 + <h1><%= title %></h1>
  9 + <p>Welcome to <%= title %></p>
  10 + </body>
  11 +</html>
  1 +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
  2 +# yarn lockfile v1
  3 +
  4 +
  5 +accepts@~1.2.12:
  6 + version "1.2.13"
  7 + resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea"
  8 + dependencies:
  9 + mime-types "~2.1.6"
  10 + negotiator "0.5.3"
  11 +
  12 +accepts@~1.3.5:
  13 + version "1.3.6"
  14 + resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.6.tgz#27de8682f0833e966dde5c5d7a63ec8523106e4b"
  15 + dependencies:
  16 + mime-types "~2.1.24"
  17 + negotiator "0.6.1"
  18 +
  19 +array-flatten@1.1.1:
  20 + version "1.1.1"
  21 + resolved "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
  22 +
  23 +asap@~2.0.3:
  24 + version "2.0.6"
  25 + resolved "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
  26 +
  27 +async@^2.6.1:
  28 + version "2.6.2"
  29 + resolved "http://registry.npm.taobao.org/async/download/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
  30 + dependencies:
  31 + lodash "^4.17.11"
  32 +
  33 +asyncawait@^1.0.8:
  34 + version "1.0.8"
  35 + resolved "https://registry.npm.taobao.org/asyncawait/download/asyncawait-1.0.8.tgz#ecd25d68d870ac36cd96338f844e2a4d2efb7242"
  36 + dependencies:
  37 + bluebird "^3.1.1"
  38 + fibers "^2.0.2"
  39 + lodash "^4.17.11"
  40 +
  41 +basic-auth@~1.0.3:
  42 + version "1.0.4"
  43 + resolved "http://registry.npm.taobao.org/basic-auth/download/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290"
  44 +
  45 +bluebird@^3.1.1, bluebird@^3.5.4:
  46 + version "3.5.4"
  47 + resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714"
  48 +
  49 +body-parser@^1.19.0:
  50 + version "1.19.0"
  51 + resolved "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
  52 + dependencies:
  53 + bytes "3.1.0"
  54 + content-type "~1.0.4"
  55 + debug "2.6.9"
  56 + depd "~1.1.2"
  57 + http-errors "1.7.2"
  58 + iconv-lite "0.4.24"
  59 + on-finished "~2.3.0"
  60 + qs "6.7.0"
  61 + raw-body "2.4.0"
  62 + type-is "~1.6.17"
  63 +
  64 +bytes@3.0.0:
  65 + version "3.0.0"
  66 + resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
  67 +
  68 +bytes@3.1.0:
  69 + version "3.1.0"
  70 + resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
  71 +
  72 +canonical-path@0.0.2:
  73 + version "0.0.2"
  74 + resolved "http://registry.npm.taobao.org/canonical-path/download/canonical-path-0.0.2.tgz#e31eb937a8c93ee2a01df1839794721902874574"
  75 +
  76 +cluster@^0.7.7:
  77 + version "0.7.7"
  78 + resolved "http://registry.npm.taobao.org/cluster/download/cluster-0.7.7.tgz#e497e267cc956bd0b0513adb4aa393357d0085ef"
  79 + dependencies:
  80 + log ">= 1.2.0"
  81 + mkdirp ">= 0.0.1"
  82 +
  83 +color-convert@^1.9.1:
  84 + version "1.9.3"
  85 + resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
  86 + dependencies:
  87 + color-name "1.1.3"
  88 +
  89 +color-name@1.1.3:
  90 + version "1.1.3"
  91 + resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
  92 +
  93 +color-name@^1.0.0:
  94 + version "1.1.4"
  95 + resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
  96 +
  97 +color-string@^1.5.2:
  98 + version "1.5.3"
  99 + resolved "http://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
  100 + dependencies:
  101 + color-name "^1.0.0"
  102 + simple-swizzle "^0.2.2"
  103 +
  104 +color@3.0.x:
  105 + version "3.0.0"
  106 + resolved "http://registry.npm.taobao.org/color/download/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a"
  107 + dependencies:
  108 + color-convert "^1.9.1"
  109 + color-string "^1.5.2"
  110 +
  111 +colornames@^1.1.1:
  112 + version "1.1.1"
  113 + resolved "http://registry.npm.taobao.org/colornames/download/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96"
  114 +
  115 +colors@^1.2.1:
  116 + version "1.3.3"
  117 + resolved "http://registry.npm.taobao.org/colors/download/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
  118 +
  119 +colorspace@1.1.x:
  120 + version "1.1.1"
  121 + resolved "http://registry.npm.taobao.org/colorspace/download/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972"
  122 + dependencies:
  123 + color "3.0.x"
  124 + text-hex "1.0.x"
  125 +
  126 +compressible@~2.0.16:
  127 + version "2.0.17"
  128 + resolved "https://registry.npm.taobao.org/compressible/download/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1"
  129 + dependencies:
  130 + mime-db ">= 1.40.0 < 2"
  131 +
  132 +compression@^1.7.4:
  133 + version "1.7.4"
  134 + resolved "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
  135 + dependencies:
  136 + accepts "~1.3.5"
  137 + bytes "3.0.0"
  138 + compressible "~2.0.16"
  139 + debug "2.6.9"
  140 + on-headers "~1.0.2"
  141 + safe-buffer "5.1.2"
  142 + vary "~1.1.2"
  143 +
  144 +connect-redis@^3.4.1:
  145 + version "3.4.1"
  146 + resolved "http://registry.npm.taobao.org/connect-redis/download/connect-redis-3.4.1.tgz#0623af46182232457fefbc7d4f552d87d35b3d20"
  147 + dependencies:
  148 + debug "^4.1.1"
  149 + redis "^2.8.0"
  150 +
  151 +content-disposition@0.5.1:
  152 + version "0.5.1"
  153 + resolved "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b"
  154 +
  155 +content-type@~1.0.1, content-type@~1.0.4:
  156 + version "1.0.4"
  157 + resolved "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
  158 +
  159 +cookie-parser@~1.3.5:
  160 + version "1.3.5"
  161 + resolved "http://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356"
  162 + dependencies:
  163 + cookie "0.1.3"
  164 + cookie-signature "1.0.6"
  165 +
  166 +cookie-signature@1.0.6:
  167 + version "1.0.6"
  168 + resolved "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
  169 +
  170 +cookie@0.1.3:
  171 + version "0.1.3"
  172 + resolved "http://registry.npm.taobao.org/cookie/download/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435"
  173 +
  174 +cookie@0.1.5:
  175 + version "0.1.5"
  176 + resolved "http://registry.npm.taobao.org/cookie/download/cookie-0.1.5.tgz#6ab9948a4b1ae21952cd2588530a4722d4044d7c"
  177 +
  178 +cookie@0.3.1:
  179 + version "0.3.1"
  180 + resolved "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
  181 +
  182 +core-util-is@~1.0.0:
  183 + version "1.0.2"
  184 + resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
  185 +
  186 +d@1, d@^1.0.0:
  187 + version "1.0.0"
  188 + resolved "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
  189 + dependencies:
  190 + es5-ext "^0.10.9"
  191 +
  192 +debug@2.6.9, debug@^2.2.0:
  193 + version "2.6.9"
  194 + resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
  195 + dependencies:
  196 + ms "2.0.0"
  197 +
  198 +debug@^4.1.1:
  199 + version "4.1.1"
  200 + resolved "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
  201 + dependencies:
  202 + ms "^2.1.1"
  203 +
  204 +debug@~2.2.0:
  205 + version "2.2.0"
  206 + resolved "http://registry.npm.taobao.org/debug/download/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
  207 + dependencies:
  208 + ms "0.7.1"
  209 +
  210 +depd@^1.0.1, depd@~1.1.0, depd@~1.1.2:
  211 + version "1.1.2"
  212 + resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
  213 +
  214 +depd@~1.0.1:
  215 + version "1.0.1"
  216 + resolved "http://registry.npm.taobao.org/depd/download/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa"
  217 +
  218 +depd@~2.0.0:
  219 + version "2.0.0"
  220 + resolved "http://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
  221 +
  222 +destroy@~1.0.4:
  223 + version "1.0.4"
  224 + resolved "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
  225 +
  226 +diagnostics@^1.1.1:
  227 + version "1.1.1"
  228 + resolved "http://registry.npm.taobao.org/diagnostics/download/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a"
  229 + dependencies:
  230 + colorspace "1.1.x"
  231 + enabled "1.0.x"
  232 + kuler "1.0.x"
  233 +
  234 +double-ended-queue@^2.1.0-0:
  235 + version "2.1.0-0"
  236 + resolved "http://registry.npm.taobao.org/double-ended-queue/download/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
  237 +
  238 +duration@^0.2.2:
  239 + version "0.2.2"
  240 + resolved "http://registry.npm.taobao.org/duration/download/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529"
  241 + dependencies:
  242 + d "1"
  243 + es5-ext "~0.10.46"
  244 +
  245 +ee-first@1.1.1:
  246 + version "1.1.1"
  247 + resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
  248 +
  249 +ejs@~2.3.3:
  250 + version "2.3.4"
  251 + resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.3.4.tgz#3c76caa09664b3583b0037af9dc136e79ec68b98"
  252 +
  253 +electrolyte@^0.5.1:
  254 + version "0.5.1"
  255 + resolved "http://registry.npm.taobao.org/electrolyte/download/electrolyte-0.5.1.tgz#73500e7494f7dbbcf4b41ee9bf52bf24f5c24c9e"
  256 + dependencies:
  257 + canonical-path "0.0.2"
  258 + debug "^2.2.0"
  259 + depd "^1.0.1"
  260 + promise "^7.1.1"
  261 + scripts "0.1.x"
  262 +
  263 +enabled@1.0.x:
  264 + version "1.0.2"
  265 + resolved "http://registry.npm.taobao.org/enabled/download/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93"
  266 + dependencies:
  267 + env-variable "0.0.x"
  268 +
  269 +encodeurl@~1.0.2:
  270 + version "1.0.2"
  271 + resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
  272 +
  273 +env-variable@0.0.x:
  274 + version "0.0.5"
  275 + resolved "http://registry.npm.taobao.org/env-variable/download/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88"
  276 +
  277 +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.49, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.46:
  278 + version "0.10.49"
  279 + resolved "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.49.tgz#059a239de862c94494fec28f8150c977028c6c5e"
  280 + dependencies:
  281 + es6-iterator "~2.0.3"
  282 + es6-symbol "~3.1.1"
  283 + next-tick "^1.0.0"
  284 +
  285 +es6-iterator@~2.0.3:
  286 + version "2.0.3"
  287 + resolved "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
  288 + dependencies:
  289 + d "1"
  290 + es5-ext "^0.10.35"
  291 + es6-symbol "^3.1.1"
  292 +
  293 +es6-symbol@^3.1.1, es6-symbol@~3.1.1:
  294 + version "3.1.1"
  295 + resolved "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
  296 + dependencies:
  297 + d "1"
  298 + es5-ext "~0.10.14"
  299 +
  300 +escape-html@~1.0.3:
  301 + version "1.0.3"
  302 + resolved "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
  303 +
  304 +etag@~1.7.0:
  305 + version "1.7.0"
  306 + resolved "http://registry.npm.taobao.org/etag/download/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
  307 +
  308 +etag@~1.8.1:
  309 + version "1.8.1"
  310 + resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
  311 +
  312 +event-emitter@^0.3.5:
  313 + version "0.3.5"
  314 + resolved "http://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
  315 + dependencies:
  316 + d "1"
  317 + es5-ext "~0.10.14"
  318 +
  319 +express-session@^1.16.1:
  320 + version "1.16.1"
  321 + resolved "http://registry.npm.taobao.org/express-session/download/express-session-1.16.1.tgz#251ff9776c59382301de6c8c33411af357ed439c"
  322 + dependencies:
  323 + cookie "0.3.1"
  324 + cookie-signature "1.0.6"
  325 + debug "2.6.9"
  326 + depd "~2.0.0"
  327 + on-headers "~1.0.2"
  328 + parseurl "~1.3.2"
  329 + safe-buffer "5.1.2"
  330 + uid-safe "~2.1.5"
  331 +
  332 +express@~4.13.1:
  333 + version "4.13.4"
  334 + resolved "http://registry.npm.taobao.org/express/download/express-4.13.4.tgz#3c0b76f3c77590c8345739061ec0bd3ba067ec24"
  335 + dependencies:
  336 + accepts "~1.2.12"
  337 + array-flatten "1.1.1"
  338 + content-disposition "0.5.1"
  339 + content-type "~1.0.1"
  340 + cookie "0.1.5"
  341 + cookie-signature "1.0.6"
  342 + debug "~2.2.0"
  343 + depd "~1.1.0"
  344 + escape-html "~1.0.3"
  345 + etag "~1.7.0"
  346 + finalhandler "0.4.1"
  347 + fresh "0.3.0"
  348 + merge-descriptors "1.0.1"
  349 + methods "~1.1.2"
  350 + on-finished "~2.3.0"
  351 + parseurl "~1.3.1"
  352 + path-to-regexp "0.1.7"
  353 + proxy-addr "~1.0.10"
  354 + qs "4.0.0"
  355 + range-parser "~1.0.3"
  356 + send "0.13.1"
  357 + serve-static "~1.10.2"
  358 + type-is "~1.6.6"
  359 + utils-merge "1.0.0"
  360 + vary "~1.0.1"
  361 +
  362 +fast-safe-stringify@^2.0.4:
  363 + version "2.0.6"
  364 + resolved "http://registry.npm.taobao.org/fast-safe-stringify/download/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2"
  365 +
  366 +fecha@^2.3.3:
  367 + version "2.3.3"
  368 + resolved "http://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
  369 +
  370 +fibers@^2.0.2:
  371 + version "2.0.2"
  372 + resolved "https://registry.npm.taobao.org/fibers/download/fibers-2.0.2.tgz#36db63ea61c543174e2264675fea8c2783371366"
  373 +
  374 +finalhandler@0.4.1:
  375 + version "0.4.1"
  376 + resolved "http://registry.npm.taobao.org/finalhandler/download/finalhandler-0.4.1.tgz#85a17c6c59a94717d262d61230d4b0ebe3d4a14d"
  377 + dependencies:
  378 + debug "~2.2.0"
  379 + escape-html "~1.0.3"
  380 + on-finished "~2.3.0"
  381 + unpipe "~1.0.0"
  382 +
  383 +forwarded@~0.1.0:
  384 + version "0.1.2"
  385 + resolved "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
  386 +
  387 +fresh@0.3.0:
  388 + version "0.3.0"
  389 + resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
  390 +
  391 +fresh@0.5.2:
  392 + version "0.5.2"
  393 + resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
  394 +
  395 +http-errors@1.7.2:
  396 + version "1.7.2"
  397 + resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
  398 + dependencies:
  399 + depd "~1.1.2"
  400 + inherits "2.0.3"
  401 + setprototypeof "1.1.1"
  402 + statuses ">= 1.5.0 < 2"
  403 + toidentifier "1.0.0"
  404 +
  405 +http-errors@~1.3.1:
  406 + version "1.3.1"
  407 + resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942"
  408 + dependencies:
  409 + inherits "~2.0.1"
  410 + statuses "1"
  411 +
  412 +http-errors@~1.6.2:
  413 + version "1.6.3"
  414 + resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
  415 + dependencies:
  416 + depd "~1.1.2"
  417 + inherits "2.0.3"
  418 + setprototypeof "1.1.0"
  419 + statuses ">= 1.4.0 < 2"
  420 +
  421 +iconv-lite@0.4.24:
  422 + version "0.4.24"
  423 + resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
  424 + dependencies:
  425 + safer-buffer ">= 2.1.2 < 3"
  426 +
  427 +inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
  428 + version "2.0.3"
  429 + resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
  430 +
  431 +ipaddr.js@1.0.5:
  432 + version "1.0.5"
  433 + resolved "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.0.5.tgz#5fa78cf301b825c78abc3042d812723049ea23c7"
  434 +
  435 +is-arrayish@^0.3.1:
  436 + version "0.3.2"
  437 + resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
  438 +
  439 +is-stream@^1.1.0:
  440 + version "1.1.0"
  441 + resolved "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
  442 +
  443 +isarray@~1.0.0:
  444 + version "1.0.0"
  445 + resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
  446 +
  447 +kuler@1.0.x:
  448 + version "1.0.1"
  449 + resolved "http://registry.npm.taobao.org/kuler/download/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6"
  450 + dependencies:
  451 + colornames "^1.1.1"
  452 +
  453 +lodash@^4.17.11:
  454 + version "4.17.11"
  455 + resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
  456 +
  457 +"log@>= 1.2.0":
  458 + version "6.0.0"
  459 + resolved "http://registry.npm.taobao.org/log/download/log-6.0.0.tgz#1e8e655f0389148e729d9ddd6d3bcbe8b93b8d21"
  460 + dependencies:
  461 + d "^1.0.0"
  462 + duration "^0.2.2"
  463 + es5-ext "^0.10.49"
  464 + event-emitter "^0.3.5"
  465 + sprintf-kit "^2.0.0"
  466 + type "^1.0.1"
  467 +
  468 +logform@^2.1.1:
  469 + version "2.1.2"
  470 + resolved "http://registry.npm.taobao.org/logform/download/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360"
  471 + dependencies:
  472 + colors "^1.2.1"
  473 + fast-safe-stringify "^2.0.4"
  474 + fecha "^2.3.3"
  475 + ms "^2.1.1"
  476 + triple-beam "^1.3.0"
  477 +
  478 +media-typer@0.3.0:
  479 + version "0.3.0"
  480 + resolved "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
  481 +
  482 +merge-descriptors@1.0.1:
  483 + version "1.0.1"
  484 + resolved "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
  485 +
  486 +methods@~1.1.2:
  487 + version "1.1.2"
  488 + resolved "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
  489 +
  490 +mime-db@1.40.0, "mime-db@>= 1.40.0 < 2":
  491 + version "1.40.0"
  492 + resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
  493 +
  494 +mime-db@~1.39.0:
  495 + version "1.39.0"
  496 + resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.39.0.tgz#f95a20275742f7d2ad0429acfe40f4233543780e"
  497 +
  498 +mime-types@~2.1.18, mime-types@~2.1.6:
  499 + version "2.1.23"
  500 + resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.23.tgz#d4eacd87de99348a6858fe1e479aad877388d977"
  501 + dependencies:
  502 + mime-db "~1.39.0"
  503 +
  504 +mime-types@~2.1.24:
  505 + version "2.1.24"
  506 + resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
  507 + dependencies:
  508 + mime-db "1.40.0"
  509 +
  510 +mime@1.3.4:
  511 + version "1.3.4"
  512 + resolved "http://registry.npm.taobao.org/mime/download/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
  513 +
  514 +mime@1.4.1:
  515 + version "1.4.1"
  516 + resolved "https://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
  517 +
  518 +minimist@0.0.8:
  519 + version "0.0.8"
  520 + resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
  521 +
  522 +"mkdirp@>= 0.0.1":
  523 + version "0.5.1"
  524 + resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
  525 + dependencies:
  526 + minimist "0.0.8"
  527 +
  528 +morgan@~1.6.1:
  529 + version "1.6.1"
  530 + resolved "http://registry.npm.taobao.org/morgan/download/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2"
  531 + dependencies:
  532 + basic-auth "~1.0.3"
  533 + debug "~2.2.0"
  534 + depd "~1.0.1"
  535 + on-finished "~2.3.0"
  536 + on-headers "~1.0.0"
  537 +
  538 +ms@0.7.1:
  539 + version "0.7.1"
  540 + resolved "http://registry.npm.taobao.org/ms/download/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
  541 +
  542 +ms@0.7.2:
  543 + version "0.7.2"
  544 + resolved "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
  545 +
  546 +ms@2.0.0:
  547 + version "2.0.0"
  548 + resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
  549 +
  550 +ms@^2.1.1:
  551 + version "2.1.1"
  552 + resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
  553 +
  554 +negotiator@0.5.3:
  555 + version "0.5.3"
  556 + resolved "http://registry.npm.taobao.org/negotiator/download/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8"
  557 +
  558 +negotiator@0.6.1:
  559 + version "0.6.1"
  560 + resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
  561 +
  562 +next-tick@^1.0.0:
  563 + version "1.0.0"
  564 + resolved "http://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
  565 +
  566 +on-finished@~2.3.0:
  567 + version "2.3.0"
  568 + resolved "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
  569 + dependencies:
  570 + ee-first "1.1.1"
  571 +
  572 +on-headers@~1.0.0, on-headers@~1.0.2:
  573 + version "1.0.2"
  574 + resolved "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
  575 +
  576 +one-time@0.0.4:
  577 + version "0.0.4"
  578 + resolved "http://registry.npm.taobao.org/one-time/download/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
  579 +
  580 +parseurl@~1.3.1, parseurl@~1.3.2:
  581 + version "1.3.3"
  582 + resolved "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
  583 +
  584 +path-to-regexp@0.1.7:
  585 + version "0.1.7"
  586 + resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
  587 +
  588 +process-nextick-args@~2.0.0:
  589 + version "2.0.0"
  590 + resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
  591 +
  592 +promise@^7.1.1:
  593 + version "7.3.1"
  594 + resolved "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
  595 + dependencies:
  596 + asap "~2.0.3"
  597 +
  598 +proxy-addr@~1.0.10:
  599 + version "1.0.10"
  600 + resolved "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-1.0.10.tgz#0d40a82f801fc355567d2ecb65efe3f077f121c5"
  601 + dependencies:
  602 + forwarded "~0.1.0"
  603 + ipaddr.js "1.0.5"
  604 +
  605 +qs@4.0.0:
  606 + version "4.0.0"
  607 + resolved "http://registry.npm.taobao.org/qs/download/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607"
  608 +
  609 +qs@6.7.0:
  610 + version "6.7.0"
  611 + resolved "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
  612 +
  613 +random-bytes@~1.0.0:
  614 + version "1.0.0"
  615 + resolved "http://registry.npm.taobao.org/random-bytes/download/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
  616 +
  617 +range-parser@~1.0.3:
  618 + version "1.0.3"
  619 + resolved "http://registry.npm.taobao.org/range-parser/download/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175"
  620 +
  621 +range-parser@~1.2.0:
  622 + version "1.2.0"
  623 + resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
  624 +
  625 +raw-body@2.4.0:
  626 + version "2.4.0"
  627 + resolved "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
  628 + dependencies:
  629 + bytes "3.1.0"
  630 + http-errors "1.7.2"
  631 + iconv-lite "0.4.24"
  632 + unpipe "1.0.0"
  633 +
  634 +readable-stream@^2.3.6:
  635 + version "2.3.6"
  636 + resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
  637 + dependencies:
  638 + core-util-is "~1.0.0"
  639 + inherits "~2.0.3"
  640 + isarray "~1.0.0"
  641 + process-nextick-args "~2.0.0"
  642 + safe-buffer "~5.1.1"
  643 + string_decoder "~1.1.1"
  644 + util-deprecate "~1.0.1"
  645 +
  646 +readable-stream@^3.1.1:
  647 + version "3.3.0"
  648 + resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9"
  649 + dependencies:
  650 + inherits "^2.0.3"
  651 + string_decoder "^1.1.1"
  652 + util-deprecate "^1.0.1"
  653 +
  654 +redis-commands@^1.2.0:
  655 + version "1.4.0"
  656 + resolved "http://registry.npm.taobao.org/redis-commands/download/redis-commands-1.4.0.tgz#52f9cf99153efcce56a8f86af986bd04e988602f"
  657 +
  658 +redis-parser@^2.6.0:
  659 + version "2.6.0"
  660 + resolved "http://registry.npm.taobao.org/redis-parser/download/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
  661 +
  662 +redis@^2.8.0:
  663 + version "2.8.0"
  664 + resolved "http://registry.npm.taobao.org/redis/download/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
  665 + dependencies:
  666 + double-ended-queue "^2.1.0-0"
  667 + redis-commands "^1.2.0"
  668 + redis-parser "^2.6.0"
  669 +
  670 +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
  671 + version "5.1.2"
  672 + resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
  673 +
  674 +"safer-buffer@>= 2.1.2 < 3":
  675 + version "2.1.2"
  676 + resolved "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
  677 +
  678 +scripts@0.1.x:
  679 + version "0.1.0"
  680 + resolved "http://registry.npm.taobao.org/scripts/download/scripts-0.1.0.tgz#3eb19713b5ad1f58bc3e39ce63606d6beaa00693"
  681 +
  682 +send@0.13.1:
  683 + version "0.13.1"
  684 + resolved "http://registry.npm.taobao.org/send/download/send-0.13.1.tgz#a30d5f4c82c8a9bae9ad00a1d9b1bdbe6f199ed7"
  685 + dependencies:
  686 + debug "~2.2.0"
  687 + depd "~1.1.0"
  688 + destroy "~1.0.4"
  689 + escape-html "~1.0.3"
  690 + etag "~1.7.0"
  691 + fresh "0.3.0"
  692 + http-errors "~1.3.1"
  693 + mime "1.3.4"
  694 + ms "0.7.1"
  695 + on-finished "~2.3.0"
  696 + range-parser "~1.0.3"
  697 + statuses "~1.2.1"
  698 +
  699 +send@0.13.2:
  700 + version "0.13.2"
  701 + resolved "http://registry.npm.taobao.org/send/download/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de"
  702 + dependencies:
  703 + debug "~2.2.0"
  704 + depd "~1.1.0"
  705 + destroy "~1.0.4"
  706 + escape-html "~1.0.3"
  707 + etag "~1.7.0"
  708 + fresh "0.3.0"
  709 + http-errors "~1.3.1"
  710 + mime "1.3.4"
  711 + ms "0.7.1"
  712 + on-finished "~2.3.0"
  713 + range-parser "~1.0.3"
  714 + statuses "~1.2.1"
  715 +
  716 +send@0.16.2:
  717 + version "0.16.2"
  718 + resolved "https://registry.npm.taobao.org/send/download/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
  719 + dependencies:
  720 + debug "2.6.9"
  721 + depd "~1.1.2"
  722 + destroy "~1.0.4"
  723 + encodeurl "~1.0.2"
  724 + escape-html "~1.0.3"
  725 + etag "~1.8.1"
  726 + fresh "0.5.2"
  727 + http-errors "~1.6.2"
  728 + mime "1.4.1"
  729 + ms "2.0.0"
  730 + on-finished "~2.3.0"
  731 + range-parser "~1.2.0"
  732 + statuses "~1.4.0"
  733 +
  734 +serve-favicon@~2.3.0:
  735 + version "2.3.2"
  736 + resolved "http://registry.npm.taobao.org/serve-favicon/download/serve-favicon-2.3.2.tgz#dd419e268de012ab72b319d337f2105013f9381f"
  737 + dependencies:
  738 + etag "~1.7.0"
  739 + fresh "0.3.0"
  740 + ms "0.7.2"
  741 + parseurl "~1.3.1"
  742 +
  743 +serve-static@^1.13.2:
  744 + version "1.13.2"
  745 + resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
  746 + dependencies:
  747 + encodeurl "~1.0.2"
  748 + escape-html "~1.0.3"
  749 + parseurl "~1.3.2"
  750 + send "0.16.2"
  751 +
  752 +serve-static@~1.10.2:
  753 + version "1.10.3"
  754 + resolved "http://registry.npm.taobao.org/serve-static/download/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535"
  755 + dependencies:
  756 + escape-html "~1.0.3"
  757 + parseurl "~1.3.1"
  758 + send "0.13.2"
  759 +
  760 +setprototypeof@1.1.0:
  761 + version "1.1.0"
  762 + resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
  763 +
  764 +setprototypeof@1.1.1:
  765 + version "1.1.1"
  766 + resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
  767 +
  768 +simple-swizzle@^0.2.2:
  769 + version "0.2.2"
  770 + resolved "http://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
  771 + dependencies:
  772 + is-arrayish "^0.3.1"
  773 +
  774 +sprintf-kit@^2.0.0:
  775 + version "2.0.0"
  776 + resolved "http://registry.npm.taobao.org/sprintf-kit/download/sprintf-kit-2.0.0.tgz#47499d636e9cc68f2f921d30eb4f0b911a2d7835"
  777 + dependencies:
  778 + es5-ext "^0.10.46"
  779 +
  780 +stack-trace@0.0.x:
  781 + version "0.0.10"
  782 + resolved "http://registry.npm.taobao.org/stack-trace/download/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
  783 +
  784 +statuses@1, "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2":
  785 + version "1.5.0"
  786 + resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
  787 +
  788 +statuses@~1.2.1:
  789 + version "1.2.1"
  790 + resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28"
  791 +
  792 +statuses@~1.4.0:
  793 + version "1.4.0"
  794 + resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
  795 +
  796 +string_decoder@^1.1.1:
  797 + version "1.2.0"
  798 + resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
  799 + dependencies:
  800 + safe-buffer "~5.1.0"
  801 +
  802 +string_decoder@~1.1.1:
  803 + version "1.1.1"
  804 + resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
  805 + dependencies:
  806 + safe-buffer "~5.1.0"
  807 +
  808 +text-hex@1.0.x:
  809 + version "1.0.0"
  810 + resolved "http://registry.npm.taobao.org/text-hex/download/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
  811 +
  812 +toidentifier@1.0.0:
  813 + version "1.0.0"
  814 + resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
  815 +
  816 +triple-beam@^1.2.0, triple-beam@^1.3.0:
  817 + version "1.3.0"
  818 + resolved "http://registry.npm.taobao.org/triple-beam/download/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
  819 +
  820 +type-is@~1.6.17:
  821 + version "1.6.18"
  822 + resolved "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
  823 + dependencies:
  824 + media-typer "0.3.0"
  825 + mime-types "~2.1.24"
  826 +
  827 +type-is@~1.6.6:
  828 + version "1.6.16"
  829 + resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
  830 + dependencies:
  831 + media-typer "0.3.0"
  832 + mime-types "~2.1.18"
  833 +
  834 +type@^1.0.1:
  835 + version "1.0.1"
  836 + resolved "http://registry.npm.taobao.org/type/download/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61"
  837 +
  838 +uid-safe@~2.1.5:
  839 + version "2.1.5"
  840 + resolved "http://registry.npm.taobao.org/uid-safe/download/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"
  841 + dependencies:
  842 + random-bytes "~1.0.0"
  843 +
  844 +underscore@^1.9.1:
  845 + version "1.9.1"
  846 + resolved "http://registry.npm.taobao.org/underscore/download/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
  847 +
  848 +unpipe@1.0.0, unpipe@~1.0.0:
  849 + version "1.0.0"
  850 + resolved "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
  851 +
  852 +util-deprecate@^1.0.1, util-deprecate@~1.0.1:
  853 + version "1.0.2"
  854 + resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  855 +
  856 +utils-merge@1.0.0:
  857 + version "1.0.0"
  858 + resolved "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
  859 +
  860 +vary@~1.0.1:
  861 + version "1.0.1"
  862 + resolved "http://registry.npm.taobao.org/vary/download/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
  863 +
  864 +vary@~1.1.2:
  865 + version "1.1.2"
  866 + resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
  867 +
  868 +winston-transport@^4.3.0:
  869 + version "4.3.0"
  870 + resolved "http://registry.npm.taobao.org/winston-transport/download/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66"
  871 + dependencies:
  872 + readable-stream "^2.3.6"
  873 + triple-beam "^1.2.0"
  874 +
  875 +winston@^3.2.1:
  876 + version "3.2.1"
  877 + resolved "http://registry.npm.taobao.org/winston/download/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07"
  878 + dependencies:
  879 + async "^2.6.1"
  880 + diagnostics "^1.1.1"
  881 + is-stream "^1.1.0"
  882 + logform "^2.1.1"
  883 + one-time "0.0.4"
  884 + readable-stream "^3.1.1"
  885 + stack-trace "0.0.x"
  886 + triple-beam "^1.3.0"
  887 + winston-transport "^4.3.0"
注册登录 后发表评论