parse-server 5.4.0-beta.1 → 6.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/request.js CHANGED
@@ -1,4 +1,209 @@
1
1
  "use strict";
2
2
 
3
- module.exports = require('./cloud-code/httpRequest');
4
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOztBQUFBQSxNQUFNLENBQUNDLE9BQVAsR0FBaUJDLE9BQU8sQ0FBQywwQkFBRCxDQUF4QiIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jbG91ZC1jb2RlL2h0dHBSZXF1ZXN0Jyk7XG4iXX0=
3
+ var _querystring = _interopRequireDefault(require("querystring"));
4
+
5
+ var _logger = _interopRequireDefault(require("./logger"));
6
+
7
+ var _followRedirects = require("follow-redirects");
8
+
9
+ var _url = require("url");
10
+
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+
13
+ class HTTPResponse {
14
+ constructor(response, body) {
15
+ let _text, _data;
16
+
17
+ this.status = response.statusCode;
18
+ this.headers = response.headers || {};
19
+ this.cookies = this.headers['set-cookie'];
20
+
21
+ if (typeof body == 'string') {
22
+ _text = body;
23
+ } else if (Buffer.isBuffer(body)) {
24
+ this.buffer = body;
25
+ } else if (typeof body == 'object') {
26
+ _data = body;
27
+ }
28
+
29
+ const getText = () => {
30
+ if (!_text && this.buffer) {
31
+ _text = this.buffer.toString('utf-8');
32
+ } else if (!_text && _data) {
33
+ _text = JSON.stringify(_data);
34
+ }
35
+
36
+ return _text;
37
+ };
38
+
39
+ const getData = () => {
40
+ if (!_data) {
41
+ try {
42
+ _data = JSON.parse(getText());
43
+ } catch (e) {
44
+ /* */
45
+ }
46
+ }
47
+
48
+ return _data;
49
+ };
50
+
51
+ Object.defineProperty(this, 'body', {
52
+ get: () => {
53
+ return body;
54
+ }
55
+ });
56
+ Object.defineProperty(this, 'text', {
57
+ enumerable: true,
58
+ get: getText
59
+ });
60
+ Object.defineProperty(this, 'data', {
61
+ enumerable: true,
62
+ get: getData
63
+ });
64
+ }
65
+
66
+ }
67
+
68
+ const clients = {
69
+ 'http:': _followRedirects.http,
70
+ 'https:': _followRedirects.https
71
+ };
72
+
73
+ function makeCallback(resolve, reject) {
74
+ return function (response) {
75
+ const chunks = [];
76
+ response.on('data', chunk => {
77
+ chunks.push(chunk);
78
+ });
79
+ response.on('end', () => {
80
+ const body = Buffer.concat(chunks);
81
+ const httpResponse = new HTTPResponse(response, body); // Consider <200 && >= 400 as errors
82
+
83
+ if (httpResponse.status < 200 || httpResponse.status >= 400) {
84
+ return reject(httpResponse);
85
+ } else {
86
+ return resolve(httpResponse);
87
+ }
88
+ });
89
+ response.on('error', reject);
90
+ };
91
+ }
92
+
93
+ const encodeBody = function ({
94
+ body,
95
+ headers = {}
96
+ }) {
97
+ if (typeof body !== 'object') {
98
+ return {
99
+ body,
100
+ headers
101
+ };
102
+ }
103
+
104
+ var contentTypeKeys = Object.keys(headers).filter(key => {
105
+ return key.match(/content-type/i) != null;
106
+ });
107
+
108
+ if (contentTypeKeys.length == 0) {
109
+ // no content type
110
+ // As per https://parse.com/docs/cloudcode/guide#cloud-code-advanced-sending-a-post-request the default encoding is supposedly x-www-form-urlencoded
111
+ body = _querystring.default.stringify(body);
112
+ headers['Content-Type'] = 'application/x-www-form-urlencoded';
113
+ } else {
114
+ /* istanbul ignore next */
115
+ if (contentTypeKeys.length > 1) {
116
+ _logger.default.error('Parse.Cloud.httpRequest', 'multiple content-type headers are set.');
117
+ } // There maybe many, we'll just take the 1st one
118
+
119
+
120
+ var contentType = contentTypeKeys[0];
121
+
122
+ if (headers[contentType].match(/application\/json/i)) {
123
+ body = JSON.stringify(body);
124
+ } else if (headers[contentType].match(/application\/x-www-form-urlencoded/i)) {
125
+ body = _querystring.default.stringify(body);
126
+ }
127
+ }
128
+
129
+ return {
130
+ body,
131
+ headers
132
+ };
133
+ };
134
+
135
+ function httpRequest(options) {
136
+ let url;
137
+
138
+ try {
139
+ url = (0, _url.parse)(options.url);
140
+ } catch (e) {
141
+ return Promise.reject(e);
142
+ }
143
+
144
+ options = Object.assign(options, encodeBody(options)); // support params options
145
+
146
+ if (typeof options.params === 'object') {
147
+ options.qs = options.params;
148
+ } else if (typeof options.params === 'string') {
149
+ options.qs = _querystring.default.parse(options.params);
150
+ }
151
+
152
+ const client = clients[url.protocol];
153
+
154
+ if (!client) {
155
+ return Promise.reject(`Unsupported protocol ${url.protocol}`);
156
+ }
157
+
158
+ const requestOptions = {
159
+ method: options.method,
160
+ port: Number(url.port),
161
+ path: url.pathname,
162
+ hostname: url.hostname,
163
+ headers: options.headers,
164
+ encoding: null,
165
+ followRedirects: options.followRedirects === true
166
+ };
167
+
168
+ if (requestOptions.headers) {
169
+ Object.keys(requestOptions.headers).forEach(key => {
170
+ if (typeof requestOptions.headers[key] === 'undefined') {
171
+ delete requestOptions.headers[key];
172
+ }
173
+ });
174
+ }
175
+
176
+ if (url.search) {
177
+ options.qs = Object.assign({}, options.qs, _querystring.default.parse(url.query));
178
+ }
179
+
180
+ if (url.auth) {
181
+ requestOptions.auth = url.auth;
182
+ }
183
+
184
+ if (options.qs) {
185
+ requestOptions.path += `?${_querystring.default.stringify(options.qs)}`;
186
+ }
187
+
188
+ if (options.agent) {
189
+ requestOptions.agent = options.agent;
190
+ }
191
+
192
+ return new Promise((resolve, reject) => {
193
+ const req = client.request(requestOptions, makeCallback(resolve, reject, options));
194
+
195
+ if (options.body) {
196
+ req.write(options.body);
197
+ }
198
+
199
+ req.on('error', error => {
200
+ reject(error);
201
+ });
202
+ req.end();
203
+ });
204
+ }
205
+
206
+ module.exports = httpRequest;
207
+ module.exports.encodeBody = encodeBody;
208
+ module.exports.HTTPResponse = HTTPResponse;
209
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LmpzIl0sIm5hbWVzIjpbIkhUVFBSZXNwb25zZSIsImNvbnN0cnVjdG9yIiwicmVzcG9uc2UiLCJib2R5IiwiX3RleHQiLCJfZGF0YSIsInN0YXR1cyIsInN0YXR1c0NvZGUiLCJoZWFkZXJzIiwiY29va2llcyIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiYnVmZmVyIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldERhdGEiLCJwYXJzZSIsImUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsImVudW1lcmFibGUiLCJjbGllbnRzIiwiaHR0cCIsImh0dHBzIiwibWFrZUNhbGxiYWNrIiwicmVzb2x2ZSIsInJlamVjdCIsImNodW5rcyIsIm9uIiwiY2h1bmsiLCJwdXNoIiwiY29uY2F0IiwiaHR0cFJlc3BvbnNlIiwiZW5jb2RlQm9keSIsImNvbnRlbnRUeXBlS2V5cyIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJtYXRjaCIsImxlbmd0aCIsInF1ZXJ5c3RyaW5nIiwibG9nIiwiZXJyb3IiLCJjb250ZW50VHlwZSIsImh0dHBSZXF1ZXN0Iiwib3B0aW9ucyIsInVybCIsIlByb21pc2UiLCJhc3NpZ24iLCJwYXJhbXMiLCJxcyIsImNsaWVudCIsInByb3RvY29sIiwicmVxdWVzdE9wdGlvbnMiLCJtZXRob2QiLCJwb3J0IiwiTnVtYmVyIiwicGF0aCIsInBhdGhuYW1lIiwiaG9zdG5hbWUiLCJlbmNvZGluZyIsImZvbGxvd1JlZGlyZWN0cyIsImZvckVhY2giLCJzZWFyY2giLCJxdWVyeSIsImF1dGgiLCJhZ2VudCIsInJlcSIsInJlcXVlc3QiLCJ3cml0ZSIsImVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxZQUFOLENBQW1CO0FBQ2pCQyxFQUFBQSxXQUFXLENBQUNDLFFBQUQsRUFBV0MsSUFBWCxFQUFp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QUNZLElBQWYsR0FBc0JuQixHQUFHLENBQUNtQixJQUExQjtBQUNEOztBQUNELE1BQUlwQixPQUFPLENBQUNLLEVBQVosRUFBZ0I7QUFDZEcsSUFBQUEsY0FBYyxDQUFDSSxJQUFmLElBQXdCLElBQUdqQixxQkFBWTNCLFNBQVosQ0FBc0JnQyxPQUFPLENBQUNLLEVBQTlCLENBQWtDLEVBQTdEO0FBQ0Q7O0FBQ0QsTUFBSUwsT0FBTyxDQUFDcUIsS0FBWixFQUFtQjtBQUNqQmIsSUFBQUEsY0FBYyxDQUFDYSxLQUFmLEdBQXVCckIsT0FBTyxDQUFDcUIsS0FBL0I7QUFDRDs7QUFDRCxTQUFPLElBQUluQixPQUFKLENBQVksQ0FBQ3RCLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUN0QyxVQUFNeUMsR0FBRyxHQUFHaEIsTUFBTSxDQUFDaUIsT0FBUCxDQUFlZixjQUFmLEVBQStCN0IsWUFBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFBa0JtQixPQUFsQixDQUEzQyxDQUFaOztBQUNBLFFBQUlBLE9BQU8sQ0FBQzdDLElBQVosRUFBa0I7QUFDaEJtRSxNQUFBQSxHQUFHLENBQUNFLEtBQUosQ0FBVXhCLE9BQU8sQ0FBQzdDLElBQWxCO0FBQ0Q7O0FBQ0RtRSxJQUFBQSxHQUFHLENBQUN2QyxFQUFKLENBQU8sT0FBUCxFQUFnQmMsS0FBSyxJQUFJO0FBQ3ZCaEIsTUFBQUEsTUFBTSxDQUFDZ0IsS0FBRCxDQUFOO0FBQ0QsS0FGRDtBQUdBeUIsSUFBQUEsR0FBRyxDQUFDRyxHQUFKO0FBQ0QsR0FUTSxDQUFQO0FBVUQ7O0FBQ0RDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjVCLFdBQWpCO0FBQ0EyQixNQUFNLENBQUNDLE9BQVAsQ0FBZXZDLFVBQWYsR0FBNEJBLFVBQTVCO0FBQ0FzQyxNQUFNLENBQUNDLE9BQVAsQ0FBZTNFLFlBQWYsR0FBOEJBLFlBQTlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgaHR0cCwgaHR0cHMgfSBmcm9tICdmb2xsb3ctcmVkaXJlY3RzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAndXJsJztcblxuY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UsIGJvZHkpIHtcbiAgICBsZXQgX3RleHQsIF9kYXRhO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuY29va2llcyA9IHRoaXMuaGVhZGVyc1snc2V0LWNvb2tpZSddO1xuXG4gICAgaWYgKHR5cGVvZiBib2R5ID09ICdzdHJpbmcnKSB7XG4gICAgICBfdGV4dCA9IGJvZHk7XG4gICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gYm9keTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09ICdvYmplY3QnKSB7XG4gICAgICBfZGF0YSA9IGJvZHk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VGV4dCA9ICgpID0+IHtcbiAgICAgIGlmICghX3RleHQgJiYgdGhpcy5idWZmZXIpIHtcbiAgICAgICAgX3RleHQgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90ZXh0ICYmIF9kYXRhKSB7XG4gICAgICAgIF90ZXh0ID0gSlNPTi5zdHJpbmdpZnkoX2RhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90ZXh0O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXREYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKCFfZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9kYXRhID0gSlNPTi5wYXJzZShnZXRUZXh0KCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIF9kYXRhO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2JvZHknLCB7XG4gICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0Jywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZ2V0VGV4dCxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGF0YScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGdldERhdGEsXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgY2xpZW50cyA9IHtcbiAgJ2h0dHA6JzogaHR0cCxcbiAgJ2h0dHBzOic6IGh0dHBzLFxufTtcblxuZnVuY3Rpb24gbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfSk7XG4gICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gICAgICBjb25zdCBodHRwUmVzcG9uc2UgPSBuZXcgSFRUUFJlc3BvbnNlKHJlc3BvbnNlLCBib2R5KTtcblxuICAgICAgLy8gQ29uc2lkZXIgPDIwMCAmJiA+PSA0MDAgYXMgZXJyb3JzXG4gICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCBodHRwUmVzcG9uc2Uuc3RhdHVzID49IDQwMCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGh0dHBSZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShodHRwUmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3BvbnNlLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH07XG59XG5cbmNvbnN0IGVuY29kZUJvZHkgPSBmdW5jdGlvbiAoeyBib2R5LCBoZWFkZXJzID0ge30gfSkge1xuICBpZiAodHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgYm9keSwgaGVhZGVycyB9O1xuICB9XG4gIHZhciBjb250ZW50VHlwZUtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5maWx0ZXIoa2V5ID0+IHtcbiAgICByZXR1cm4ga2V5Lm1hdGNoKC9jb250ZW50LXR5cGUvaSkgIT0gbnVsbDtcbiAgfSk7XG5cbiAgaWYgKGNvbnRlbnRUeXBlS2V5cy5sZW5ndGggPT0gMCkge1xuICAgIC8vIG5vIGNvbnRlbnQgdHlwZVxuICAgIC8vICBBcyBwZXIgaHR0cHM6Ly9wYXJzZS5jb20vZG9jcy9jbG91ZGNvZGUvZ3VpZGUjY2xvdWQtY29kZS1hZHZhbmNlZC1zZW5kaW5nLWEtcG9zdC1yZXF1ZXN0IHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIHN1cHBvc2VkbHkgeC13d3ctZm9ybS11cmxlbmNvZGVkXG5cbiAgICBib2R5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGJvZHkpO1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gIH0gZWxzZSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoY29udGVudFR5cGVLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZy5lcnJvcignUGFyc2UuQ2xvdWQuaHR0cFJlcXVlc3QnLCAnbXVsdGlwbGUgY29udGVudC10eXBlIGhlYWRlcnMgYXJlIHNldC4nKTtcbiAgICB9XG4gICAgLy8gVGhlcmUgbWF5YmUgbWFueSwgd2UnbGwganVzdCB0YWtlIHRoZSAxc3Qgb25lXG4gICAgdmFyIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVLZXlzWzBdO1xuICAgIGlmIChoZWFkZXJzW2NvbnRlbnRUeXBlXS5tYXRjaCgvYXBwbGljYXRpb25cXC9qc29uL2kpKSB7XG4gICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzW2NvbnRlbnRUeXBlXS5tYXRjaCgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvaSkpIHtcbiAgICAgIGJvZHkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoYm9keSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGJvZHksIGhlYWRlcnMgfTtcbn07XG5cbmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgbGV0IHVybDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBwYXJzZShvcHRpb25zLnVybCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gIH1cbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywgZW5jb2RlQm9keShvcHRpb25zKSk7XG4gIC8vIHN1cHBvcnQgcGFyYW1zIG9wdGlvbnNcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zLnFzID0gb3B0aW9ucy5wYXJhbXM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMucXMgPSBxdWVyeXN0cmluZy5wYXJzZShvcHRpb25zLnBhcmFtcyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gY2xpZW50c1t1cmwucHJvdG9jb2xdO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJHt1cmwucHJvdG9jb2x9YCk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICBwb3J0OiBOdW1iZXIodXJsLnBvcnQpLFxuICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICBlbmNvZGluZzogbnVsbCxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IG9wdGlvbnMuZm9sbG93UmVkaXJlY3RzID09PSB0cnVlLFxuICB9O1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgIE9iamVjdC5rZXlzKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWxldGUgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmICh1cmwuc2VhcmNoKSB7XG4gICAgb3B0aW9ucy5xcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucXMsIHF1ZXJ5c3RyaW5nLnBhcnNlKHVybC5xdWVyeSkpO1xuICB9XG4gIGlmICh1cmwuYXV0aCkge1xuICAgIHJlcXVlc3RPcHRpb25zLmF1dGggPSB1cmwuYXV0aDtcbiAgfVxuICBpZiAob3B0aW9ucy5xcykge1xuICAgIHJlcXVlc3RPcHRpb25zLnBhdGggKz0gYD8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeShvcHRpb25zLnFzKX1gO1xuICB9XG4gIGlmIChvcHRpb25zLmFnZW50KSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuYWdlbnQgPSBvcHRpb25zLmFnZW50O1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gY2xpZW50LnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QsIG9wdGlvbnMpKTtcbiAgICBpZiAob3B0aW9ucy5ib2R5KSB7XG4gICAgICByZXEud3JpdGUob3B0aW9ucy5ib2R5KTtcbiAgICB9XG4gICAgcmVxLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgcmVxLmVuZCgpO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaHR0cFJlcXVlc3Q7XG5tb2R1bGUuZXhwb3J0cy5lbmNvZGVCb2R5ID0gZW5jb2RlQm9keTtcbm1vZHVsZS5leHBvcnRzLkhUVFBSZXNwb25zZSA9IEhUVFBSZXNwb25zZTtcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parse-server",
3
- "version": "5.4.0-beta.1",
3
+ "version": "6.0.0-alpha.10",
4
4
  "description": "An express module providing a Parse-compatible API server",
