正在显示
32 个修改的文件
包含
2230 行增加
和
0 行删除
.gitignore
0 → 100644
1 | +node_modules/ |
.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 | +} |
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; |
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 | +}; |
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 | +}; |
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'); |
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; |
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 | +}; |
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 | +}; |
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 | +}; |
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'] |
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'] |
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'] |
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']; |
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 | +} |
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 | +// }); |
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 | +} |
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> |
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" |
请
注册
或
登录
后发表评论