正在显示
32 个修改的文件
包含
2230 行增加
和
0 行删除
.gitignore
0 → 100644
| 1 | +node_modules/ | |
| \ No newline at end of file | ... | ... |
.vscode/launch.json
0 → 100644
| 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 | +} | |
| \ No newline at end of file | ... | ... |
app.js
0 → 100644
| 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; | ... | ... |
bin/www
0 → 100755
| 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 | +} | ... | ... |
boot/config.js
0 → 100644
| 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; | ... | ... |
boot/local.js
0 → 100644
| 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; | |
| \ No newline at end of file | ... | ... |
bootable/bootable-di/index.js
0 → 100644
bootable/bootable-di/initializers.js
0 → 100644
| 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 | +}; | |
| \ No newline at end of file | ... | ... |
bootable/bootable-di/routes.js
0 → 100644
| 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 | +}; | |
| \ No newline at end of file | ... | ... |
bootable/index.js
0 → 100644
| 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'); | |
| \ No newline at end of file | ... | ... |
bootable/initializer.js
0 → 100644
| 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; | |
| \ No newline at end of file | ... | ... |
bootable/phases/initializers.js
0 → 100644
| 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 | +}; | |
| \ No newline at end of file | ... | ... |
bootable/phases/routes.js
0 → 100644
| 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 | +}; | |
| \ No newline at end of file | ... | ... |
bootable/utils/parent-require.js
0 → 100644
bootable/utils/scripts.js
0 → 100644
| 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 | +}; | |
| \ No newline at end of file | ... | ... |
etc/init/01-settings.js
0 → 100644
| 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']; | ... | ... |
etc/init/02-middleware.js
0 → 100644
| 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']; | ... | ... |
igloo/boot/logger.js
0 → 100644
| 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'] | |
| \ No newline at end of file | ... | ... |
igloo/boot/server.js
0 → 100644
| 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'] | |
| \ No newline at end of file | ... | ... |
igloo/boot/sessions.js
0 → 100644
| 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'] | |
| \ No newline at end of file | ... | ... |
igloo/boot/settings.js
0 → 100644
| 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']; | |
| \ No newline at end of file | ... | ... |
igloo/index.js
0 → 100644
| 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 | +} | |
| \ No newline at end of file | ... | ... |
igloo/utils/merge-defaults.js
0 → 100644
| 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 | +// }); | |
| \ No newline at end of file | ... | ... |
lib/ index.js
0 → 100644
package.json
0 → 100644
| 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 | +} | |
| \ No newline at end of file | ... | ... |
public/index.ejs
0 → 100644
| 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> | |
| \ No newline at end of file | ... | ... |
public/stylesheets/style.css
0 → 100644
routes/index.js
0 → 100644
| 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']; | ... | ... |
routes/users.js
0 → 100644
| 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']; | ... | ... |
views/error.ejs
0 → 100644
views/index.ejs
0 → 100644
yarn.lock
0 → 100644
| 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" | ... | ... |
请
注册
或
登录
后发表评论