This repository has been archived by the owner on Jul 14, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
125 lines (115 loc) · 3.37 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**
* Created by sunfuze on 10/12/16.
*/
'use strict'
const { forEach } = require('lodash')
const bodyParser = require('koa-body')
const requireDir = require('require-dir')
const Hoek = require('hoek')
const { join, dirname, resolve } = require('path')
const Utilities = require('./lib/utilities')
const controller = require('./lib/controller')
const api = require('./lib/api')
const error = require('./lib/error')
const DEFAULT_BODY_PARSER_CONFIG = {
jsonLimit: '100KB',
formLimit: '50KB',
multipart: true,
formidable: {
uploadDir: join(process.cwd(), 'runtime')
}
}
module.exports = function (options = {}) {
const app = require('koa')()
// we need body parser by default
const bodyParserOpts = Hoek.applyToDefaults(DEFAULT_BODY_PARSER_CONFIG, options.bodyParser || {})
if (Hoek.reach(bodyParserOpts, 'formidable.uploadDir')) {
Utilities.ensureDir(bodyParserOpts.formidable.uploadDir)
}
app.use(bodyParser(bodyParserOpts))
// app addon
controller(app)
api(app)
error(app)
app.loadDeps = loadDeps.bind(null, app)
app.loadMiddlewares = loadMiddlewares.bind(null, app)
app.loadServer = loadServer.bind(null, app)
return app
}
// 将依赖注入koa context
function loadDeps (app, deps) {
const lazies = []
forEach(deps, (dep, name) => {
if (app.context[name]) {
console.warn('multiple dependency:', name)
return
}
if (Utilities.isFunction(dep) && dep.lazy) {
lazies.push({ name, dep })
// Object.defineProperty(app.context, name, {
// enumerable: true,
// get () {
// return dep(app.context)
// }
// })
} else {
app.context[name] = dep
}
if (Utilities.isFunction(dep.middleware)) {
app.use(dep.middleware())
}
})
// set default logger
if (!app.context.logger) {
app.context.logger = console
}
if (lazies.length) {
lazies.forEach(({ name, dep }) => {
app.context[name] = dep()
})
}
}
/**
* load server config
* @param app
* @param directory
* @param options
*/
function loadServer (app, directory = './', options = {}) {
if (typeof directory === 'object') {
options = directory
directory = options.root
}
let rootDir
if (Utilities.isAbsolutePath(directory)) {
rootDir = directory
} else {
rootDir = resolve(dirname(module.parent.filename), directory)
}
const apiDir = resolve(rootDir, options.apiDir || './apis')
const controllerDir = resolve(rootDir, options.controllerDir || './controllers')
const depsDir = resolve(rootDir, options.dependencyDir || './deps')
const middlewareDir = resolve(rootDir, options.middlewareDir || './middewares')
if (Utilities.isDirectory(depsDir)) app.loadDeps(requireDir(depsDir))
if (Utilities.isDirectory(middlewareDir)) app.loadMiddlewares(requireDir(middlewareDir))
if (Utilities.isDirectory(controllerDir)) app.loadCtrls(requireDir(controllerDir))
if (Utilities.isDirectory(apiDir)) app.loadApis(requireDir(apiDir), app.swagger || {})
}
function loadMiddlewares (app, middlewares) {
app._middlewares = app._middlewares || {}
forEach(middlewares, (m) => {
if (Utilities.isFunction(m)) {
useM(m)
} else if (typeof m === 'object') {
forEach(m, fn => {
useM(fn)
})
} else {
console.warn('middleware must be generator or object contain generators')
}
})
// use middleware
function useM (fn) {
app.use(fn())
}
}