@@ -64,16 +64,44 @@ export function proxify<T>(node: ESNode): Proxified<T> {
64
64
65
65
const PROXY_KEY = "__magicast_proxy" ;
66
66
67
- export function literalToAst ( value : any ) : ESNode {
67
+ export function literalToAst ( value : any , seen = new Set ( ) ) : ESNode {
68
68
if ( value === undefined ) {
69
69
return b . identifier ( "undefined" ) as any ;
70
70
}
71
71
if ( value === null ) {
72
72
// eslint-disable-next-line unicorn/no-null
73
73
return b . literal ( null ) as any ;
74
74
}
75
+ if ( seen . has ( value ) ) {
76
+ throw new Error ( "Can not serialize circular reference" ) ;
77
+ }
78
+ seen . add ( value ) ;
79
+ if ( value instanceof Set ) {
80
+ return b . newExpression ( b . identifier ( "Set" ) , [
81
+ b . arrayExpression ( [ ...value ] . map ( ( n ) => literalToAst ( n , seen ) ) as any ) ,
82
+ ] ) as any ;
83
+ }
84
+ if ( value instanceof Date ) {
85
+ return b . newExpression ( b . identifier ( "Date" ) , [
86
+ b . literal ( value . toISOString ( ) ) ,
87
+ ] ) as any ;
88
+ }
89
+ if ( value instanceof Map ) {
90
+ return b . newExpression ( b . identifier ( "Map" ) , [
91
+ b . arrayExpression (
92
+ [ ...value ] . map ( ( [ key , value ] ) => {
93
+ return b . arrayExpression ( [
94
+ literalToAst ( key , seen ) as any ,
95
+ literalToAst ( value , seen ) as any ,
96
+ ] ) as any ;
97
+ } ) as any
98
+ ) ,
99
+ ] ) as any ;
100
+ }
75
101
if ( Array . isArray ( value ) ) {
76
- return b . arrayExpression ( value . map ( ( n ) => literalToAst ( n ) ) as any ) as any ;
102
+ return b . arrayExpression (
103
+ value . map ( ( n ) => literalToAst ( n , seen ) ) as any
104
+ ) as any ;
77
105
}
78
106
if ( typeof value === "object" ) {
79
107
if ( PROXY_KEY in value ) {
@@ -84,7 +112,7 @@ export function literalToAst(value: any): ESNode {
84
112
return b . property (
85
113
"init" ,
86
114
b . identifier ( key ) ,
87
- literalToAst ( value ) as any
115
+ literalToAst ( value , seen ) as any
88
116
) as any ;
89
117
} )
90
118
) as any ;
0 commit comments