Skip to content

Commit d1df210

Browse files
committed
fix(array): fix issue
1 parent f4e9ac9 commit d1df210

File tree

2 files changed

+126
-5
lines changed

2 files changed

+126
-5
lines changed

src/draft.ts

+18-5
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,18 @@ const proxyHandler: ProxyHandler<ProxyDraft> = {
123123
return value;
124124
}
125125
// Ensure that the assigned values are not drafted
126-
if (value === peek(target.original, key) && !arrayHandling) {
126+
if (
127+
!arrayHandling &&
128+
(value === peek(target.original, key) ||
129+
target.options.skipFinalization!.has(value))
130+
) {
131+
const has = target.options.skipFinalization!.has(value);
132+
if (target.options.skipFinalization!.has(value)) {
133+
target.options.skipFinalization!.delete(value);
134+
}
127135
ensureShallowCopy(target);
128136
target.copy![key] = createDraft({
129-
original: target.original[key],
137+
original: has ? target.copy![key] : target.original[key],
130138
parentDraft: target,
131139
key: target.type === DraftType.Array ? Number(key) : key,
132140
finalities: target.finalities,
@@ -142,9 +150,10 @@ const proxyHandler: ProxyHandler<ProxyDraft> = {
142150
}
143151
return target.copy![key];
144152
}
145-
if (arrayHandling && !isDraft(value)) {
153+
if (arrayHandling && !isDraft(value) && isDraftable(value)) {
146154
target.options.skipFinalization!.add(value);
147-
} else if (target.options.skipFinalization!.has(value)) {
155+
}
156+
if (!arrayHandling && target.options.skipFinalization!.has(value)) {
148157
target.options.skipFinalization!.delete(value);
149158
}
150159
return value;
@@ -299,7 +308,11 @@ export function createDraft<T extends object>(createDraftOptions: {
299308
}
300309
finalizeSetValue(proxyDraft);
301310
finalizePatches(proxyDraft, generatePatches, patches, inversePatches);
302-
if (__DEV__ && target.options.enableAutoFreeze) {
311+
if (
312+
__DEV__ &&
313+
target.options.enableAutoFreeze &&
314+
typeof updatedValue === 'object'
315+
) {
303316
target.options.updatedValues =
304317
target.options.updatedValues ?? new WeakMap();
305318
target.options.updatedValues.set(updatedValue, proxyDraft.original);

test/__snapshots__/apply.test.ts.snap

+108
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,24 @@ exports[`array - update 6`] = `
15491549

15501550
exports[`array - update 7`] = `
15511551
[
1552+
{
1553+
"op": "replace",
1554+
"path": [
1555+
"a",
1556+
10,
1557+
"i",
1558+
],
1559+
"value": 12,
1560+
},
1561+
{
1562+
"op": "replace",
1563+
"path": [
1564+
"a",
1565+
0,
1566+
"i",
1567+
],
1568+
"value": 2,
1569+
},
15521570
{
15531571
"op": "replace",
15541572
"path": [
@@ -1752,6 +1770,24 @@ exports[`array - update 7`] = `
17521770

17531771
exports[`array - update 8`] = `
17541772
[
1773+
{
1774+
"op": "replace",
1775+
"path": [
1776+
"a",
1777+
10,
1778+
"i",
1779+
],
1780+
"value": 11,
1781+
},
1782+
{
1783+
"op": "replace",
1784+
"path": [
1785+
"a",
1786+
0,
1787+
"i",
1788+
],
1789+
"value": 1,
1790+
},
17551791
{
17561792
"op": "replace",
17571793
"path": [
@@ -1957,6 +1993,15 @@ exports[`array - update 8`] = `
19571993

19581994
exports[`array - update 9`] = `
19591995
[
1996+
{
1997+
"op": "replace",
1998+
"path": [
1999+
"a",
2000+
0,
2001+
"i",
2002+
],
2003+
"value": 2,
2004+
},
19602005
{
19612006
"op": "replace",
19622007
"path": [
@@ -2160,6 +2205,15 @@ exports[`array - update 9`] = `
21602205

21612206
exports[`array - update 10`] = `
21622207
[
2208+
{
2209+
"op": "replace",
2210+
"path": [
2211+
"a",
2212+
0,
2213+
"i",
2214+
],
2215+
"value": 1,
2216+
},
21632217
{
21642218
"op": "replace",
21652219
"path": [
@@ -2365,6 +2419,15 @@ exports[`array - update 10`] = `
23652419

23662420
exports[`array - update 11`] = `
23672421
[
2422+
{
2423+
"op": "replace",
2424+
"path": [
2425+
"a",
2426+
0,
2427+
"i",
2428+
],
2429+
"value": 2,
2430+
},
23682431
{
23692432
"op": "replace",
23702433
"path": [
@@ -2568,6 +2631,15 @@ exports[`array - update 11`] = `
25682631

25692632
exports[`array - update 12`] = `
25702633
[
2634+
{
2635+
"op": "replace",
2636+
"path": [
2637+
"a",
2638+
0,
2639+
"i",
2640+
],
2641+
"value": 1,
2642+
},
25712643
{
25722644
"op": "replace",
25732645
"path": [
@@ -3658,6 +3730,15 @@ exports[`array - update 16`] = `
36583730

36593731
exports[`array - update 17`] = `
36603732
[
3733+
{
3734+
"op": "replace",
3735+
"path": [
3736+
"a",
3737+
2,
3738+
"i",
3739+
],
3740+
"value": 2,
3741+
},
36613742
{
36623743
"op": "replace",
36633744
"path": [
@@ -3873,6 +3954,15 @@ exports[`array - update 17`] = `
38733954

38743955
exports[`array - update 18`] = `
38753956
[
3957+
{
3958+
"op": "replace",
3959+
"path": [
3960+
"a",
3961+
2,
3962+
"i",
3963+
],
3964+
"value": 1,
3965+
},
38763966
{
38773967
"op": "replace",
38783968
"path": [
@@ -4496,6 +4586,15 @@ exports[`array - update 20`] = `
44964586

44974587
exports[`array - update 21`] = `
44984588
[
4589+
{
4590+
"op": "replace",
4591+
"path": [
4592+
"a",
4593+
2,
4594+
"i",
4595+
],
4596+
"value": 18,
4597+
},
44994598
{
45004599
"op": "replace",
45014600
"path": [
@@ -4701,6 +4800,15 @@ exports[`array - update 21`] = `
47014800

47024801
exports[`array - update 22`] = `
47034802
[
4803+
{
4804+
"op": "replace",
4805+
"path": [
4806+
"a",
4807+
2,
4808+
"i",
4809+
],
4810+
"value": 17,
4811+
},
47044812
{
47054813
"op": "replace",
47064814
"path": [

0 commit comments

Comments
 (0)