项目原始demo,不改动
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
To repozytorium jest zarchiwizowane. Możesz wyświetlać pliki i je sklonować, ale nie możesz do niego przepychać zmian lub otwierać zgłoszeń/Pull Requestów.
 
 
 
 

243 wiersze
7.2 KiB

  1. 'use strict';
  2. var utils = require('./utils');
  3. var formats = require('./formats');
  4. var arrayPrefixGenerators = {
  5. brackets: function brackets(prefix) { // eslint-disable-line func-name-matching
  6. return prefix + '[]';
  7. },
  8. indices: function indices(prefix, key) { // eslint-disable-line func-name-matching
  9. return prefix + '[' + key + ']';
  10. },
  11. repeat: function repeat(prefix) { // eslint-disable-line func-name-matching
  12. return prefix;
  13. }
  14. };
  15. var isArray = Array.isArray;
  16. var push = Array.prototype.push;
  17. var pushToArray = function (arr, valueOrArray) {
  18. push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
  19. };
  20. var toISO = Date.prototype.toISOString;
  21. var defaults = {
  22. addQueryPrefix: false,
  23. allowDots: false,
  24. charset: 'utf-8',
  25. charsetSentinel: false,
  26. delimiter: '&',
  27. encode: true,
  28. encoder: utils.encode,
  29. encodeValuesOnly: false,
  30. // deprecated
  31. indices: false,
  32. serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching
  33. return toISO.call(date);
  34. },
  35. skipNulls: false,
  36. strictNullHandling: false
  37. };
  38. var stringify = function stringify( // eslint-disable-line func-name-matching
  39. object,
  40. prefix,
  41. generateArrayPrefix,
  42. strictNullHandling,
  43. skipNulls,
  44. encoder,
  45. filter,
  46. sort,
  47. allowDots,
  48. serializeDate,
  49. formatter,
  50. encodeValuesOnly,
  51. charset
  52. ) {
  53. var obj = object;
  54. if (typeof filter === 'function') {
  55. obj = filter(prefix, obj);
  56. } else if (obj instanceof Date) {
  57. obj = serializeDate(obj);
  58. }
  59. if (obj === null) {
  60. if (strictNullHandling) {
  61. return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix;
  62. }
  63. obj = '';
  64. }
  65. if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
  66. if (encoder) {
  67. var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset);
  68. return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))];
  69. }
  70. return [formatter(prefix) + '=' + formatter(String(obj))];
  71. }
  72. var values = [];
  73. if (typeof obj === 'undefined') {
  74. return values;
  75. }
  76. var objKeys;
  77. if (Array.isArray(filter)) {
  78. objKeys = filter;
  79. } else {
  80. var keys = Object.keys(obj);
  81. objKeys = sort ? keys.sort(sort) : keys;
  82. }
  83. for (var i = 0; i < objKeys.length; ++i) {
  84. var key = objKeys[i];
  85. if (skipNulls && obj[key] === null) {
  86. continue;
  87. }
  88. if (Array.isArray(obj)) {
  89. pushToArray(values, stringify(
  90. obj[key],
  91. generateArrayPrefix(prefix, key),
  92. generateArrayPrefix,
  93. strictNullHandling,
  94. skipNulls,
  95. encoder,
  96. filter,
  97. sort,
  98. allowDots,
  99. serializeDate,
  100. formatter,
  101. encodeValuesOnly,
  102. charset
  103. ));
  104. } else {
  105. pushToArray(values, stringify(
  106. obj[key],
  107. prefix + (allowDots ? '.' + key : '[' + key + ']'),
  108. generateArrayPrefix,
  109. strictNullHandling,
  110. skipNulls,
  111. encoder,
  112. filter,
  113. sort,
  114. allowDots,
  115. serializeDate,
  116. formatter,
  117. encodeValuesOnly,
  118. charset
  119. ));
  120. }
  121. }
  122. return values;
  123. };
  124. module.exports = function (object, opts) {
  125. var obj = object;
  126. var options = opts ? utils.assign({}, opts) : {};
  127. if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
  128. throw new TypeError('Encoder has to be a function.');
  129. }
  130. var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
  131. var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
  132. var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
  133. var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
  134. var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;
  135. var sort = typeof options.sort === 'function' ? options.sort : null;
  136. var allowDots = typeof options.allowDots === 'undefined' ? defaults.allowDots : !!options.allowDots;
  137. var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;
  138. var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;
  139. var charset = options.charset || defaults.charset;
  140. if (typeof options.charset !== 'undefined' && options.charset !== 'utf-8' && options.charset !== 'iso-8859-1') {
  141. throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined');
  142. }
  143. if (typeof options.format === 'undefined') {
  144. options.format = formats['default'];
  145. } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
  146. throw new TypeError('Unknown format option provided.');
  147. }
  148. var formatter = formats.formatters[options.format];
  149. var objKeys;
  150. var filter;
  151. if (typeof options.filter === 'function') {
  152. filter = options.filter;
  153. obj = filter('', obj);
  154. } else if (Array.isArray(options.filter)) {
  155. filter = options.filter;
  156. objKeys = filter;
  157. }
  158. var keys = [];
  159. if (typeof obj !== 'object' || obj === null) {
  160. return '';
  161. }
  162. var arrayFormat;
  163. if (options.arrayFormat in arrayPrefixGenerators) {
  164. arrayFormat = options.arrayFormat;
  165. } else if ('indices' in options) {
  166. arrayFormat = options.indices ? 'indices' : 'repeat';
  167. } else {
  168. arrayFormat = 'indices';
  169. }
  170. var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
  171. if (!objKeys) {
  172. objKeys = Object.keys(obj);
  173. }
  174. if (sort) {
  175. objKeys.sort(sort);
  176. }
  177. for (var i = 0; i < objKeys.length; ++i) {
  178. var key = objKeys[i];
  179. if (skipNulls && obj[key] === null) {
  180. continue;
  181. }
  182. pushToArray(keys, stringify(
  183. obj[key],
  184. key,
  185. generateArrayPrefix,
  186. strictNullHandling,
  187. skipNulls,
  188. encode ? encoder : null,
  189. filter,
  190. sort,
  191. allowDots,
  192. serializeDate,
  193. formatter,
  194. encodeValuesOnly,
  195. charset
  196. ));
  197. }
  198. var joined = keys.join(delimiter);
  199. var prefix = options.addQueryPrefix === true ? '?' : '';
  200. if (options.charsetSentinel) {
  201. if (charset === 'iso-8859-1') {
  202. // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
  203. prefix += 'utf8=%26%2310003%3B&';
  204. } else {
  205. // encodeURIComponent('✓')
  206. prefix += 'utf8=%E2%9C%93&';
  207. }
  208. }
  209. return joined.length > 0 ? prefix + joined : '';
  210. };