@@ -15,14 +15,15 @@ const empty = [];
15
15
* @template T
16
16
* @param {T } value
17
17
* @param {boolean } [skip_warning]
18
+ * @param {boolean } [no_tojson]
18
19
* @returns {Snapshot<T> }
19
20
*/
20
- export function snapshot ( value , skip_warning = false ) {
21
+ export function snapshot ( value , skip_warning = false , no_tojson = false ) {
21
22
if ( DEV && ! skip_warning ) {
22
23
/** @type {string[] } */
23
24
const paths = [ ] ;
24
25
25
- const copy = clone ( value , new Map ( ) , '' , paths ) ;
26
+ const copy = clone ( value , new Map ( ) , '' , paths , null , no_tojson ) ;
26
27
if ( paths . length === 1 && paths [ 0 ] === '' ) {
27
28
// value could not be cloned
28
29
w . state_snapshot_uncloneable ( ) ;
@@ -40,7 +41,7 @@ export function snapshot(value, skip_warning = false) {
40
41
return copy ;
41
42
}
42
43
43
- return clone ( value , new Map ( ) , '' , empty ) ;
44
+ return clone ( value , new Map ( ) , '' , empty , null , no_tojson ) ;
44
45
}
45
46
46
47
/**
@@ -49,10 +50,11 @@ export function snapshot(value, skip_warning = false) {
49
50
* @param {Map<T, Snapshot<T>> } cloned
50
51
* @param {string } path
51
52
* @param {string[] } paths
52
- * @param {null | T } original The original value, if `value` was produced from a `toJSON` call
53
+ * @param {null | T } [original] The original value, if `value` was produced from a `toJSON` call
54
+ * @param {boolean } [no_tojson]
53
55
* @returns {Snapshot<T> }
54
56
*/
55
- function clone ( value , cloned , path , paths , original = null ) {
57
+ function clone ( value , cloned , path , paths , original = null , no_tojson = false ) {
56
58
if ( typeof value === 'object' && value !== null ) {
57
59
var unwrapped = cloned . get ( value ) ;
58
60
if ( unwrapped !== undefined ) return unwrapped ;
@@ -71,7 +73,7 @@ function clone(value, cloned, path, paths, original = null) {
71
73
for ( var i = 0 ; i < value . length ; i += 1 ) {
72
74
var element = value [ i ] ;
73
75
if ( i in value ) {
74
- copy [ i ] = clone ( element , cloned , DEV ? `${ path } [${ i } ]` : path , paths ) ;
76
+ copy [ i ] = clone ( element , cloned , DEV ? `${ path } [${ i } ]` : path , paths , null , no_tojson ) ;
75
77
}
76
78
}
77
79
@@ -88,8 +90,15 @@ function clone(value, cloned, path, paths, original = null) {
88
90
}
89
91
90
92
for ( var key in value ) {
91
- // @ts -expect-error
92
- copy [ key ] = clone ( value [ key ] , cloned , DEV ? `${ path } .${ key } ` : path , paths ) ;
93
+ copy [ key ] = clone (
94
+ // @ts -expect-error
95
+ value [ key ] ,
96
+ cloned ,
97
+ DEV ? `${ path } .${ key } ` : path ,
98
+ paths ,
99
+ null ,
100
+ no_tojson
101
+ ) ;
93
102
}
94
103
95
104
return copy ;
@@ -99,7 +108,7 @@ function clone(value, cloned, path, paths, original = null) {
99
108
return /** @type {Snapshot<T> } */ ( structuredClone ( value ) ) ;
100
109
}
101
110
102
- if ( typeof ( /** @type {T & { toJSON?: any } } */ ( value ) . toJSON ) === 'function' ) {
111
+ if ( typeof ( /** @type {T & { toJSON?: any } } */ ( value ) . toJSON ) === 'function' && ! no_tojson ) {
103
112
return clone (
104
113
/** @type {T & { toJSON(): any } } */ ( value ) . toJSON ( ) ,
105
114
cloned ,
0 commit comments