5
5
  "main": "lib/index.js",
6
6
  "repository": {
@@ -19,10 +19,10 @@
19
19
  ],
20
20
  "license": "BSD-3-Clause",
21
21
  "dependencies": {
22
- "@graphql-yoga/node": "2.6.0",
23
- "@graphql-tools/utils": "8.12.0",
24
22
  "@graphql-tools/merge": "8.3.6",
25
23
  "@graphql-tools/schema": "9.0.4",
24
+ "@graphql-tools/utils": "8.12.0",
25
+ "@graphql-yoga/node": "2.6.0",
26
26
  "@parse/fs-files-adapter": "1.2.2",
27
27
  "@parse/push-adapter": "4.1.2",
28
28
  "bcryptjs": "2.4.3",
@@ -30,15 +30,16 @@
30
30
  "commander": "5.1.0",
31
31
  "cors": "2.8.5",
32
32
  "deepcopy": "2.1.0",
33
- "express": "4.18.1",
33
+ "express": "4.18.2",
34
34
  "follow-redirects": "1.15.2",
35
35
  "graphql": "16.6.0",
36
36
  "graphql-list-fields": "2.0.2",
37
- "graphql-tag": "2.12.6",
38
37
  "graphql-relay": "0.10.0",
38
+ "graphql-tag": "2.12.6",
39
39
  "intersect": "1.0.1",
40
+ "ip-range-check": "0.2.0",
40
41
  "jsonwebtoken": "8.5.1",
41
- "jwks-rsa": "2.1.4",
42
+ "jwks-rsa": "2.1.5",
42
43
  "ldapjs": "2.3.3",
43
44
  "lodash": "4.17.21",
44
45
  "lru-cache": "7.12.0",
@@ -47,9 +48,9 @@
47
48
  "mustache": "4.2.0",
48
49
  "parse": "3.4.2",
49
50
  "pg-monitor": "1.5.0",
50
- "pg-promise": "10.12.0",
51
+ "pg-promise": "10.12.1",
51
52
  "pluralize": "8.0.0",
52
- "redis": "3.1.2",
53
+ "redis": "4.0.6",
53
54
  "semver": "7.3.8",
54
55
  "subscriptions-transport-ws": "0.11.0",
55
56
  "tv4": "1.3.0",
@@ -59,7 +60,6 @@
59
60
  "ws": "8.9.0"
60
61
  },
