stringify.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. var type = require('./type');
  2. var upperFirst = require('./upperFirst');
  3. var toStr = require('./toStr');
  4. var isUndef = require('./isUndef');
  5. var isFn = require('./isFn');
  6. var isRegExp = require('./isRegExp');
  7. exports = function(obj, spaces) {
  8. return JSON.stringify(obj, serializer(), spaces);
  9. };
  10. function serializer() {
  11. var stack = [];
  12. var keys = [];
  13. return function(key, val) {
  14. if (stack.length > 0) {
  15. var pos = stack.indexOf(this);
  16. if (pos > -1) {
  17. stack.splice(pos + 1);
  18. keys.splice(pos, Infinity, key);
  19. } else {
  20. stack.push(this);
  21. keys.push(key);
  22. }
  23. var valPos = stack.indexOf(val);
  24. if (valPos > -1) {
  25. if (stack[0] === val) {
  26. val = '[Circular ~]';
  27. } else {
  28. val =
  29. '[Circular ~.' + keys.slice(0, valPos).join('.') + ']';
  30. }
  31. }
  32. } else {
  33. stack.push(val);
  34. }
  35. if (isRegExp(val) || isFn(val)) {
  36. val = '[' + upperFirst(type(val)) + ' ' + toStr(val) + ']';
  37. } else if (isUndef(val)) {
  38. val = null;
  39. }
  40. return val;
  41. };
  42. }
  43. module.exports = exports;