Skip to content

Commit b034ced

Browse files
committed
refactor(array): refactor array remove
1 parent ba4e5bc commit b034ced

File tree

6 files changed

+154
-188
lines changed

6 files changed

+154
-188
lines changed

src/draft.ts

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
markFinalization,
3131
finalizePatches,
3232
isDraft,
33-
skipFinalization,
3433
} from './utils';
3534
import { checkReadable } from './unsafe';
3635
import { generatePatches } from './patch';
@@ -92,29 +91,24 @@ const proxyHandler: ProxyHandler<ProxyDraft> = {
9291

9392
if (!has(source, key)) {
9493
const desc = getDescriptor(source, key);
94+
const value = desc?.value;
9595
if (target.type === DraftType.Array) {
96-
if (
97-
[
98-
'splice',
99-
'push',
100-
'pop',
101-
'shift',
102-
'unshift',
103-
'sort',
104-
'reverse',
105-
].includes(key as string)
106-
) {
96+
if (['splice', 'shift', 'unshift', 'reverse'].includes(key as string)) {
10797
return function (this: any, ...args: any[]) {
98+
let returnValue: any;
10899
arrayHandling = true;
109-
const result = desc!.value.apply(this, args);
110-
arrayHandling = false;
111-
return result;
100+
try {
101+
returnValue = value.apply(this, args);
102+
} finally {
103+
arrayHandling = false;
104+
}
105+
return returnValue;
112106
};
113107
}
114108
}
115109
return desc
116110
? `value` in desc
117-
? desc.value
111+
? value
118112
: // !case: support for getter
119113
desc.get?.call(target.proxy)
120114
: undefined;
@@ -147,9 +141,9 @@ const proxyHandler: ProxyHandler<ProxyDraft> = {
147141
return target.copy![key];
148142
}
149143
if (arrayHandling && !isDraft(value)) {
150-
skipFinalization.add(value);
151-
} else if (skipFinalization.has(value)) {
152-
skipFinalization.delete(value);
144+
target.options.skipFinalization!.add(value);
145+
} else if (target.options.skipFinalization!.has(value)) {
146+
target.options.skipFinalization!.delete(value);
153147
}
154148
return value;
155149
},

src/draftify.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { dataTypes } from './constant';
1212
export function draftify<
1313
T extends object,
1414
O extends PatchesOptions = false,
15-
F extends boolean = false
15+
F extends boolean = false,
1616
>(
1717
baseState: T,
1818
options: Options<O, F>

src/interface.ts

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ export interface ProxyDraft<T = any> {
4242
copy: T | null;
4343
proxy: T | null;
4444
finalities: Finalities;
45-
options: Options<any, any> & { updatedValues?: WeakMap<any, any> };
45+
options: Options<any, any> & {
46+
updatedValues?: WeakMap<any, any>;
47+
skipFinalization?: WeakSet<any>;
48+
};
4649
parent?: ProxyDraft | null;
4750
key?: string | number | symbol;
4851
setMap?: Map<any, ProxyDraft>;
@@ -62,30 +65,30 @@ export type Patch<P extends PatchesOptions = any> = P extends {
6265
path: string;
6366
}
6467
: P extends true | object
65-
? IPatch & {
66-
path: (string | number)[];
67-
}
68-
: IPatch & {
69-
path: string | (string | number)[];
70-
};
68+
? IPatch & {
69+
path: (string | number)[];
70+
}
71+
: IPatch & {
72+
path: string | (string | number)[];
73+
};
7174

7275
export type Patches<P extends PatchesOptions = any> = Patch<P>[];
7376

7477
export type Result<
7578
T extends any,
7679
O extends PatchesOptions,
77-
F extends boolean
80+
F extends boolean,
7881
> = O extends true | object
7982
? [F extends true ? Immutable<T> : T, Patches<O>, Patches<O>]
8083
: F extends true
81-
? Immutable<T>
82-
: T;
84+
? Immutable<T>
85+
: T;
8386

8487
export type CreateResult<
8588
T extends any,
8689
O extends PatchesOptions,
8790
F extends boolean,
88-
R extends void | Promise<void> | T | Promise<T>
91+
R extends void | Promise<void> | T | Promise<T>,
8992
> = R extends Promise<void> | Promise<T>
9093
? Promise<Result<T, O, F>>
9194
: Result<T, O, F>;
@@ -99,8 +102,8 @@ export type Mark<O extends PatchesOptions, F extends boolean> = (
99102
) => O extends true | object
100103
? BaseMark
101104
: F extends true
102-
? BaseMark
103-
: MarkWithCopy;
105+
? BaseMark
106+
: MarkWithCopy;
104107

105108
export interface Options<O extends PatchesOptions, F extends boolean> {
106109
/**
@@ -154,8 +157,8 @@ export type IfAvailable<T, Fallback = void> = true | false extends (
154157
)
155158
? Fallback
156159
: keyof T extends never
157-
? Fallback
158-
: T;
160+
? Fallback
161+
: T;
159162
type WeakReferences =
160163
| IfAvailable<WeakMap<any, any>>
161164
| IfAvailable<WeakSet<any>>;
@@ -164,14 +167,14 @@ type AtomicObject = Function | Promise<any> | Date | RegExp;
164167
export type Immutable<T> = T extends Primitive | AtomicObject
165168
? T
166169
: T extends IfAvailable<ReadonlyMap<infer K, infer V>>
167-
? ImmutableMap<K, V>
168-
: T extends IfAvailable<ReadonlySet<infer V>>
169-
? ImmutableSet<V>
170-
: T extends WeakReferences
171-
? T
172-
: T extends object
173-
? ImmutableObject<T>
174-
: T;
170+
? ImmutableMap<K, V>
171+
: T extends IfAvailable<ReadonlySet<infer V>>
172+
? ImmutableSet<V>
173+
: T extends WeakReferences
174+
? T
175+
: T extends object
176+
? ImmutableObject<T>
177+
: T;
175178

176179
type DraftedMap<K, V> = Map<K, Draft<V>>;
177180
type DraftedSet<T> = Set<Draft<T>>;
@@ -182,11 +185,11 @@ type DraftedObject<T> = {
182185
export type Draft<T> = T extends Primitive | AtomicObject
183186
? T
184187
: T extends IfAvailable<ReadonlyMap<infer K, infer V>>
185-
? DraftedMap<K, V>
186-
: T extends IfAvailable<ReadonlySet<infer V>>
187-
? DraftedSet<V>
188-
: T extends WeakReferences
189-
? T
190-
: T extends object
191-
? DraftedObject<T>
192-
: T;
188+
? DraftedMap<K, V>
189+
: T extends IfAvailable<ReadonlySet<infer V>>
190+
? DraftedSet<V>
191+
: T extends WeakReferences
192+
? T
193+
: T extends object
194+
? DraftedObject<T>
195+
: T;

src/makeCreator.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ import { RAW_RETURN_SYMBOL, dataTypes } from './constant';
2020

2121
type MakeCreator = <
2222
_F extends boolean = false,
23-
_O extends PatchesOptions = false
23+
_O extends PatchesOptions = false,
2424
>(
2525
options?: ExternalOptions<_O, _F>
2626
) => {
2727
<
2828
T extends any,
2929
F extends boolean = _F,
3030
O extends PatchesOptions = _O,
31-
R extends void | Promise<void> | T | Promise<T> = void
31+
R extends void | Promise<void> | T | Promise<T> = void,
3232
>(
3333
base: T,
3434
mutate: (draft: Draft<T>) => R,
@@ -38,7 +38,7 @@ type MakeCreator = <
3838
T extends any,
3939
F extends boolean = _F,
4040
O extends PatchesOptions = _O,
41-
R extends void | Promise<void> = void
41+
R extends void | Promise<void> = void,
4242
>(
4343
base: T,
4444
mutate: (draft: T) => R,
@@ -49,7 +49,7 @@ type MakeCreator = <
4949
P extends any[] = [],
5050
F extends boolean = _F,
5151
O extends PatchesOptions = _O,
52-
R extends void | Promise<void> = void
52+
R extends void | Promise<void> = void,
5353
>(
5454
mutate: (draft: Draft<T>, ...args: P) => R,
5555
options?: ExternalOptions<O, F>
@@ -143,11 +143,14 @@ export const makeCreator: MakeCreator = (arg) => {
143143
const enablePatches = options.enablePatches ?? false;
144144
const strict = options.strict ?? false;
145145
const enableAutoFreeze = options.enableAutoFreeze ?? false;
146-
const _options: Options<any, any> = {
146+
const _options: Options<any, any> & {
147+
skipFinalization: WeakSet<any>;
148+
} = {
147149
enableAutoFreeze,
148150
mark,
149151
strict,
150152
enablePatches,
153+
skipFinalization: new WeakSet(),
151154
};
152155
if (
153156
!isDraftable(state, _options) &&

src/utils/finalize.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import {
1212
} from './draft';
1313
import { forEach } from './forEach';
1414

15-
export const skipFinalization = new WeakSet();
16-
1715
export function handleValue(
1816
target: any,
1917
handledSet: WeakSet<any>,
@@ -24,7 +22,7 @@ export function handleValue(
2422
!isDraftable(target, options) ||
2523
handledSet.has(target) ||
2624
Object.isFrozen(target) ||
27-
skipFinalization.has(target)
25+
options?.skipFinalization!.has(target)
2826
)
2927
return;
3028
const isSet = target instanceof Set;

0 commit comments

Comments
 (0)