61
62
  "devDependencies": {
62
- "graphql-tag": "2.12.6",
63
63
  "@actions/core": "1.9.1",
64
64
  "@apollo/client": "3.6.1",
65
65
  "@babel/cli": "7.10.0",
@@ -86,6 +86,7 @@
86
86
  "eslint-plugin-flowtype": "5.1.3",
87
87
  "flow-bin": "0.119.1",
88
88
  "form-data": "3.0.0",
89
+ "graphql-tag": "2.12.6",
89
90
  "husky": "4.3.8",
90
91
  "jasmine": "3.5.0",
91
92
  "jasmine-spec-reporter": "7.0.0",
@@ -112,20 +113,19 @@
112
113
  "lint-fix": "eslint --fix --cache ./",
113
114
  "build": "babel src/ -d lib/ --copy-files",
114
115
  "watch": "babel --watch src/ -d lib/ --copy-files",
115
- "test:mongodb:runnerstart": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
116
- "test:mongodb:testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
116
+ "test:mongodb:runnerstart": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} mongodb-runner start",
117
+ "test:mongodb:testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} TESTING=1 jasmine",
117
118
  "test:mongodb": "npm run test:mongodb:runnerstart --dbversion=$npm_config_dbversion && npm run test:mongodb:testonly --dbversion=$npm_config_dbversion",
