forked from Mermade/openapi-filter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
100 lines (92 loc) · 3.49 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
'use strict';
const recurse = require('reftools/lib/recurse.js').recurse;
const clone = require('reftools/lib/clone.js').clone;
const jptr = require('reftools/lib/jptr.js').jptr;
function filter(obj,options) {
const defaults = {};
defaults.tags = ['x-internal'];
defaults.inverse = false;
defaults.strip = false;
defaults.overrides = [];
options = Object.assign({},defaults,options);
let src = clone(obj);
let filtered = {};
let filteredpaths = [];
recurse(src,{},function(obj,key,state){
for (let override of options.overrides||[]) {
if (key.startsWith(override)) {
obj[key.substring(override.length)] = obj[key];
if (options.strip) {
delete obj[key];
}
}
}
for (let tag of options.tags) {
if (obj[key] && obj[key][tag]) {
if (options.inverse) {
if (options.strip) {
delete obj[key][tag];
}
jptr(filtered,state.path,clone(obj[key]));
}
filteredpaths.push(state.path);
delete obj[key];
break;
}
}
});
recurse((options.inverse ? filtered : src),{},function(obj,key,state){
if (Array.isArray(obj[key])) {
obj[key] = obj[key].filter(function(e){
return typeof e !== 'undefined';
});
}
});
recurse(src,{},function(obj,key,state){
if (obj.hasOwnProperty('$ref') && filteredpaths.includes(obj['$ref'])) {
if (Array.isArray(state.parent)) {
state.parent.splice(state.pkey, 1);
}
}
});
if (options.inverse && options.valid) {
let info = {};
if (src.info && (!filtered.info || !filtered.info.version || !filtered.info.title)) {
info = Object.assign({}, filtered.info, options.info ? src.info : { title: src.info.title, version: src.info.version });
}
if (src.swagger && !filtered.swagger) {
filtered = Object.assign({ swagger: src.swagger, info: info }, filtered);
}
if (src.openapi && !filtered.openapi) {
filtered = Object.assign({ openapi: src.openapi, info: info }, filtered);
}
if (!filtered.security && Array.isArray(src.security)) {
const filteredsecurityschemes = [];
// OAS2
if (filtered.securityDefinitions) {
filteredsecurityschemes.push(...Object.keys(filtered.securityDefinitions));
}
// OAS3
if (filtered.components && filtered.components.securitySchemes) {
filteredsecurityschemes.push(...Object.keys(filtered.components.securitySchemes));
}
filtered.security = src.security.filter(req => {
const filteredreq = {};
Object.getOwnPropertyNames(req).forEach(function(n){
if (filteredsecurityschemes.includes(n)) {
filteredreq[n] = clone(req[n]);
}
});
return Object.getOwnPropertyNames(filteredreq).length !== 0;
});
}
if (!filtered.paths) filtered.paths = {};
if (options.servers && !filtered.servers && Array.isArray(src.servers)) {
filtered.servers = src.servers;
}
}
return (options.inverse ? filtered : src);
}
module.exports = {
filter : filter
};