make all proxies immutable

pull/12348/head
Rich Harris 2 years ago
parent e049e85c43
commit c056f88778

@ -11,7 +11,7 @@ import {
object_prototype
} from './utils.js';
import { check_ownership, widen_ownership } from './dev/ownership.js';
import { mutable_source, source, set } from './reactivity/sources.js';
import { source, set } from './reactivity/sources.js';
import { STATE_FROZEN_SYMBOL, STATE_SYMBOL } from './constants.js';
import { UNINITIALIZED } from '../../constants.js';
import * as e from './errors.js';
@ -19,7 +19,7 @@ import * as e from './errors.js';
/**
* @template T
* @param {T} value
* @param {boolean} [immutable]
* @param {true} [immutable]
* @param {import('#client').ProxyMetadata | null} [parent]
* @param {import('#client').Source<T>} [prev] dev mode only
* @returns {import('#client').ProxyStateObject<T> | T}
@ -59,7 +59,6 @@ export function proxy(value, immutable = true, parent = null, prev) {
s: new Map(),
v: source(0),
a: is_array(value),
i: immutable,
p: proxy,
t: value
}),
@ -169,7 +168,7 @@ const state_proxy_handler = {
const metadata = target[STATE_SYMBOL];
const s = metadata.s.get(prop);
if (s !== undefined) set(s, proxy(descriptor.value, metadata.i, metadata));
if (s !== undefined) set(s, proxy(descriptor.value, true, metadata));
}
return Reflect.defineProperty(target, prop, descriptor);
@ -215,7 +214,7 @@ const state_proxy_handler = {
// create a source, but only if it's an own property and not a prototype property
if (s === undefined && (!(prop in target) || get_descriptor(target, prop)?.writable)) {
s = (metadata.i ? source : mutable_source)(proxy(target[prop], metadata.i, metadata));
s = source(proxy(target[prop], true, metadata));
metadata.s.set(prop, s);
}
@ -256,9 +255,7 @@ const state_proxy_handler = {
(current_effect !== null && (!has || get_descriptor(target, prop)?.writable))
) {
if (s === undefined) {
s = (metadata.i ? source : mutable_source)(
has ? proxy(target[prop], metadata.i, metadata) : UNINITIALIZED
);
s = source(has ? proxy(target[prop], true, metadata) : UNINITIALIZED);
metadata.s.set(prop, s);
}
const value = get(s);
@ -283,7 +280,7 @@ const state_proxy_handler = {
s = metadata.s.get(prop);
}
if (s !== undefined) {
set(s, proxy(value, metadata.i, metadata));
set(s, proxy(value, true, metadata));
}
const is_array = metadata.a;
const not_has = !(prop in target);

@ -180,8 +180,6 @@ export interface ProxyMetadata<T = Record<string | symbol, any>> {
v: Source<number>;
/** `true` if the proxified object is an array */
a: boolean;
/** Immutable: Whether to use a source or mutable source under the hood */
i: boolean;
/** The associated proxy */
p: ProxyStateObject<T>;
/** The original target this proxy was created for */

Loading…
Cancel
Save