diff --git a/src/index.js b/src/index.js index 4545324..c67d25f 100644 --- a/src/index.js +++ b/src/index.js @@ -204,7 +204,7 @@ function toReadableString ( value, indent, replacer ) { "indent": 4, "truncate_views": 50, }; - if ( typeof indent === "object" && indent !== null ) + if ( is_object(indent) ) options = Object.assign( options, indent ); else if ( indent !== undefined ) options.indent = indent; @@ -218,8 +218,6 @@ function toReadableString ( value, indent, replacer ) { return `${RAW_PREFIX}[Circular reference to #/${seen.get(v).join('/')}]`; if ( is_object(v) ) { - seen.set( v, path ); // Add value before copy - try { v = v.toJSON( k ); } catch (err) { @@ -228,6 +226,8 @@ function toReadableString ( value, indent, replacer ) { || err.message.includes("Cannot read property 'toJSON'"))) ) throw err; } + if ( is_object(v) ) + seen.set( v, path ); // Add value after toJSON but before copy if ( v.constructor.name === "Object" ) v = Object.assign({}, v); diff --git a/tests/unit/test_debug.js b/tests/unit/test_debug.js index 5f7c316..905ed27 100644 --- a/tests/unit/test_debug.js +++ b/tests/unit/test_debug.js @@ -102,6 +102,28 @@ function basic_tests () { ).to.equal(`{"a":9007199254740991n,"b":9007199254740991n}`); } }); + + it("should not circular reference primitive values", async () => { + class Something { + toJSON () { + return "primitive value"; + } + } + const eventual_primitive = new Something(); + + const input = { + "eventual_primitive": eventual_primitive, + "sublevel": { + "list": [ + eventual_primitive, + ], + "eventual_primitive": eventual_primitive, + } + }; + let text = debug( input ); + + expect( text ).to.equal( JSON.stringify(input, null, 4) ); + }); } describe("Debug", () => {