stringify.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Load modules
  2. var Utils = require('./utils');
  3. // Declare internals
  4. var internals = {
  5. delimiter: '&',
  6. arrayPrefixGenerators: {
  7. brackets: function (prefix, key) {
  8. return prefix + '[]';
  9. },
  10. indices: function (prefix, key) {
  11. return prefix + '[' + key + ']';
  12. },
  13. repeat: function (prefix, key) {
  14. return prefix;
  15. }
  16. },
  17. strictNullHandling: false
  18. };
  19. internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) {
  20. if (typeof filter === 'function') {
  21. obj = filter(prefix, obj);
  22. }
  23. else if (Utils.isBuffer(obj)) {
  24. obj = obj.toString();
  25. }
  26. else if (obj instanceof Date) {
  27. obj = obj.toISOString();
  28. }
  29. else if (obj === null) {
  30. if (strictNullHandling) {
  31. return Utils.encode(prefix);
  32. }
  33. obj = '';
  34. }
  35. if (typeof obj === 'string' ||
  36. typeof obj === 'number' ||
  37. typeof obj === 'boolean') {
  38. return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
  39. }
  40. var values = [];
  41. if (typeof obj === 'undefined') {
  42. return values;
  43. }
  44. var objKeys = Array.isArray(filter) ? filter : Object.keys(obj);
  45. for (var i = 0, il = objKeys.length; i < il; ++i) {
  46. var key = objKeys[i];
  47. if (Array.isArray(obj)) {
  48. values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter));
  49. }
  50. else {
  51. values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter));
  52. }
  53. }
  54. return values;
  55. };
  56. module.exports = function (obj, options) {
  57. options = options || {};
  58. var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
  59. var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
  60. var objKeys;
  61. var filter;
  62. if (typeof options.filter === 'function') {
  63. filter = options.filter;
  64. obj = filter('', obj);
  65. }
  66. else if (Array.isArray(options.filter)) {
  67. objKeys = filter = options.filter;
  68. }
  69. var keys = [];
  70. if (typeof obj !== 'object' ||
  71. obj === null) {
  72. return '';
  73. }
  74. var arrayFormat;
  75. if (options.arrayFormat in internals.arrayPrefixGenerators) {
  76. arrayFormat = options.arrayFormat;
  77. }
  78. else if ('indices' in options) {
  79. arrayFormat = options.indices ? 'indices' : 'repeat';
  80. }
  81. else {
  82. arrayFormat = 'indices';
  83. }
  84. var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
  85. if (!objKeys) {
  86. objKeys = Object.keys(obj);
  87. }
  88. for (var i = 0, il = objKeys.length; i < il; ++i) {
  89. var key = objKeys[i];
  90. keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter));
  91. }
  92. return keys.join(delimiter);
  93. };