diff --git a/packages/workflow/src/utils.ts b/packages/workflow/src/utils.ts index b1ada63be1f68..71d4a50028a35 100644 --- a/packages/workflow/src/utils.ts +++ b/packages/workflow/src/utils.ts @@ -67,17 +67,16 @@ type JSONStringifyOptions = { }; const replaceCircularReferences = (value: T, knownObjects = new WeakSet()): T => { - if (value && typeof value === 'object') { - if (knownObjects.has(value)) return '[Circular Reference]' as T; - knownObjects.add(value); - const copy = (Array.isArray(value) ? [] : {}) as T; - for (const key in value) { - copy[key] = replaceCircularReferences(value[key], knownObjects); - } - knownObjects.delete(value); - return copy; + if (typeof value !== 'object' || value === null || value instanceof RegExp) return value; + if ('toJSON' in value && typeof value.toJSON === 'function') return value.toJSON() as T; + if (knownObjects.has(value)) return '[Circular Reference]' as T; + knownObjects.add(value); + const copy = (Array.isArray(value) ? [] : {}) as T; + for (const key in value) { + copy[key] = replaceCircularReferences(value[key], knownObjects); } - return value; + knownObjects.delete(value); + return copy; }; export const jsonStringify = (obj: unknown, options: JSONStringifyOptions = {}): string => { diff --git a/packages/workflow/test/utils.test.ts b/packages/workflow/test/utils.test.ts index fb944ec62ab61..268f270e02624 100644 --- a/packages/workflow/test/utils.test.ts +++ b/packages/workflow/test/utils.test.ts @@ -18,7 +18,7 @@ describe('jsonParse', () => { }); describe('jsonStringify', () => { - const source: any = { a: 1, b: 2 }; + const source: any = { a: 1, b: 2, d: new Date(1680089084200), r: new RegExp('^test$', 'ig') }; source.c = source; it('should throw errors on circular references by default', () => { @@ -27,7 +27,7 @@ describe('jsonStringify', () => { it('should break circular references when requested', () => { expect(jsonStringify(source, { replaceCircularRefs: true })).toEqual( - '{"a":1,"b":2,"c":"[Circular Reference]"}', + '{"a":1,"b":2,"d":"2023-03-29T11:24:44.200Z","r":{},"c":"[Circular Reference]"}', ); });