This repository has been archived by the owner on Aug 28, 2023. It is now read-only.
/
plugin.js
101 lines (85 loc) · 3.3 KB
/
plugin.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
import _ from 'lodash';
import assert from 'assert';
import Debug from 'debug';
const debug = new Debug('koa-oai-router:plugin');
class Plugin {
/**
* Create a oai router plugin
* @param {object} param0
* @param {string} param0.name plugin name
* @param {string|[]string} param0.field plugin invoke field
* @param {function} param0.middlewareWrapper field middleware wrapper function(middlewareOpts, middlewareArgs) {}
* @param {object} param0.middlewareArgs field middleware args
*/
constructor({ name, field, middlewareWrapper, middlewareArgs }) {
assert(_.isString(name), 'name must be string.');
assert(_.isString(field) || (_.isArray(field) && _.every(field, _.isString)), 'field must be string or [string].');
assert(_.isFunction(middlewareWrapper), 'middlewareWrapper must be function.');
this.name = name;
this.field = field;
this.middlewareWrapper = middlewareWrapper;
this.middlewareArgs = middlewareArgs;
}
/**
* Create a plugin middlewares
* @public true
* @param {object} plugins
* @param {string} plugins.key field
* @param {Plugin} plugins.value Plugin
* @param {object} middlewareOpts
*/
static middlewares(plugins, middlewareOpts) {
let middlewares = [];
const { operationValue } = middlewareOpts;
debug('middlewares', plugins);
_.each(plugins, (fieldPlugins, field) => {
const fieldValue = operationValue[field];
if (!fieldValue) return;
const opts = {
field,
fieldValue,
...middlewareOpts,
};
const mw = Plugin.pluginsToMiddlewares(fieldPlugins, opts);
debug(field, fieldPlugins);
middlewares = middlewares.concat(mw);
});
return middlewares;
}
/**
* Create a plugin middleware.
* @public false
* @param {function} middlewareWrapper koa middleware wrapper with args
* @param {object} middlewareOpts
* @param {object} middlewareOpts.api whole open api object
* @param {string} middlewareOpts.endpoint endpoint
* @param {string} middlewareOpts.field operationObject field name or extensions
* @param {object} middlewareOpts.fieldValue operationObject field value
* @param {string} middlewareOpts.operation http verbs https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#path-item-object
* @param {object} middlewareOpts.operationValue https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#operationObject
* @returns {function} koa middleware
*/
middleware(middlewareOpts) {
const { field, options } = middlewareOpts;
const { name } = this;
const newMiddlewareOpts = _.pick(middlewareOpts, ['api', 'endpoint', 'field', 'fieldValue', 'operation', 'operationValue']);
const newMiddlewareArgs = _.get(options, name) || this.middlewareArgs;
const mw = this.middlewareWrapper(newMiddlewareOpts, newMiddlewareArgs);
Object.defineProperty(mw, 'name', { value: `${field}.${name}` });
return mw;
}
/**
* Convert plugins to middlewares array.
* @public false
* @param {Plugin[]} plugins
* @param {object} middlewareOpts
*/
static pluginsToMiddlewares(plugins, middlewareOpts) {
const middlewares = [];
plugins.forEach((plugin) => {
middlewares.push(plugin.middleware(middlewareOpts));
});
return middlewares;
}
}
export default Plugin;