118
- "test:mongodb:4.0.28": "npm run test:mongodb --dbversion=4.0.28",
119
119
  "test:mongodb:4.2.19": "npm run test:mongodb --dbversion=4.2.19",
120
120
  "test:mongodb:4.4.13": "npm run test:mongodb --dbversion=4.4.13",
121
121
  "test:mongodb:5.3.2": "npm run test:mongodb --dbversion=5.3.2",
122
122
  "test:mongodb:6.0.2": "npm run test:mongodb --dbversion=6.0.2",
123
123
  "posttest:mongodb": "mongodb-runner stop",
124
- "pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
125
- "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
124
+ "pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} mongodb-runner start",
125
+ "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} TESTING=1 jasmine",
126
126
  "test": "npm run testonly",
127
- "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner stop",
128
- "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 nyc jasmine",
127
+ "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} mongodb-runner stop",
128
+ "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=5.3.2} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} TESTING=1 nyc jasmine",
129
129
  "start": "node ./bin/parse-server",
130
130
  "prettier": "prettier --write {src,spec}/{**/*,*}.js",
131
131
  "prepare": "npm run build",
@@ -133,7 +133,7 @@
133
133
  "madge:circular": "node_modules/.bin/madge ./src --circular"
134
134
  },
135
135
  "engines": {
136
- "node": ">=12.22.10 <19"
136
+ "node": ">=14.21.0 <17 || >=18 <19"
137
137
  },
