qs 6.0.1 → 6.1.0

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/dist/qs.js CHANGED
@@ -1,28 +1,19 @@
1
1
  (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2
- // Load modules
2
+ 'use strict';
3
3
 
4
4
  var Stringify = require('./stringify');
5
5
  var Parse = require('./parse');
6
6
 
7
-
8
- // Declare internals
9
-
10
- var internals = {};
11
-
12
-
13
7
  module.exports = {
14
8
  stringify: Stringify,
15
9
  parse: Parse
16
10
  };
17
11
 
18
12
  },{"./parse":2,"./stringify":3}],2:[function(require,module,exports){
19
- // Load modules
13
+ 'use strict';
20
14
 
21
15
  var Utils = require('./utils');
22
16
 
23
-
24
- // Declare internals
25
-
26
17
  var internals = {
27
18
  delimiter: '&',
28
19
  depth: 5,
@@ -34,13 +25,11 @@ var internals = {
34
25
  allowDots: false
35
26
  };
36
27
 
37
-
38
28
  internals.parseValues = function (str, options) {
39
-
40
29
  var obj = {};
41
30
  var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);
42
31
 
43
- for (var i = 0, il = parts.length; i < il; ++i) {
32
+ for (var i = 0; i < parts.length; ++i) {
44
33
  var part = parts[i];
45
34
  var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;
46
35
 
@@ -50,16 +39,14 @@ internals.parseValues = function (str, options) {
50
39
  if (options.strictNullHandling) {
51
40
  obj[Utils.decode(part)] = null;
52
41
  }
53
- }
54
- else {
42
+ } else {
55
43
  var key = Utils.decode(part.slice(0, pos));
56
44
  var val = Utils.decode(part.slice(pos + 1));
57
45
 
58
- if (!Object.prototype.hasOwnProperty.call(obj, key)) {
59
- obj[key] = val;
60
- }
61
- else {
46
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
62
47
  obj[key] = [].concat(obj[key]).concat(val);
48
+ } else {
49
+ obj[key] = val;
63
50
  }
64
51
  }
65
52
  }
@@ -67,9 +54,7 @@ internals.parseValues = function (str, options) {
67
54
  return obj;
68
55
  };
69
56
 
70
-
71
57
  internals.parseObject = function (chain, val, options) {
72
-
73
58
  if (!chain.length) {
74
59
  return val;
75
60
  }
@@ -80,23 +65,20 @@ internals.parseObject = function (chain, val, options) {
80
65
  if (root === '[]') {
81
66
  obj = [];
82
67
  obj = obj.concat(internals.parseObject(chain, val, options));
83
- }
84
- else {
68
+ } else {
85
69
  obj = options.plainObjects ? Object.create(null) : {};
86
70
  var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
87
71
  var index = parseInt(cleanRoot, 10);
88
- var indexString = '' + index;
89
- if (!isNaN(index) &&
72
+ if (
73
+ !isNaN(index) &&
90
74
  root !== cleanRoot &&
91
- indexString === cleanRoot &&
75
+ String(index) === cleanRoot &&
92
76
  index >= 0 &&
93
- (options.parseArrays &&
94
- index <= options.arrayLimit)) {
95
-
77
+ (options.parseArrays && index <= options.arrayLimit)
78
+ ) {
96
79
  obj = [];
97
80
  obj[index] = internals.parseObject(chain, val, options);
98
- }
99
- else {
81
+ } else {
100
82
  obj[cleanRoot] = internals.parseObject(chain, val, options);
101
83
  }
102
84
  }
@@ -104,18 +86,13 @@ internals.parseObject = function (chain, val, options) {
104
86
  return obj;
105
87
  };
106
88
 
107
-
108
- internals.parseKeys = function (key, val, options) {
109
-
110
- if (!key) {
89
+ internals.parseKeys = function (givenKey, val, options) {
90
+ if (!givenKey) {
111
91
  return;
112
92
  }
113
93
 
114
94
  // Transform dot notation to bracket notation
115
-
116
- if (options.allowDots) {
117
- key = key.replace(/\.([^\.\[]+)/g, '[$1]');
118
- }
95
+ var key = options.allowDots ? givenKey.replace(/\.([^\.\[]+)/g, '[$1]') : givenKey;
119
96
 
120
97
  // The regex chunks
121
98
 
@@ -132,9 +109,7 @@ internals.parseKeys = function (key, val, options) {
132
109
  if (segment[1]) {
133
110
  // If we aren't using plain objects, optionally prefix keys
134
111
  // that would overwrite object prototype properties
135
- if (!options.plainObjects &&
136
- Object.prototype.hasOwnProperty(segment[1])) {
137
-
112
+ if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1])) {
138
113
  if (!options.allowPrototypes) {
139
114
  return;
140
115
  }
@@ -147,11 +122,8 @@ internals.parseKeys = function (key, val, options) {
147
122
 
148
123
  var i = 0;
149
124
  while ((segment = child.exec(key)) !== null && i < options.depth) {
150
-
151
- ++i;
152
- if (!options.plainObjects &&
153
- Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
154
-
125
+ i += 1;
126
+ if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
155
127
  if (!options.allowPrototypes) {
156
128
  continue;
157
129
  }
@@ -168,10 +140,8 @@ internals.parseKeys = function (key, val, options) {
168
140
  return internals.parseObject(keys, val, options);
169
141
  };
170
142
 
171
-
172
- module.exports = function (str, options) {
173
-
174
- options = options || {};
143
+ module.exports = function (str, opts) {
144
+ var options = opts || {};
175
145
  options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;
176
146
  options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;
177
147
  options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;
@@ -182,10 +152,11 @@ module.exports = function (str, options) {
182
152
  options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;
183
153
  options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
184
154
 
185
- if (str === '' ||
155
+ if (
156
+ str === '' ||
186
157
  str === null ||
187
- typeof str === 'undefined') {
188
-
158
+ typeof str === 'undefined'
159
+ ) {
189
160
  return options.plainObjects ? Object.create(null) : {};
190
161
  }
191
162
 
@@ -195,7 +166,7 @@ module.exports = function (str, options) {
195
166
  // Iterate over the keys and setup the new object
196
167
 
197
168
  var keys = Object.keys(tempObj);
198
- for (var i = 0, il = keys.length; i < il; ++i) {
169
+ for (var i = 0; i < keys.length; ++i) {
199
170
  var key = keys[i];
200
171
  var newObj = internals.parseKeys(key, tempObj[key], options);
201
172
  obj = Utils.merge(obj, newObj, options);
@@ -205,26 +176,20 @@ module.exports = function (str, options) {
205
176
  };
206
177
 
207
178
  },{"./utils":4}],3:[function(require,module,exports){
208
- // Load modules
179
+ 'use strict';
209
180
 
210
181
  var Utils = require('./utils');
211
182
 
212
-
213
- // Declare internals
214
-
215
183
  var internals = {
216
184
  delimiter: '&',
217
185
  arrayPrefixGenerators: {
218
- brackets: function (prefix, key) {
219
-
186
+ brackets: function (prefix) {
220
187
  return prefix + '[]';
221
188
  },
222
189
  indices: function (prefix, key) {
223
-
224
190
  return prefix + '[' + key + ']';
225
191
  },
226
- repeat: function (prefix, key) {
227
-
192
+ repeat: function (prefix) {
228
193
  return prefix;
229
194
  }
230
195
  },
@@ -233,19 +198,15 @@ var internals = {
233
198
  encode: true
234
199
  };
235
200
 
236
-
237
- internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort) {
238
-
201
+ internals.stringify = function (object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots) {
202
+ var obj = object;
239
203
  if (typeof filter === 'function') {
240
204
  obj = filter(prefix, obj);
241
- }
242
- else if (Utils.isBuffer(obj)) {
243
- obj = obj.toString();
244
- }
245
- else if (obj instanceof Date) {
205
+ } else if (Utils.isBuffer(obj)) {
206
+ obj = String(obj);
207
+ } else if (obj instanceof Date) {
246
208
  obj = obj.toISOString();
247
- }
248
- else if (obj === null) {
209
+ } else if (obj === null) {
249
210
  if (strictNullHandling) {
250
211
  return encode ? Utils.encode(prefix) : prefix;
251
212
  }
@@ -253,10 +214,7 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
253
214
  obj = '';
254
215
  }
255
216
 
256
- if (typeof obj === 'string' ||
257
- typeof obj === 'number' ||
258
- typeof obj === 'boolean') {
259
-
217
+ if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {
260
218
  if (encode) {
261
219
  return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
262
220
  }
@@ -277,61 +235,53 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
277
235
  objKeys = sort ? keys.sort(sort) : keys;
278
236
  }
279
237
 
280
- for (var i = 0, il = objKeys.length; i < il; ++i) {
238
+ for (var i = 0; i < objKeys.length; ++i) {
281
239
  var key = objKeys[i];
282
240
 
283
- if (skipNulls &&
284
- obj[key] === null) {
285
-
241
+ if (skipNulls && obj[key] === null) {
286
242
  continue;
287
243
  }
288
244
 
289
245
  if (Array.isArray(obj)) {
290
- values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
291
- }
292
- else {
293
- values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
246
+ values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
247
+ } else {
248
+ values = values.concat(internals.stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
294
249
  }
295
250
  }
296
251
 
297
252
  return values;
298
253
  };
299
254
 
300
-
301
- module.exports = function (obj, options) {
302
-
303
- options = options || {};
255
+ module.exports = function (object, opts) {
256
+ var obj = object;
257
+ var options = opts || {};
304
258
  var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
305
259
  var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
306
260
  var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
307
261
  var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
308
262
  var sort = typeof options.sort === 'function' ? options.sort : null;
263
+ var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
309
264
  var objKeys;
310
265
  var filter;
311
266
  if (typeof options.filter === 'function') {
312
267
  filter = options.filter;
313
268
  obj = filter('', obj);
314
- }
315
- else if (Array.isArray(options.filter)) {
269
+ } else if (Array.isArray(options.filter)) {
316
270
  objKeys = filter = options.filter;
317
271
  }
318
272
 
319
273
  var keys = [];
320
274
 
321
- if (typeof obj !== 'object' ||
322
- obj === null) {
323
-
275
+ if (typeof obj !== 'object' || obj === null) {
324
276
  return '';
325
277
  }
326
278
 
327
279
  var arrayFormat;
328
280
  if (options.arrayFormat in internals.arrayPrefixGenerators) {
329
281
  arrayFormat = options.arrayFormat;
330
- }
331
- else if ('indices' in options) {
282
+ } else if ('indices' in options) {
332
283
  arrayFormat = options.indices ? 'indices' : 'repeat';
333
- }
334
- else {
284
+ } else {
335
285
  arrayFormat = 'indices';
336
286
  }
337
287
 
@@ -345,40 +295,35 @@ module.exports = function (obj, options) {
345
295
  objKeys.sort(sort);
346
296
  }
347
297
 
348
- for (var i = 0, il = objKeys.length; i < il; ++i) {
298
+ for (var i = 0; i < objKeys.length; ++i) {
349
299
  var key = objKeys[i];
350
300
 
351
- if (skipNulls &&
352
- obj[key] === null) {
353
-
301
+ if (skipNulls && obj[key] === null) {
354
302
  continue;
355
303
  }
356
304
 
357
- keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort));
305
+ keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
358
306
  }
359
307
 
360
308
  return keys.join(delimiter);
361
309
  };
362
310
 
363
311
  },{"./utils":4}],4:[function(require,module,exports){
364
- // Load modules
365
-
366
-
367
- // Declare internals
312
+ 'use strict';
368
313
 
369
- var internals = {};
370
- internals.hexTable = new Array(256);
371
- for (var h = 0; h < 256; ++h) {
372
- internals.hexTable[h] = '%' + ((h < 16 ? '0' : '') + h.toString(16)).toUpperCase();
373
- }
314
+ var hexTable = (function () {
315
+ var array = new Array(256);
316
+ for (var i = 0; i < 256; ++i) {
317
+ array[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
318
+ }
374
319
 
320
+ return array;
321
+ }());
375
322
 
376
323
  exports.arrayToObject = function (source, options) {
377
-
378
324
  var obj = options.plainObjects ? Object.create(null) : {};
379
- for (var i = 0, il = source.length; i < il; ++i) {
325
+ for (var i = 0; i < source.length; ++i) {
380
326
  if (typeof source[i] !== 'undefined') {
381
-
382
327
  obj[i] = source[i];
383
328
  }
384
329
  }
@@ -386,9 +331,7 @@ exports.arrayToObject = function (source, options) {
386
331
  return obj;
387
332
  };
388
333
 
389
-
390
334
  exports.merge = function (target, source, options) {
391
-
392
335
  if (!source) {
393
336
  return target;
394
337
  }
@@ -396,47 +339,37 @@ exports.merge = function (target, source, options) {
396
339
  if (typeof source !== 'object') {
397
340
  if (Array.isArray(target)) {
398
341
  target.push(source);
399
- }
400
- else if (typeof target === 'object') {
342
+ } else if (typeof target === 'object') {
401
343
  target[source] = true;
402
- }
403
- else {
404
- target = [target, source];
344
+ } else {
345
+ return [target, source];
405
346
  }
406
347
 
407
348
  return target;
408
349
  }
409
350
 
410
351
  if (typeof target !== 'object') {
411
- target = [target].concat(source);
412
- return target;
352
+ return [target].concat(source);
413
353
  }
414
354
 
415
- if (Array.isArray(target) &&
416
- !Array.isArray(source)) {
417
-
418
- target = exports.arrayToObject(target, options);
355
+ var mergeTarget = target;
356
+ if (Array.isArray(target) && !Array.isArray(source)) {
357
+ mergeTarget = exports.arrayToObject(target, options);
419
358
  }
420
359
 
421
- var keys = Object.keys(source);
422
- for (var k = 0, kl = keys.length; k < kl; ++k) {
423
- var key = keys[k];
360
+ return Object.keys(source).reduce(function (acc, key) {
424
361
  var value = source[key];
425
362
 
426
- if (!Object.prototype.hasOwnProperty.call(target, key)) {
427
- target[key] = value;
363
+ if (Object.prototype.hasOwnProperty.call(acc, key)) {
364
+ acc[key] = exports.merge(acc[key], value, options);
365
+ } else {
366
+ acc[key] = value;
428
367
  }
429
- else {
430
- target[key] = exports.merge(target[key], value, options);
431
- }
432
- }
433
-
434
- return target;
368
+ return acc;
369
+ }, mergeTarget);
435
370
  };
436
371
 
437
-
438
372
  exports.decode = function (str) {
439
-
440
373
  try {
441
374
  return decodeURIComponent(str.replace(/\+/g, ' '));
442
375
  } catch (e) {
@@ -445,65 +378,60 @@ exports.decode = function (str) {
445
378
  };
446
379
 
447
380
  exports.encode = function (str) {
448
-
449
381
  // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
450
382
  // It has been adapted here for stricter adherence to RFC 3986
451
383
  if (str.length === 0) {
452
384
  return str;
453
385
  }
454
386
 
455
- if (typeof str !== 'string') {
456
- str = '' + str;
457
- }
387
+ var string = typeof str === 'string' ? str : String(str);
458
388
 
459
389
  var out = '';
460
- for (var i = 0, il = str.length; i < il; ++i) {
461
- var c = str.charCodeAt(i);
390
+ for (var i = 0; i < string.length; ++i) {
391
+ var c = string.charCodeAt(i);
462
392
 
463
- if (c === 0x2D || // -
393
+ if (
394
+ c === 0x2D || // -
464
395
  c === 0x2E || // .
465
396
  c === 0x5F || // _
466
397
  c === 0x7E || // ~
467
398
  (c >= 0x30 && c <= 0x39) || // 0-9
468
399
  (c >= 0x41 && c <= 0x5A) || // a-z
469
- (c >= 0x61 && c <= 0x7A)) { // A-Z
470
-
471
- out += str[i];
400
+ (c >= 0x61 && c <= 0x7A) // A-Z
401
+ ) {
402
+ out += string.charAt(i);
472
403
  continue;
473
404
  }
474
405
 
475
406
  if (c < 0x80) {
476
- out += internals.hexTable[c];
407
+ out = out + hexTable[c];
477
408
  continue;
478
409
  }
479
410
 
480
411
  if (c < 0x800) {
481
- out += internals.hexTable[0xC0 | (c >> 6)] + internals.hexTable[0x80 | (c & 0x3F)];
412
+ out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
482
413
  continue;
483
414
  }
484
415
 
485
416
  if (c < 0xD800 || c >= 0xE000) {
486
- out += internals.hexTable[0xE0 | (c >> 12)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)];
417
+ out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
487
418
  continue;
488
419
  }
489
420
 
490
- ++i;
491
- c = 0x10000 + (((c & 0x3FF) << 10) | (str.charCodeAt(i) & 0x3FF));
492
- out += internals.hexTable[0xF0 | (c >> 18)] + internals.hexTable[0x80 | ((c >> 12) & 0x3F)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)];
421
+ i += 1;
422
+ c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
423
+ out += (hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
493
424
  }
494
425
 
495
426
  return out;
496
427
  };
497
428
 
498
- exports.compact = function (obj, refs) {
499
-
500
- if (typeof obj !== 'object' ||
501
- obj === null) {
502
-
429
+ exports.compact = function (obj, references) {
430
+ if (typeof obj !== 'object' || obj === null) {
503
431
  return obj;
504
432
  }
505
433
 
506
- refs = refs || [];
434
+ var refs = references || [];
507
435
  var lookup = refs.indexOf(obj);
508
436
  if (lookup !== -1) {
509
437
  return refs[lookup];
@@ -514,7 +442,7 @@ exports.compact = function (obj, refs) {
514
442
  if (Array.isArray(obj)) {
515
443
  var compacted = [];
516
444
 
517
- for (var i = 0, il = obj.length; i < il; ++i) {
445
+ for (var i = 0; i < obj.length; ++i) {
518
446
  if (typeof obj[i] !== 'undefined') {
519
447
  compacted.push(obj[i]);
520
448
  }
@@ -524,32 +452,24 @@ exports.compact = function (obj, refs) {
524
452
  }
525
453
 
526
454
  var keys = Object.keys(obj);
527
- for (i = 0, il = keys.length; i < il; ++i) {
528
- var key = keys[i];
455
+ for (var j = 0; j < keys.length; ++j) {
456
+ var key = keys[j];
529
457
  obj[key] = exports.compact(obj[key], refs);
530
458
  }
531
459
 
532
460
  return obj;
533
461
  };
534
462
 
535
-
536
463
  exports.isRegExp = function (obj) {
537
-
538
464
  return Object.prototype.toString.call(obj) === '[object RegExp]';
539
465
  };
540
466
 
541
-
542
467
  exports.isBuffer = function (obj) {
543
-
544
- if (obj === null ||
545
- typeof obj === 'undefined') {
546
-
468
+ if (obj === null || typeof obj === 'undefined') {
547
469
  return false;
548
470
  }
549
471
 
550
- return !!(obj.constructor &&
551
- obj.constructor.isBuffer &&
552
- obj.constructor.isBuffer(obj));
472
+ return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
553
473
  };
554
474
 
555
475
  },{}]},{},[1])(1)
package/lib/index.js CHANGED
@@ -1,15 +1,9 @@
1
1
  'use strict';
2
2
 
3
- // Load modules
3
+ var Stringify = require('./stringify');
4
+ var Parse = require('./parse');
4
5
 
5
- const Stringify = require('./stringify');
6
- const Parse = require('./parse');
7
-
8
-
9
- // Declare internals
10
-
11
- const internals = {};
12
-
13
-
14
- exports.stringify = Stringify;
15
- exports.parse = Parse;
6
+ module.exports = {
7
+ stringify: Stringify,
8
+ parse: Parse
9
+ };