forked from Reckon-Limited/serverless_swagger
-
Notifications
You must be signed in to change notification settings - Fork 0
/
generator.js
127 lines (122 loc) · 3.42 KB
/
generator.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
126
127
"use strict";
var _ = require("lodash");
var fs = require("fs");
var dsk = require('path');
function log(s) {
console.info(s);
}
function bindLog(fn) {
this.log = fn;
}
exports.bindLog = bindLog;
function definition(handler, url, method) {
return {
handler: "" + handler,
events: [
httpEvent(url, method)
]
};
}
exports.definition = definition;
function handler(namespace, name, dir) {
var result = name + ".main";
if (namespace == '') {
if(dir)
return dsk.join(dir,result);
else
return result;
}
else {
if(dir)
return dsk.join(namespace,dir,result);
else
return dsk.join(namespace,result);
}
}
exports.handler = handler;
function httpEvent(url, method) {
return {
http: {
method: method,
path: url
}
};
}
exports.httpEvent = httpEvent;
function name(url, method) {
var m = _.upperFirst(method);
// let n = url.replace(/{(.*?)}/g, '');
return _.camelCase(m + " " + url);
}
exports.name = name;
function src(name) {
return "\nmodule.exports.main = (event, context, callback) => {\n const response = {\n statusCode: 200,\n body: JSON.stringify({\n name: '" + name + "'\n }),\n };\n callback(null, response);\n};";
}
exports.src = src;
function writeHandler(path, name , dir) {
var file = '';
if (dir){
dir = dsk.join(path,dir);
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
file = dsk.join(dir,name + ".js");
} else {
file = path + "/" + name + ".js"
}
if (fs.existsSync(file)) {
log("Function handler exists " + name);
}
else {
log("Creating function handler " + name);
fs.writeFileSync(file, src(name));
}
}
exports.writeHandler = writeHandler;
function generate(swaggerPaths, namespace, outputPath) {
var functions = {};
_.each(swaggerPaths, function (path, url) {
_.each(path, function (options, method) {
var dir = _.camelCase(options ? options.tags[0] : null);
var fn = name(url, method);
var hn = handler(namespace, fn, dir);
var def = definition(hn, url, method);
writeHandler(outputPath, fn, dir);
functions[fn] = def;
});
});
return functions;
}
exports.generate = generate;
function mapDefinitionEvent(definition, event) {
var match = _.find(definition.events, function (e) {
return e.hasOwnProperty('http');
});
if (match) {
var index = _.indexOf(definition.events, match);
definition.events.splice(index, 1, event);
}
else {
definition.events.push(event);
}
return definition;
}
exports.mapDefinitionEvent = mapDefinitionEvent;
function map(swaggerPaths, functions) {
var definitions = _.clone(functions);
_.each(swaggerPaths, function (path, url) {
_.each(path, function (options, method) {
var fn = name(url, method);
var definition = definitions[fn];
if (!definition) {
log("Missing Handler: " + fn);
return false;
}
var event = httpEvent(url, method);
definitions[fn] = mapDefinitionEvent(definition, event);
log("Mapped Handler: " + fn + " - " + method + " - " + url);
});
});
return definitions;
}
exports.map = map;