@@ -4,49 +4,60 @@ import { Injectable } from '@nestjs/common';
44
55@Injectable ( )
66export default class DataParserHelper {
7- public toString ( data : unknown ) : string {
8- let result = '' ;
9-
10- switch ( typeof data ) {
11- case 'bigint' :
12- result = data . toString ( ) ;
13- break ;
14- case 'number' :
15- result = data . toString ( ) ;
16- break ;
17- case 'boolean' :
18- result = data . toString ( ) ;
19- break ;
20- case 'string' :
21- result = data ;
22- break ;
23- case 'object' :
24- if ( ! data )
25- break ;
26- else if ( Array . isArray ( data ) ) {
27- const parsedData = data . map ( ( d ) => this . toString ( d ) ) ;
28- result = `${ parsedData . join ( ', ' ) } ` ;
29- } else if ( data instanceof Error )
30- result = `${ data ?. name } : ${ data ?. message } ` ;
31- else {
32- try {
33- result = JSON . stringify ( data ) ;
34- } catch ( _error ) {
35- result = data ?. toString ( ) ?? '' ;
7+ public toString ( data : unknown , returnUndefined = false ) : string {
8+ const circularReference = '[Circular Reference]' ;
9+
10+ if ( typeof data === 'string' )
11+ return data ;
12+ if ( typeof data === 'symbol' )
13+ return data . toString ( ) ;
14+ if ( typeof data === 'undefined' )
15+ return returnUndefined ? 'undefined' : '' ;
16+
17+ if ( typeof data === 'object' ) {
18+ const fallback = String ( data ) ;
19+
20+ if ( ! data ) {
21+ return fallback ;
22+ }
23+ if ( data instanceof Error ) {
24+ return `${ data ?. name } : ${ data ?. message } ` ;
25+ }
26+
27+ if ( Array . isArray ( data ) ) {
28+ const seen = new WeakSet < unknown [ ] > ( ) ;
29+ const visit = ( array : unknown [ ] ) : string => {
30+ if ( seen . has ( array ) ) {
31+ return circularReference ;
3632 }
33+ seen . add ( array ) ;
34+ const parsedData = array . map ( ( element ) => Array . isArray ( element ) ? visit ( element ) : this . toString ( element , returnUndefined ) ) ;
35+ return parsedData . join ( ', ' ) ;
36+ } ;
37+ return visit ( data ) ;
38+ }
39+ try {
40+ return JSON . stringify ( data ) ;
41+ } catch ( error ) {
42+ if ( error instanceof Error && error . message . includes ( 'circular' ) ) {
43+ const seen = new WeakSet ( ) ;
44+ const stringified = JSON . stringify ( data , ( _key , value ) => {
45+ if ( typeof value === 'object' && value !== null ) {
46+ if ( seen . has ( value ) ) {
47+ return circularReference ;
48+ }
49+ seen . add ( value ) ;
50+ }
51+ return value ;
52+ } ) ;
53+ return stringified ;
3754 }
38- break ;
39- case 'symbol' :
40- result = data . toString ( ) ;
41- break ;
42- case 'function' :
43- result = data . toString ( ) ;
44- break ;
45- default :
46- break ;
55+
56+ return fallback ;
57+ }
4758 }
4859
49- return result ;
60+ return String ( data ) ;
5061 }
5162
5263 public toObject < OT = object > ( data : string ) : OT | null {
0 commit comments