/
parameter-builders.js
119 lines (96 loc) · 3.29 KB
/
parameter-builders.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
import stylize, { encodeCharacters } from './style-serializer.js';
import serialize from './content-serializer.js';
export function path({ req, value, parameter }) {
const { name, style, explode, content } = parameter;
if (value === undefined) return;
if (content) {
const effectiveMediaType = Object.keys(content)[0];
req.url = req.url
.split(`{${name}}`)
.join(encodeCharacters(serialize(value, effectiveMediaType)));
} else {
const styledValue = stylize({
key: parameter.name,
value,
style: style || 'simple',
explode: explode || false,
escape: 'reserved',
});
req.url = req.url.replace(new RegExp(`{${name}}`, 'g'), styledValue);
}
}
export function query({ req, value, parameter }) {
req.query = req.query || {};
if (value !== undefined && parameter.content) {
const effectiveMediaType = Object.keys(parameter.content)[0];
const serializedValue = serialize(value, effectiveMediaType);
if (serializedValue) {
req.query[parameter.name] = serializedValue;
} else if (parameter.allowEmptyValue) {
const paramName = parameter.name;
req.query[paramName] = req.query[paramName] || {};
req.query[paramName].allowEmptyValue = true;
}
return;
}
if (value === false) {
value = 'false';
}
if (value === 0) {
value = '0';
}
if (value) {
const { style, explode, allowReserved } = parameter;
req.query[parameter.name] = {
value,
serializationOption: { style, explode, allowReserved },
};
} else if (parameter.allowEmptyValue && value !== undefined) {
const paramName = parameter.name;
req.query[paramName] = req.query[paramName] || {};
req.query[paramName].allowEmptyValue = true;
}
}
const PARAMETER_HEADER_BLACKLIST = ['accept', 'authorization', 'content-type'];
export function header({ req, parameter, value }) {
req.headers = req.headers || {};
if (PARAMETER_HEADER_BLACKLIST.indexOf(parameter.name.toLowerCase()) > -1) {
return;
}
if (value !== undefined && parameter.content) {
const effectiveMediaType = Object.keys(parameter.content)[0];
req.headers[parameter.name] = serialize(value, effectiveMediaType);
return;
}
if (value !== undefined && !(Array.isArray(value) && value.length === 0)) {
req.headers[parameter.name] = stylize({
key: parameter.name,
value,
style: parameter.style || 'simple',
explode: typeof parameter.explode === 'undefined' ? false : parameter.explode,
escape: false,
});
}
}
export function cookie({ req, parameter, value }) {
req.headers = req.headers || {};
const type = typeof value;
if (value !== undefined && parameter.content) {
const effectiveMediaType = Object.keys(parameter.content)[0];
req.headers.Cookie = `${parameter.name}=${serialize(value, effectiveMediaType)}`;
return;
}
if (value !== undefined && !(Array.isArray(value) && value.length === 0)) {
const prefix =
type === 'object' && !Array.isArray(value) && parameter.explode ? '' : `${parameter.name}=`;
req.headers.Cookie =
prefix +
stylize({
key: parameter.name,
value,
escape: false,
style: parameter.style || 'form',
explode: typeof parameter.explode === 'undefined' ? false : parameter.explode,
});
}
}