138
138
  "bin": {
139
139
  "parse-server": "bin/parse-server"
@@ -1,73 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- /**
9
- * @typedef Parse.Cloud.HTTPResponse
10
- * @property {Buffer} buffer The raw byte representation of the response body. Use this to receive binary data. See Buffer for more details.
11
- * @property {Object} cookies The cookies sent by the server. The keys in this object are the names of the cookies. The values are Parse.Cloud.Cookie objects.
12
- * @property {Object} data The parsed response body as a JavaScript object. This is only available when the response Content-Type is application/x-www-form-urlencoded or application/json.
13
- * @property {Object} headers The headers sent by the server. The keys in this object are the names of the headers. We do not support multiple response headers with the same name. In the common case of Set-Cookie headers, please use the cookies field instead.
14
- * @property {Number} status The status code.
15
- * @property {String} text The raw text representation of the response body.
16
- */
17
- class HTTPResponse {
18
- constructor(response, body) {
19
- let _text, _data;
20
-
21
- this.status = response.statusCode;
22
- this.headers = response.headers || {};
23
- this.cookies = this.headers['set-cookie'];
24
-
25
- if (typeof body == 'string') {
26
- _text = body;
27
- } else if (Buffer.isBuffer(body)) {
28
- this.buffer = body;
29
- } else if (typeof body == 'object') {
30
- _data = body;
31
- }
32
-
33
- const getText = () => {
34
- if (!_text && this.buffer) {
35
- _text = this.buffer.toString('utf-8');
36
- } else if (!_text && _data) {
37
- _text = JSON.stringify(_data);
38
- }
39
-
40
- return _text;
41
- };
42
-
43
- const getData = () => {
44
- if (!_data) {
45
- try {
46
- _data = JSON.parse(getText());
47
- } catch (e) {
48
- /* */
49
- }
50
- }
51
-
52
- return _data;
53
- };
54
-
55
- Object.defineProperty(this, 'body', {
56
- get: () => {
57
- return body;
58
- }
59
- });
60
- Object.defineProperty(this, 'text', {
61
- enumerable: true,
62
- get: getText
63
- });
64
- Object.defineProperty(this, 'data', {
65
- enumerable: true,
66
- get: getData
67
- });
68
- }
69
-
70
- }
71
-
72
- exports.default = HTTPResponse;
73
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbG91ZC1jb2RlL0hUVFBSZXNwb25zZS5qcyJdLCJuYW1lcyI6WyJIVFRQUmVzcG9uc2UiLCJjb25zdHJ1Y3RvciIsInJlc3BvbnNlIiwiYm9keSIsIl90ZXh0IiwiX2RhdGEiLCJzdGF0dXMiLCJzdGF0dXNDb2RlIiwiaGVhZGVycyIsImNvb2tpZXMiLCJCdWZmZXIiLCJpc0J1ZmZlciIsImJ1ZmZlciIsImdldFRleHQiLCJ0b1N0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREYXRhIiwicGFyc2UiLCJlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJlbnVtZXJhYmxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUEsWUFBTixDQUFtQjtBQUNoQ0MsRUFBQUEsV0FBVyxDQUFDQyxRQUFELEVBQVdDLElBQVgsRUFBaUI7QUFDMUIsUUFBSUMsS0FBSixFQUFXQyxLQUFYOztBQUNBLFNBQUtDLE1BQUwsR0FBY0osUUFBUSxDQUFDSyxVQUF2QjtBQUNBLFNBQUtDLE9BQUwsR0FBZU4sUUFBUSxDQUFDTSxPQUFULElBQW9CLEVBQW5DO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLEtBQUtELE9BQUwsQ0FBYSxZQUFiLENBQWY7O0FBRUEsUUFBSSxPQUFPTCxJQUFQLElBQWUsUUFBbkIsRUFBNkI7QUFDM0JDLE1BQUFBLEtBQUssR0FBR0QsSUFBUjtBQUNELEtBRkQsTUFFTyxJQUFJTyxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JSLElBQWhCLENBQUosRUFBMkI7QUFDaEMsV0FBS1MsTUFBTCxHQUFjVCxJQUFkO0FBQ0QsS0FGTSxNQUVBLElBQUksT0FBT0EsSUFBUCxJQUFlLFFBQW5CLEVBQTZCO0FBQ2xDRSxNQUFBQSxLQUFLLEdBQUdGLElBQVI7QUFDRDs7QUFFRCxVQUFNVSxPQUFPLEdBQUcsTUFBTTtBQUNwQixVQUFJLENBQUNULEtBQUQsSUFBVSxLQUFLUSxNQUFuQixFQUEyQjtBQUN6QlIsUUFBQUEsS0FBSyxHQUFHLEtBQUtRLE1BQUwsQ0FBWUUsUUFBWixDQUFxQixPQUFyQixDQUFSO0FBQ0QsT0FGRCxNQUVPLElBQUksQ0FBQ1YsS0FBRCxJQUFVQyxLQUFkLEVBQXFCO0FBQzFCRCxRQUFBQSxLQUFLLEdBQUdXLElBQUksQ0FBQ0MsU0FBTCxDQUFlWCxLQUFmLENBQVI7QUFDRDs7QUFDRCxhQUFPRCxLQUFQO0FBQ0QsS0FQRDs7QUFTQSxVQUFNYSxPQUFPLEdBQUcsTUFBTTtBQUNwQixVQUFJLENBQUNaLEtBQUwsRUFBWTtBQUNWLFlBQUk7QUFDRkEsVUFBQUEsS0FBSyxHQUFHVSxJQUFJLENBQUNHLEtBQUwsQ0FBV0wsT0FBTyxFQUFsQixDQUFSO0FBQ0QsU0FGRCxDQUVFLE9BQU9NLENBQVAsRUFBVTtBQUNWO0FBQ0Q7QUFDRjs7QUFDRCxhQUFPZCxLQUFQO0FBQ0QsS0FURDs7QUFXQWUsSUFBQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCLElBQXRCLEVBQTRCLE1BQTVCLEVBQW9DO0FBQ2xDQyxNQUFBQSxHQUFHLEVBQUUsTUFBTTtBQUNULGVBQU9uQixJQUFQO0FBQ0Q7QUFIaUMsS0FBcEM7QUFNQWlCLElBQUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQixJQUF0QixFQUE0QixNQUE1QixFQUFvQztBQUNsQ0UsTUFBQUEsVUFBVSxFQUFFLElBRHNCO0FBRWxDRCxNQUFBQSxHQUFHLEVBQUVUO0FBRjZCLEtBQXBDO0FBS0FPLElBQUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQixJQUF0QixFQUE0QixNQUE1QixFQUFvQztBQUNsQ0UsTUFBQUEsVUFBVSxFQUFFLElBRHNCO0FBRWxDRCxNQUFBQSxHQUFHLEVBQUVMO0FBRjZCLEtBQXBDO0FBSUQ7O0FBbEQrQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHR5cGVkZWYgUGFyc2UuQ2xvdWQuSFRUUFJlc3BvbnNlXG4gKiBAcHJvcGVydHkge0J1ZmZlcn0gYnVmZmVyIFRoZSByYXcgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzcG9uc2UgYm9keS4gVXNlIHRoaXMgdG8gcmVjZWl2ZSBiaW5hcnkgZGF0YS4gU2VlIEJ1ZmZlciBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGNvb2tpZXMgVGhlIGNvb2tpZXMgc2VudCBieSB0aGUgc2VydmVyLiBUaGUga2V5cyBpbiB0aGlzIG9iamVjdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSBjb29raWVzLiBUaGUgdmFsdWVzIGFyZSBQYXJzZS5DbG91ZC5Db29raWUgb2JqZWN0cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhIFRoZSBwYXJzZWQgcmVzcG9uc2UgYm9keSBhcyBhIEphdmFTY3JpcHQgb2JqZWN0LiBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIHJlc3BvbnNlIENvbnRlbnQtVHlwZSBpcyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb3IgYXBwbGljYXRpb24vanNvbi5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBoZWFkZXJzIFRoZSBoZWFkZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4gVGhlIGtleXMgaW4gdGhpcyBvYmplY3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVycy4gV2UgZG8gbm90IHN1cHBvcnQgbXVsdGlwbGUgcmVzcG9uc2UgaGVhZGVycyB3aXRoIHRoZSBzYW1lIG5hbWUuIEluIHRoZSBjb21tb24gY2FzZSBvZiBTZXQtQ29va2llIGhlYWRlcnMsIHBsZWFzZSB1c2UgdGhlIGNvb2tpZXMgZmllbGQgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzdGF0dXMgVGhlIHN0YXR1cyBjb2RlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRleHQgVGhlIHJhdyB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXNwb25zZSBib2R5LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVFRQUmVzcG9uc2Uge1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSwgYm9keSkge1xuICAgIGxldCBfdGV4dCwgX2RhdGE7XG4gICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNDb2RlO1xuICAgIHRoaXMuaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnMgfHwge307XG4gICAgdGhpcy5jb29raWVzID0gdGhpcy5oZWFkZXJzWydzZXQtY29va2llJ107XG5cbiAgICBpZiAodHlwZW9mIGJvZHkgPT0gJ3N0cmluZycpIHtcbiAgICAgIF90ZXh0ID0gYm9keTtcbiAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgdGhpcy5idWZmZXIgPSBib2R5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT0gJ29iamVjdCcpIHtcbiAgICAgIF9kYXRhID0gYm9keTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRUZXh0ID0gKCkgPT4ge1xuICAgICAgaWYgKCFfdGV4dCAmJiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICBfdGV4dCA9IHRoaXMuYnVmZmVyLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgfSBlbHNlIGlmICghX3RleHQgJiYgX2RhdGEpIHtcbiAgICAgICAgX3RleHQgPSBKU09OLnN0cmluZ2lmeShfZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RleHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldERhdGEgPSAoKSA9PiB7XG4gICAgICBpZiAoIV9kYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX2RhdGEgPSBKU09OLnBhcnNlKGdldFRleHQoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvKiAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gX2RhdGE7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYm9keScsIHtcbiAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RleHQnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBnZXRUZXh0LFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkYXRhJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZ2V0RGF0YSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,192 +0,0 @@
1
- "use strict";
2
-
3
- var _HTTPResponse = _interopRequireDefault(require("./HTTPResponse"));
4
-
5
- var _querystring = _interopRequireDefault(require("querystring"));
6
-
7
- var _logger = _interopRequireDefault(require("../logger"));
8
-
9
- var _followRedirects = require("follow-redirects");
10
-
11
- var _url = require("url");
12
-
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
- const clients = {
16
- 'http:': _followRedirects.http,
17
- 'https:': _followRedirects.https
18
- };
19
-
20
- function makeCallback(resolve, reject) {
21
- return function (response) {
22
- const chunks = [];
23
- response.on('data', chunk => {
24
- chunks.push(chunk);
25
- });
26
- response.on('end', () => {
27
- const body = Buffer.concat(chunks);
28
- const httpResponse = new _HTTPResponse.default(response, body); // Consider <200 && >= 400 as errors
29
-
30
- if (httpResponse.status < 200 || httpResponse.status >= 400) {
31
- return reject(httpResponse);
32
- } else {
33
- return resolve(httpResponse);
34
- }
35
- });
36
- response.on('error', reject);
37
- };
38
- }
39
-
40
- const encodeBody = function ({
41
- body,
42
- headers = {}
43
- }) {
44
- if (typeof body !== 'object') {
45
- return {
46
- body,
47
- headers
48
- };
49
- }
50
-
51
- var contentTypeKeys = Object.keys(headers).filter(key => {
52
- return key.match(/content-type/i) != null;
53
- });
54
-
55
- if (contentTypeKeys.length == 0) {
56
- // no content type
57
- // As per https://parse.com/docs/cloudcode/guide#cloud-code-advanced-sending-a-post-request the default encoding is supposedly x-www-form-urlencoded
58
- body = _querystring.default.stringify(body);
59
- headers['Content-Type'] = 'application/x-www-form-urlencoded';
60
- } else {
61
- /* istanbul ignore next */
62
- if (contentTypeKeys.length > 1) {
63
- _logger.default.error('Parse.Cloud.httpRequest', 'multiple content-type headers are set.');
64
- } // There maybe many, we'll just take the 1st one
65
-
66
-
67
- var contentType = contentTypeKeys[0];
68
-
69
- if (headers[contentType].match(/application\/json/i)) {
70
- body = JSON.stringify(body);
71
- } else if (headers[contentType].match(/application\/x-www-form-urlencoded/i)) {
72
- body = _querystring.default.stringify(body);
73
- }
74
- }
75
-
76
- return {
77
- body,
78
- headers
79
- };
80
- };
81
- /**
82
- * Makes an HTTP Request.
83
- *
84
- * **Available in Cloud Code only.**
85
- *
86
- * By default, Parse.Cloud.httpRequest does not follow redirects caused by HTTP 3xx response codes. You can use the followRedirects option in the {@link Parse.Cloud.HTTPOptions} object to change this behavior.
87
- *
88
- * Sample request:
89
- * ```
90
- * Parse.Cloud.httpRequest({
91
- * url: 'http://www.parse.com/'
92
- * }).then(function(httpResponse) {
93
- * // success
94
- * console.log(httpResponse.text);
95
- * },function(httpResponse) {
96
- * // error
97
- * console.error('Request failed with response code ' + httpResponse.status);
98
- * });
99
- * ```
100
- *
101
- * @method httpRequest
102
- * @name Parse.Cloud.httpRequest
103
- * @param {Parse.Cloud.HTTPOptions} options The Parse.Cloud.HTTPOptions object that makes the request.
104
- * @return {Promise<Parse.Cloud.HTTPResponse>} A promise that will be resolved with a {@link Parse.Cloud.HTTPResponse} object when the request completes.
105
- */
106
-
107
-
108
- module.exports = function httpRequest(options) {
109
- let url;
110
-
111
- try {
112
- url = (0, _url.parse)(options.url);
113
- } catch (e) {
114
- return Promise.reject(e);
115
- }
116
-
117
- options = Object.assign(options, encodeBody(options)); // support params options
118
-
119
- if (typeof options.params === 'object') {
120
- options.qs = options.params;
121
- } else if (typeof options.params === 'string') {
122
- options.qs = _querystring.default.parse(options.params);
123
- }
124
-
125
- const client = clients[url.protocol];
126
-
127
- if (!client) {
128
- return Promise.reject(`Unsupported protocol ${url.protocol}`);
129
- }
130
-
131
- const requestOptions = {
132
- method: options.method,
133
- port: Number(url.port),
134
- path: url.pathname,
135
- hostname: url.hostname,
136
- headers: options.headers,
137
- encoding: null,
138
- followRedirects: options.followRedirects === true
139
- };
140
-
141
- if (requestOptions.headers) {
142
- Object.keys(requestOptions.headers).forEach(key => {
143
- if (typeof requestOptions.headers[key] === 'undefined') {
144
- delete requestOptions.headers[key];
145
- }
146
- });
147
- }
148
-
149
- if (url.search) {
150
- options.qs = Object.assign({}, options.qs, _querystring.default.parse(url.query));
151
- }
152
-
153
- if (url.auth) {
154
- requestOptions.auth = url.auth;
155
- }
156
-
157
- if (options.qs) {
158
- requestOptions.path += `?${_querystring.default.stringify(options.qs)}`;
159
- }
160
-
161
- if (options.agent) {
162
- requestOptions.agent = options.agent;
163
- }
164
-
165
- return new Promise((resolve, reject) => {
166
- const req = client.request(requestOptions, makeCallback(resolve, reject, options));
167
-
168
- if (options.body) {
169
- req.write(options.body);
170
- }
171
-
172
- req.on('error', error => {
173
- reject(error);
174
- });
175
- req.end();
176
- });
177
- };
178
- /**
179
- * @typedef Parse.Cloud.HTTPOptions
180
- * @property {String|Object} body The body of the request. If it is a JSON object, then the Content-Type set in the headers must be application/x-www-form-urlencoded or application/json. You can also set this to a {@link Buffer} object to send raw bytes. If you use a Buffer, you should also set the Content-Type header explicitly to describe what these bytes represent.
181
- * @property {function} error The function that is called when the request fails. It will be passed a Parse.Cloud.HTTPResponse object.
182
- * @property {Boolean} followRedirects Whether to follow redirects caused by HTTP 3xx responses. Defaults to false.
183
- * @property {Object} headers The headers for the request.
184
- * @property {String} method The method of the request. GET, POST, PUT, DELETE, HEAD, and OPTIONS are supported. Will default to GET if not specified.
185
- * @property {String|Object} params The query portion of the url. You can pass a JSON object of key value pairs like params: {q : 'Sean Plott'} or a raw string like params:q=Sean Plott.
186
- * @property {function} success The function that is called when the request successfully completes. It will be passed a Parse.Cloud.HTTPResponse object.
187
- * @property {string} url The url to send the request to.
188
- */
189
-
190
-
191
- module.exports.encodeBody = encodeBody;
192
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbG91ZC1jb2RlL2h0dHBSZXF1ZXN0LmpzIl0sIm5hbWVzIjpbImNsaWVudHMiLCJodHRwIiwiaHR0cHMiLCJtYWtlQ2FsbGJhY2siLCJyZXNvbHZlIiwicmVqZWN0IiwicmVzcG9uc2UiLCJjaHVua3MiLCJvbiIsImNodW5rIiwicHVzaCIsImJvZHkiLCJCdWZmZXIiLCJjb25jYXQiLCJodHRwUmVzcG9uc2UiLCJIVFRQUmVzcG9uc2UiLCJzdGF0dXMiLCJlbmNvZGVCb2R5IiwiaGVhZGVycyIsImNvbnRlbnRUeXBlS2V5cyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJtYXRjaCIsImxlbmd0aCIsInF1ZXJ5c3RyaW5nIiwic3RyaW5naWZ5IiwibG9nIiwiZXJyb3IiLCJjb250ZW50VHlwZSIsIkpTT04iLCJtb2R1bGUiLCJleHBvcnRzIiwiaHR0cFJlcXVlc3QiLCJvcHRpb25zIiwidXJsIiwiZSIsIlByb21pc2UiLCJhc3NpZ24iLCJwYXJhbXMiLCJxcyIsInBhcnNlIiwiY2xpZW50IiwicHJvdG9jb2wiLCJyZXF1ZXN0T3B0aW9ucyIsIm1ldGhvZCIsInBvcnQiLCJOdW1iZXIiLCJwYXRoIiwicGF0aG5hbWUiLCJob3N0bmFtZSIsImVuY29kaW5nIiwiZm9sbG93UmVkaXJlY3RzIiwiZm9yRWFjaCIsInNlYXJjaCIsInF1ZXJ5IiwiYXV0aCIsImFnZW50IiwicmVxIiwicmVxdWVzdCIsIndyaXRlIiwiZW5kIl0sIm1hcHBpbmdzIjoiOztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsT0FBTyxHQUFHO0FBQ2QsV0FBU0MscUJBREs7QUFFZCxZQUFVQztBQUZJLENBQWhCOztBQUtBLFNBQVNDLFlBQVQsQ0FBc0JDLE9BQXRCLEVBQStCQyxNQUEvQixFQUF1QztBQUNyQyxTQUFPLFVBQVVDLFFBQVYsRUFBb0I7QUFDekIsVUFBTUMsTUFBTSxHQUFHLEVBQWY7QUFDQUQsSUFBQUEsUUFBUSxD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M0MsQ0FBWjs7QUFDQSxRQUFJQSxPQUFPLENBQUN4QixJQUFaLEVBQWtCO0FBQ2hCZ0QsTUFBQUEsR0FBRyxDQUFDRSxLQUFKLENBQVUxQixPQUFPLENBQUN4QixJQUFsQjtBQUNEOztBQUNEZ0QsSUFBQUEsR0FBRyxDQUFDbkQsRUFBSixDQUFPLE9BQVAsRUFBZ0JxQixLQUFLLElBQUk7QUFDdkJ4QixNQUFBQSxNQUFNLENBQUN3QixLQUFELENBQU47QUFDRCxLQUZEO0FBR0E4QixJQUFBQSxHQUFHLENBQUNHLEdBQUo7QUFDRCxHQVRNLENBQVA7QUFVRCxDQXhERDtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTlCLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlaEIsVUFBZixHQUE0QkEsVUFBNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSFRUUFJlc3BvbnNlIGZyb20gJy4vSFRUUFJlc3BvbnNlJztcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBodHRwLCBodHRwcyB9IGZyb20gJ2ZvbGxvdy1yZWRpcmVjdHMnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICd1cmwnO1xuXG5jb25zdCBjbGllbnRzID0ge1xuICAnaHR0cDonOiBodHRwLFxuICAnaHR0cHM6JzogaHR0cHMsXG59O1xuXG5mdW5jdGlvbiBtYWtlQ2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICByZXNwb25zZS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICB9KTtcbiAgICByZXNwb25zZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZSA9IG5ldyBIVFRQUmVzcG9uc2UocmVzcG9uc2UsIGJvZHkpO1xuXG4gICAgICAvLyBDb25zaWRlciA8MjAwICYmID49IDQwMCBhcyBlcnJvcnNcbiAgICAgIGlmIChodHRwUmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IGh0dHBSZXNwb25zZS5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoaHR0cFJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGh0dHBSZXNwb25zZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzcG9uc2Uub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfTtcbn1cblxuY29uc3QgZW5jb2RlQm9keSA9IGZ1bmN0aW9uICh7IGJvZHksIGhlYWRlcnMgPSB7fSB9KSB7XG4gIGlmICh0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBib2R5LCBoZWFkZXJzIH07XG4gIH1cbiAgdmFyIGNvbnRlbnRUeXBlS2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLmZpbHRlcihrZXkgPT4ge1xuICAgIHJldHVybiBrZXkubWF0Y2goL2NvbnRlbnQtdHlwZS9pKSAhPSBudWxsO1xuICB9KTtcblxuICBpZiAoY29udGVudFR5cGVLZXlzLmxlbmd0aCA9PSAwKSB7XG4gICAgLy8gbm8gY29udGVudCB0eXBlXG4gICAgLy8gIEFzIHBlciBodHRwczovL3BhcnNlLmNvbS9kb2NzL2Nsb3VkY29kZS9ndWlkZSNjbG91ZC1jb2RlLWFkdmFuY2VkLXNlbmRpbmctYS1wb3N0LXJlcXVlc3QgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgc3VwcG9zZWRseSB4LXd3dy1mb3JtLXVybGVuY29kZWRcblxuICAgIGJvZHkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoYm9keSk7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJztcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChjb250ZW50VHlwZUtleXMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nLmVycm9yKCdQYXJzZS5DbG91ZC5odHRwUmVxdWVzdCcsICdtdWx0aXBsZSBjb250ZW50LXR5cGUgaGVhZGVycyBhcmUgc2V0LicpO1xuICAgIH1cbiAgICAvLyBUaGVyZSBtYXliZSBtYW55LCB3ZSdsbCBqdXN0IHRha2UgdGhlIDFzdCBvbmVcbiAgICB2YXIgY29udGVudFR5cGUgPSBjb250ZW50VHlwZUtleXNbMF07XG4gICAgaWYgKGhlYWRlcnNbY29udGVudFR5cGVdLm1hdGNoKC9hcHBsaWNhdGlvblxcL2pzb24vaSkpIHtcbiAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICB9IGVsc2UgaWYgKGhlYWRlcnNbY29udGVudFR5cGVdLm1hdGNoKC9hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC9pKSkge1xuICAgICAgYm9keSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShib2R5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgYm9keSwgaGVhZGVycyB9O1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbiBIVFRQIFJlcXVlc3QuXG4gKlxuICogKipBdmFpbGFibGUgaW4gQ2xvdWQgQ29kZSBvbmx5LioqXG4gKlxuICogQnkgZGVmYXVsdCwgUGFyc2UuQ2xvdWQuaHR0cFJlcXVlc3QgZG9lcyBub3QgZm9sbG93IHJlZGlyZWN0cyBjYXVzZWQgYnkgSFRUUCAzeHggcmVzcG9uc2UgY29kZXMuIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dSZWRpcmVjdHMgb3B0aW9uIGluIHRoZSB7QGxpbmsgUGFyc2UuQ2xvdWQuSFRUUE9wdGlvbnN9IG9iamVjdCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvci5cbiAqXG4gKiBTYW1wbGUgcmVxdWVzdDpcbiAqIGBgYFxuICogUGFyc2UuQ2xvdWQuaHR0cFJlcXVlc3Qoe1xuICogICB1cmw6ICdodHRwOi8vd3d3LnBhcnNlLmNvbS8nXG4gKiB9KS50aGVuKGZ1bmN0aW9uKGh0dHBSZXNwb25zZSkge1xuICogICAvLyBzdWNjZXNzXG4gKiAgIGNvbnNvbGUubG9nKGh0dHBSZXNwb25zZS50ZXh0KTtcbiAqIH0sZnVuY3Rpb24oaHR0cFJlc3BvbnNlKSB7XG4gKiAgIC8vIGVycm9yXG4gKiAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVlc3QgZmFpbGVkIHdpdGggcmVzcG9uc2UgY29kZSAnICsgaHR0cFJlc3BvbnNlLnN0YXR1cyk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBtZXRob2QgaHR0cFJlcXVlc3RcbiAqIEBuYW1lIFBhcnNlLkNsb3VkLmh0dHBSZXF1ZXN0XG4gKiBAcGFyYW0ge1BhcnNlLkNsb3VkLkhUVFBPcHRpb25zfSBvcHRpb25zIFRoZSBQYXJzZS5DbG91ZC5IVFRQT3B0aW9ucyBvYmplY3QgdGhhdCBtYWtlcyB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8UGFyc2UuQ2xvdWQuSFRUUFJlc3BvbnNlPn0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIGEge0BsaW5rIFBhcnNlLkNsb3VkLkhUVFBSZXNwb25zZX0gb2JqZWN0IHdoZW4gdGhlIHJlcXVlc3QgY29tcGxldGVzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGh0dHBSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgbGV0IHVybDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBwYXJzZShvcHRpb25zLnVybCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gIH1cbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywgZW5jb2RlQm9keShvcHRpb25zKSk7XG4gIC8vIHN1cHBvcnQgcGFyYW1zIG9wdGlvbnNcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zLnFzID0gb3B0aW9ucy5wYXJhbXM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMucXMgPSBxdWVyeXN0cmluZy5wYXJzZShvcHRpb25zLnBhcmFtcyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gY2xpZW50c1t1cmwucHJvdG9jb2xdO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJHt1cmwucHJvdG9jb2x9YCk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICBwb3J0OiBOdW1iZXIodXJsLnBvcnQpLFxuICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICBlbmNvZGluZzogbnVsbCxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IG9wdGlvbnMuZm9sbG93UmVkaXJlY3RzID09PSB0cnVlLFxuICB9O1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgIE9iamVjdC5rZXlzKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWxldGUgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmICh1cmwuc2VhcmNoKSB7XG4gICAgb3B0aW9ucy5xcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucXMsIHF1ZXJ5c3RyaW5nLnBhcnNlKHVybC5xdWVyeSkpO1xuICB9XG4gIGlmICh1cmwuYXV0aCkge1xuICAgIHJlcXVlc3RPcHRpb25zLmF1dGggPSB1cmwuYXV0aDtcbiAgfVxuICBpZiAob3B0aW9ucy5xcykge1xuICAgIHJlcXVlc3RPcHRpb25zLnBhdGggKz0gYD8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeShvcHRpb25zLnFzKX1gO1xuICB9XG4gIGlmIChvcHRpb25zLmFnZW50KSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuYWdlbnQgPSBvcHRpb25zLmFnZW50O1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gY2xpZW50LnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QsIG9wdGlvbnMpKTtcbiAgICBpZiAob3B0aW9ucy5ib2R5KSB7XG4gICAgICByZXEud3JpdGUob3B0aW9ucy5ib2R5KTtcbiAgICB9XG4gICAgcmVxLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgcmVxLmVuZCgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgUGFyc2UuQ2xvdWQuSFRUUE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gYm9keSBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdC4gSWYgaXQgaXMgYSBKU09OIG9iamVjdCwgdGhlbiB0aGUgQ29udGVudC1UeXBlIHNldCBpbiB0aGUgaGVhZGVycyBtdXN0IGJlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvciBhcHBsaWNhdGlvbi9qc29uLiBZb3UgY2FuIGFsc28gc2V0IHRoaXMgdG8gYSB7QGxpbmsgQnVmZmVyfSBvYmplY3QgdG8gc2VuZCByYXcgYnl0ZXMuIElmIHlvdSB1c2UgYSBCdWZmZXIsIHlvdSBzaG91bGQgYWxzbyBzZXQgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgZXhwbGljaXRseSB0byBkZXNjcmliZSB3aGF0IHRoZXNlIGJ5dGVzIHJlcHJlc2VudC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGVycm9yIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzLiBJdCB3aWxsIGJlIHBhc3NlZCBhIFBhcnNlLkNsb3VkLkhUVFBSZXNwb25zZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGZvbGxvd1JlZGlyZWN0cyBXaGV0aGVyIHRvIGZvbGxvdyByZWRpcmVjdHMgY2F1c2VkIGJ5IEhUVFAgM3h4IHJlc3BvbnNlcy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWV0aG9kIFRoZSBtZXRob2Qgb2YgdGhlIHJlcXVlc3QuIEdFVCwgUE9TVCwgUFVULCBERUxFVEUsIEhFQUQsIGFuZCBPUFRJT05TIGFyZSBzdXBwb3J0ZWQuIFdpbGwgZGVmYXVsdCB0byBHRVQgaWYgbm90IHNwZWNpZmllZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gcGFyYW1zIFRoZSBxdWVyeSBwb3J0aW9uIG9mIHRoZSB1cmwuIFlvdSBjYW4gcGFzcyBhIEpTT04gb2JqZWN0IG9mIGtleSB2YWx1ZSBwYWlycyBsaWtlIHBhcmFtczoge3EgOiAnU2VhbiBQbG90dCd9IG9yIGEgcmF3IHN0cmluZyBsaWtlIHBhcmFtczpxPVNlYW4gUGxvdHQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBzdWNjZXNzIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZXMuIEl0IHdpbGwgYmUgcGFzc2VkIGEgUGFyc2UuQ2xvdWQuSFRUUFJlc3BvbnNlIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIHVybCB0byBzZW5kIHRoZSByZXF1ZXN0IHRvLlxuICovXG5cbm1vZHVsZS5leHBvcnRzLmVuY29kZUJvZHkgPSBlbmNvZGVCb2R5O1xuIl19