@augustofarnese/qs-patch 6.15.0-patched.1

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.
@@ -0,0 +1,356 @@
1
+ 'use strict';
2
+
3
+ var getSideChannel = require('side-channel');
4
+ var utils = require('./utils');
5
+ var formats = require('./formats');
6
+ var has = Object.prototype.hasOwnProperty;
7
+
8
+ var arrayPrefixGenerators = {
9
+ brackets: function brackets(prefix) {
10
+ return prefix + '[]';
11
+ },
12
+ comma: 'comma',
13
+ indices: function indices(prefix, key) {
14
+ return prefix + '[' + key + ']';
15
+ },
16
+ repeat: function repeat(prefix) {
17
+ return prefix;
18
+ }
19
+ };
20
+
21
+ var isArray = Array.isArray;
22
+ var push = Array.prototype.push;
23
+ var pushToArray = function (arr, valueOrArray) {
24
+ push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
25
+ };
26
+
27
+ var toISO = Date.prototype.toISOString;
28
+
29
+ var defaultFormat = formats['default'];
30
+ var defaults = {
31
+ addQueryPrefix: false,
32
+ allowDots: false,
33
+ allowEmptyArrays: false,
34
+ arrayFormat: 'indices',
35
+ charset: 'utf-8',
36
+ charsetSentinel: false,
37
+ commaRoundTrip: false,
38
+ delimiter: '&',
39
+ encode: true,
40
+ encodeDotInKeys: false,
41
+ encoder: utils.encode,
42
+ encodeValuesOnly: false,
43
+ filter: void undefined,
44
+ format: defaultFormat,
45
+ formatter: formats.formatters[defaultFormat],
46
+ // deprecated
47
+ indices: false,
48
+ serializeDate: function serializeDate(date) {
49
+ return toISO.call(date);
50
+ },
51
+ skipNulls: false,
52
+ strictNullHandling: false
53
+ };
54
+
55
+ var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
56
+ return typeof v === 'string'
57
+ || typeof v === 'number'
58
+ || typeof v === 'boolean'
59
+ || typeof v === 'symbol'
60
+ || typeof v === 'bigint';
61
+ };
62
+
63
+ var sentinel = {};
64
+
65
+ var stringify = function stringify(
66
+ object,
67
+ prefix,
68
+ generateArrayPrefix,
69
+ commaRoundTrip,
70
+ allowEmptyArrays,
71
+ strictNullHandling,
72
+ skipNulls,
73
+ encodeDotInKeys,
74
+ encoder,
75
+ filter,
76
+ sort,
77
+ allowDots,
78
+ serializeDate,
79
+ format,
80
+ formatter,
81
+ encodeValuesOnly,
82
+ charset,
83
+ sideChannel
84
+ ) {
85
+ var obj = object;
86
+
87
+ var tmpSc = sideChannel;
88
+ var step = 0;
89
+ var findFlag = false;
90
+ while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
91
+ // Where object last appeared in the ref tree
92
+ var pos = tmpSc.get(object);
93
+ step += 1;
94
+ if (typeof pos !== 'undefined') {
95
+ if (pos === step) {
96
+ throw new RangeError('Cyclic object value');
97
+ } else {
98
+ findFlag = true; // Break while
99
+ }
100
+ }
101
+ if (typeof tmpSc.get(sentinel) === 'undefined') {
102
+ step = 0;
103
+ }
104
+ }
105
+
106
+ if (typeof filter === 'function') {
107
+ obj = filter(prefix, obj);
108
+ } else if (obj instanceof Date) {
109
+ obj = serializeDate(obj);
110
+ } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
111
+ obj = utils.maybeMap(obj, function (value) {
112
+ if (value instanceof Date) {
113
+ return serializeDate(value);
114
+ }
115
+ return value;
116
+ });
117
+ }
118
+
119
+ if (obj === null) {
120
+ if (strictNullHandling) {
121
+ return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
122
+ }
123
+
124
+ obj = '';
125
+ }
126
+
127
+ if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
128
+ if (encoder) {
129
+ var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
130
+ return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
131
+ }
132
+ return [formatter(prefix) + '=' + formatter(String(obj))];
133
+ }
134
+
135
+ var values = [];
136
+
137
+ if (typeof obj === 'undefined') {
138
+ return values;
139
+ }
140
+
141
+ var objKeys;
142
+ if (generateArrayPrefix === 'comma' && isArray(obj)) {
143
+ // we need to join elements in
144
+ if (encodeValuesOnly && encoder) {
145
+ obj = utils.maybeMap(obj, encoder);
146
+ }
147
+ objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
148
+ } else if (isArray(filter)) {
149
+ objKeys = filter;
150
+ } else {
151
+ var keys = Object.keys(obj);
152
+ objKeys = sort ? keys.sort(sort) : keys;
153
+ }
154
+
155
+ var encodedPrefix = encodeDotInKeys ? String(prefix).replace(/\./g, '%2E') : String(prefix);
156
+
157
+ var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix;
158
+
159
+ if (allowEmptyArrays && isArray(obj) && obj.length === 0) {
160
+ return adjustedPrefix + '[]';
161
+ }
162
+
163
+ for (var j = 0; j < objKeys.length; ++j) {
164
+ var key = objKeys[j];
165
+ var value = typeof key === 'object' && key && typeof key.value !== 'undefined'
166
+ ? key.value
167
+ : obj[key];
168
+
169
+ if (skipNulls && value === null) {
170
+ continue;
171
+ }
172
+
173
+ var encodedKey = allowDots && encodeDotInKeys ? String(key).replace(/\./g, '%2E') : String(key);
174
+ var keyPrefix = isArray(obj)
175
+ ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix
176
+ : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']');
177
+
178
+ sideChannel.set(object, step);
179
+ var valueSideChannel = getSideChannel();
180
+ valueSideChannel.set(sentinel, sideChannel);
181
+ pushToArray(values, stringify(
182
+ value,
183
+ keyPrefix,
184
+ generateArrayPrefix,
185
+ commaRoundTrip,
186
+ allowEmptyArrays,
187
+ strictNullHandling,
188
+ skipNulls,
189
+ encodeDotInKeys,
190
+ generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder,
191
+ filter,
192
+ sort,
193
+ allowDots,
194
+ serializeDate,
195
+ format,
196
+ formatter,
197
+ encodeValuesOnly,
198
+ charset,
199
+ valueSideChannel
200
+ ));
201
+ }
202
+
203
+ return values;
204
+ };
205
+
206
+ var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
207
+ if (!opts) {
208
+ return defaults;
209
+ }
210
+
211
+ if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {
212
+ throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');
213
+ }
214
+
215
+ if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {
216
+ throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');
217
+ }
218
+
219
+ if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
220
+ throw new TypeError('Encoder has to be a function.');
221
+ }
222
+
223
+ var charset = opts.charset || defaults.charset;
224
+ if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
225
+ throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
226
+ }
227
+
228
+ var format = formats['default'];
229
+ if (typeof opts.format !== 'undefined') {
230
+ if (!has.call(formats.formatters, opts.format)) {
231
+ throw new TypeError('Unknown format option provided.');
232
+ }
233
+ format = opts.format;
234
+ }
235
+ var formatter = formats.formatters[format];
236
+
237
+ var filter = defaults.filter;
238
+ if (typeof opts.filter === 'function' || isArray(opts.filter)) {
239
+ filter = opts.filter;
240
+ }
241
+
242
+ var arrayFormat;
243
+ if (opts.arrayFormat in arrayPrefixGenerators) {
244
+ arrayFormat = opts.arrayFormat;
245
+ } else if ('indices' in opts) {
246
+ arrayFormat = opts.indices ? 'indices' : 'repeat';
247
+ } else {
248
+ arrayFormat = defaults.arrayFormat;
249
+ }
250
+
251
+ if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {
252
+ throw new TypeError('`commaRoundTrip` must be a boolean, or absent');
253
+ }
254
+
255
+ var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;
256
+
257
+ return {
258
+ addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
259
+ allowDots: allowDots,
260
+ allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,
261
+ arrayFormat: arrayFormat,
262
+ charset: charset,
263
+ charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
264
+ commaRoundTrip: !!opts.commaRoundTrip,
265
+ delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
266
+ encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
267
+ encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,
268
+ encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
269
+ encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
270
+ filter: filter,
271
+ format: format,
272
+ formatter: formatter,
273
+ serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
274
+ skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
275
+ sort: typeof opts.sort === 'function' ? opts.sort : null,
276
+ strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
277
+ };
278
+ };
279
+
280
+ module.exports = function (object, opts) {
281
+ var obj = object;
282
+ var options = normalizeStringifyOptions(opts);
283
+
284
+ var objKeys;
285
+ var filter;
286
+
287
+ if (typeof options.filter === 'function') {
288
+ filter = options.filter;
289
+ obj = filter('', obj);
290
+ } else if (isArray(options.filter)) {
291
+ filter = options.filter;
292
+ objKeys = filter;
293
+ }
294
+
295
+ var keys = [];
296
+
297
+ if (typeof obj !== 'object' || obj === null) {
298
+ return '';
299
+ }
300
+
301
+ var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat];
302
+ var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;
303
+
304
+ if (!objKeys) {
305
+ objKeys = Object.keys(obj);
306
+ }
307
+
308
+ if (options.sort) {
309
+ objKeys.sort(options.sort);
310
+ }
311
+
312
+ var sideChannel = getSideChannel();
313
+ for (var i = 0; i < objKeys.length; ++i) {
314
+ var key = objKeys[i];
315
+ var value = obj[key];
316
+
317
+ if (options.skipNulls && value === null) {
318
+ continue;
319
+ }
320
+ pushToArray(keys, stringify(
321
+ value,
322
+ key,
323
+ generateArrayPrefix,
324
+ commaRoundTrip,
325
+ options.allowEmptyArrays,
326
+ options.strictNullHandling,
327
+ options.skipNulls,
328
+ options.encodeDotInKeys,
329
+ options.encode ? options.encoder : null,
330
+ options.filter,
331
+ options.sort,
332
+ options.allowDots,
333
+ options.serializeDate,
334
+ options.format,
335
+ options.formatter,
336
+ options.encodeValuesOnly,
337
+ options.charset,
338
+ sideChannel
339
+ ));
340
+ }
341
+
342
+ var joined = keys.join(options.delimiter);
343
+ var prefix = options.addQueryPrefix === true ? '?' : '';
344
+
345
+ if (options.charsetSentinel) {
346
+ if (options.charset === 'iso-8859-1') {
347
+ // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
348
+ prefix += 'utf8=%26%2310003%3B&';
349
+ } else {
350
+ // encodeURIComponent('✓')
351
+ prefix += 'utf8=%E2%9C%93&';
352
+ }
353
+ }
354
+
355
+ return joined.length > 0 ? prefix + joined : '';
356
+ };
package/lib/utils.js ADDED
@@ -0,0 +1,342 @@
1
+ 'use strict';
2
+
3
+ var formats = require('./formats');
4
+ var getSideChannel = require('side-channel');
5
+
6
+ var has = Object.prototype.hasOwnProperty;
7
+ var isArray = Array.isArray;
8
+
9
+ // Track objects created from arrayLimit overflow using side-channel
10
+ // Stores the current max numeric index for O(1) lookup
11
+ var overflowChannel = getSideChannel();
12
+
13
+ var markOverflow = function markOverflow(obj, maxIndex) {
14
+ overflowChannel.set(obj, maxIndex);
15
+ return obj;
16
+ };
17
+
18
+ var isOverflow = function isOverflow(obj) {
19
+ return overflowChannel.has(obj);
20
+ };
21
+
22
+ var getMaxIndex = function getMaxIndex(obj) {
23
+ return overflowChannel.get(obj);
24
+ };
25
+
26
+ var setMaxIndex = function setMaxIndex(obj, maxIndex) {
27
+ overflowChannel.set(obj, maxIndex);
28
+ };
29
+
30
+ var hexTable = (function () {
31
+ var array = [];
32
+ for (var i = 0; i < 256; ++i) {
33
+ array[array.length] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
34
+ }
35
+
36
+ return array;
37
+ }());
38
+
39
+ var compactQueue = function compactQueue(queue) {
40
+ while (queue.length > 1) {
41
+ var item = queue.pop();
42
+ var obj = item.obj[item.prop];
43
+
44
+ if (isArray(obj)) {
45
+ var compacted = [];
46
+
47
+ for (var j = 0; j < obj.length; ++j) {
48
+ if (typeof obj[j] !== 'undefined') {
49
+ compacted[compacted.length] = obj[j];
50
+ }
51
+ }
52
+
53
+ item.obj[item.prop] = compacted;
54
+ }
55
+ }
56
+ };
57
+
58
+ var arrayToObject = function arrayToObject(source, options) {
59
+ var obj = options && options.plainObjects ? { __proto__: null } : {};
60
+ for (var i = 0; i < source.length; ++i) {
61
+ if (typeof source[i] !== 'undefined') {
62
+ obj[i] = source[i];
63
+ }
64
+ }
65
+
66
+ return obj;
67
+ };
68
+
69
+ var merge = function merge(target, source, options) {
70
+ /* eslint no-param-reassign: 0 */
71
+ if (!source) {
72
+ return target;
73
+ }
74
+
75
+ if (typeof source !== 'object' && typeof source !== 'function') {
76
+ if (isArray(target)) {
77
+ var nextIndex = target.length;
78
+ if (options && typeof options.arrayLimit === 'number' && nextIndex > options.arrayLimit) {
79
+ return markOverflow(arrayToObject(target.concat(source), options), nextIndex);
80
+ }
81
+ target[nextIndex] = source;
82
+ } else if (target && typeof target === 'object') {
83
+ if (isOverflow(target)) {
84
+ // Add at next numeric index for overflow objects
85
+ var newIndex = getMaxIndex(target) + 1;
86
+ target[newIndex] = source;
87
+ setMaxIndex(target, newIndex);
88
+ } else if (options && options.strictMerge) {
89
+ return [target, source];
90
+ } else if (
91
+ (options && (options.plainObjects || options.allowPrototypes))
92
+ || !has.call(Object.prototype, source)
93
+ ) {
94
+ target[source] = true;
95
+ }
96
+ } else {
97
+ return [target, source];
98
+ }
99
+
100
+ return target;
101
+ }
102
+
103
+ if (!target || typeof target !== 'object') {
104
+ if (isOverflow(source)) {
105
+ // Create new object with target at 0, source values shifted by 1
106
+ var sourceKeys = Object.keys(source);
107
+ var result = options && options.plainObjects
108
+ ? { __proto__: null, 0: target }
109
+ : { 0: target };
110
+ for (var m = 0; m < sourceKeys.length; m++) {
111
+ var oldKey = parseInt(sourceKeys[m], 10);
112
+ result[oldKey + 1] = source[sourceKeys[m]];
113
+ }
114
+ return markOverflow(result, getMaxIndex(source) + 1);
115
+ }
116
+ var combined = [target].concat(source);
117
+ if (options && typeof options.arrayLimit === 'number' && combined.length > options.arrayLimit) {
118
+ return markOverflow(arrayToObject(combined, options), combined.length - 1);
119
+ }
120
+ return combined;
121
+ }
122
+
123
+ var mergeTarget = target;
124
+ if (isArray(target) && !isArray(source)) {
125
+ mergeTarget = arrayToObject(target, options);
126
+ }
127
+
128
+ if (isArray(target) && isArray(source)) {
129
+ source.forEach(function (item, i) {
130
+ if (has.call(target, i)) {
131
+ var targetItem = target[i];
132
+ if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
133
+ target[i] = merge(targetItem, item, options);
134
+ } else {
135
+ target[target.length] = item;
136
+ }
137
+ } else {
138
+ target[i] = item;
139
+ }
140
+ });
141
+ return target;
142
+ }
143
+
144
+ return Object.keys(source).reduce(function (acc, key) {
145
+ var value = source[key];
146
+
147
+ if (has.call(acc, key)) {
148
+ acc[key] = merge(acc[key], value, options);
149
+ } else {
150
+ acc[key] = value;
151
+ }
152
+
153
+ if (isOverflow(source) && !isOverflow(acc)) {
154
+ markOverflow(acc, getMaxIndex(source));
155
+ }
156
+ if (isOverflow(acc)) {
157
+ var keyNum = parseInt(key, 10);
158
+ if (String(keyNum) === key && keyNum >= 0 && keyNum > getMaxIndex(acc)) {
159
+ setMaxIndex(acc, keyNum);
160
+ }
161
+ }
162
+
163
+ return acc;
164
+ }, mergeTarget);
165
+ };
166
+
167
+ var assign = function assignSingleSource(target, source) {
168
+ return Object.keys(source).reduce(function (acc, key) {
169
+ acc[key] = source[key];
170
+ return acc;
171
+ }, target);
172
+ };
173
+
174
+ var decode = function (str, defaultDecoder, charset) {
175
+ var strWithoutPlus = str.replace(/\+/g, ' ');
176
+ if (charset === 'iso-8859-1') {
177
+ // unescape never throws, no try...catch needed:
178
+ return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
179
+ }
180
+ // utf-8
181
+ try {
182
+ return decodeURIComponent(strWithoutPlus);
183
+ } catch (e) {
184
+ return strWithoutPlus;
185
+ }
186
+ };
187
+
188
+ var limit = 1024;
189
+
190
+ /* eslint operator-linebreak: [2, "before"] */
191
+
192
+ var encode = function encode(str, defaultEncoder, charset, kind, format) {
193
+ // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
194
+ // It has been adapted here for stricter adherence to RFC 3986
195
+ if (str.length === 0) {
196
+ return str;
197
+ }
198
+
199
+ var string = str;
200
+ if (typeof str === 'symbol') {
201
+ string = Symbol.prototype.toString.call(str);
202
+ } else if (typeof str !== 'string') {
203
+ string = String(str);
204
+ }
205
+
206
+ if (charset === 'iso-8859-1') {
207
+ return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
208
+ return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
209
+ });
210
+ }
211
+
212
+ var out = '';
213
+ for (var j = 0; j < string.length; j += limit) {
214
+ var segment = string.length >= limit ? string.slice(j, j + limit) : string;
215
+ var arr = [];
216
+
217
+ for (var i = 0; i < segment.length; ++i) {
218
+ var c = segment.charCodeAt(i);
219
+ if (
220
+ c === 0x2D // -
221
+ || c === 0x2E // .
222
+ || c === 0x5F // _
223
+ || c === 0x7E // ~
224
+ || (c >= 0x30 && c <= 0x39) // 0-9
225
+ || (c >= 0x41 && c <= 0x5A) // a-z
226
+ || (c >= 0x61 && c <= 0x7A) // A-Z
227
+ || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
228
+ ) {
229
+ arr[arr.length] = segment.charAt(i);
230
+ continue;
231
+ }
232
+
233
+ if (c < 0x80) {
234
+ arr[arr.length] = hexTable[c];
235
+ continue;
236
+ }
237
+
238
+ if (c < 0x800) {
239
+ arr[arr.length] = hexTable[0xC0 | (c >> 6)]
240
+ + hexTable[0x80 | (c & 0x3F)];
241
+ continue;
242
+ }
243
+
244
+ if (c < 0xD800 || c >= 0xE000) {
245
+ arr[arr.length] = hexTable[0xE0 | (c >> 12)]
246
+ + hexTable[0x80 | ((c >> 6) & 0x3F)]
247
+ + hexTable[0x80 | (c & 0x3F)];
248
+ continue;
249
+ }
250
+
251
+ i += 1;
252
+ c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF));
253
+
254
+ arr[arr.length] = hexTable[0xF0 | (c >> 18)]
255
+ + hexTable[0x80 | ((c >> 12) & 0x3F)]
256
+ + hexTable[0x80 | ((c >> 6) & 0x3F)]
257
+ + hexTable[0x80 | (c & 0x3F)];
258
+ }
259
+
260
+ out += arr.join('');
261
+ }
262
+
263
+ return out;
264
+ };
265
+
266
+ var compact = function compact(value) {
267
+ var queue = [{ obj: { o: value }, prop: 'o' }];
268
+ var refs = [];
269
+
270
+ for (var i = 0; i < queue.length; ++i) {
271
+ var item = queue[i];
272
+ var obj = item.obj[item.prop];
273
+
274
+ var keys = Object.keys(obj);
275
+ for (var j = 0; j < keys.length; ++j) {
276
+ var key = keys[j];
277
+ var val = obj[key];
278
+ if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
279
+ queue[queue.length] = { obj: obj, prop: key };
280
+ refs[refs.length] = val;
281
+ }
282
+ }
283
+ }
284
+
285
+ compactQueue(queue);
286
+
287
+ return value;
288
+ };
289
+
290
+ var isRegExp = function isRegExp(obj) {
291
+ return Object.prototype.toString.call(obj) === '[object RegExp]';
292
+ };
293
+
294
+ var isBuffer = function isBuffer(obj) {
295
+ if (!obj || typeof obj !== 'object') {
296
+ return false;
297
+ }
298
+
299
+ return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
300
+ };
301
+
302
+ var combine = function combine(a, b, arrayLimit, plainObjects) {
303
+ // If 'a' is already an overflow object, add to it
304
+ if (isOverflow(a)) {
305
+ var newIndex = getMaxIndex(a) + 1;
306
+ a[newIndex] = b;
307
+ setMaxIndex(a, newIndex);
308
+ return a;
309
+ }
310
+
311
+ var result = [].concat(a, b);
312
+ if (result.length > arrayLimit) {
313
+ return markOverflow(arrayToObject(result, { plainObjects: plainObjects }), result.length - 1);
314
+ }
315
+ return result;
316
+ };
317
+
318
+ var maybeMap = function maybeMap(val, fn) {
319
+ if (isArray(val)) {
320
+ var mapped = [];
321
+ for (var i = 0; i < val.length; i += 1) {
322
+ mapped[mapped.length] = fn(val[i]);
323
+ }
324
+ return mapped;
325
+ }
326
+ return fn(val);
327
+ };
328
+
329
+ module.exports = {
330
+ arrayToObject: arrayToObject,
331
+ assign: assign,
332
+ combine: combine,
333
+ compact: compact,
334
+ decode: decode,
335
+ encode: encode,
336
+ isBuffer: isBuffer,
337
+ isOverflow: isOverflow,
338
+ isRegExp: isRegExp,
339
+ markOverflow: markOverflow,
340
+ maybeMap: maybeMap,
341
+ merge: merge
342
+ };