正在显示
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" | ... | ... |
请
注册
或
登录
后发表评论