pull/16060/head
ComputerGuy 4 months ago
parent 4d5a28f862
commit 58820a67c8

@ -22,7 +22,11 @@ export const HEAD_EFFECT = 1 << 19;
export const EFFECT_HAS_DERIVED = 1 << 20;
export const EFFECT_IS_UPDATING = 1 << 21;
export const PROXY_PRESERVE_PATH = 1 << 1;
export const PROXY_CHANGE_PATH = 1 << 2;
export const PROXY_REMOVE_PATH = 1 << 3;
export const STATE_SYMBOL = Symbol('$state');
export const LEGACY_PROPS = Symbol('legacy props');
export const LOADING_ATTR_SYMBOL = Symbol('');
export const PROXY_PATH_SYMBOL = Symbol('proxy path');
export const PROXY_PATH_SYMBOL = Symbol('proxy path');

@ -9,7 +9,13 @@ import {
object_prototype
} from '../shared/utils.js';
import { state as source, set } from './reactivity/sources.js';
import { PROXY_PATH_SYMBOL, STATE_SYMBOL } from '#client/constants';
import {
PROXY_CHANGE_PATH,
PROXY_PATH_SYMBOL,
PROXY_PRESERVE_PATH,
PROXY_REMOVE_PATH,
STATE_SYMBOL
} from '#client/constants';
import { UNINITIALIZED } from '../../constants.js';
import * as e from './errors.js';
import { get_stack, tag_source } from './dev/tracing.js';
@ -19,20 +25,20 @@ import { tracing_mode_flag } from '../flags/index.js';
* @template T
* @param {T} value
* @param {string} [path]
* @param {boolean} [preserve_path]
* @param {number} [path_preservation]
* @returns {T}
*/
export function proxy(value, path, preserve_path = true) {
export function proxy(value, path, path_preservation = PROXY_PRESERVE_PATH) {
// if `DEV`, change the proxy `path` since we don't know if its still "owned" by its original source
if (
DEV &&
!preserve_path &&
(path_preservation & PROXY_PRESERVE_PATH) === 0 &&
typeof value === 'object' &&
value !== null &&
STATE_SYMBOL in value &&
PROXY_PATH_SYMBOL in value
) {
value[PROXY_PATH_SYMBOL] = '[$state proxy]';
value[PROXY_PATH_SYMBOL] = (path_preservation & PROXY_CHANGE_PATH) === 0 ? '[$state proxy]' : path;
}
// if non-proxyable, or is already a proxy, return `value`
if (typeof value !== 'object' || value === null || STATE_SYMBOL in value) {
@ -257,7 +263,7 @@ export function proxy(value, path, preserve_path = true) {
s = DEV ? tag_source(s, to_trace_name(prop)) : s;
set(
s,
with_parent(() => proxy(value, to_trace_name(prop)))
with_parent(() => proxy(value, to_trace_name(prop), PROXY_CHANGE_PATH))
);
sources.set(prop, s);
}
@ -265,7 +271,7 @@ export function proxy(value, path, preserve_path = true) {
has = s.v !== UNINITIALIZED;
set(
s,
with_parent(() => proxy(value, to_trace_name(prop)))
with_parent(() => proxy(value, to_trace_name(prop), PROXY_CHANGE_PATH))
);
}

@ -27,7 +27,8 @@ import {
UNOWNED,
MAYBE_DIRTY,
BLOCK_EFFECT,
ROOT_EFFECT
ROOT_EFFECT,
PROXY_REMOVE_PATH
} from '#client/constants';
import * as e from '../errors.js';
import { legacy_mode_flag, tracing_mode_flag } from '../../flags/index.js';
@ -139,7 +140,9 @@ export function set(source, value, should_proxy = false) {
e.state_unsafe_mutation();
}
let new_value = should_proxy ? proxy(value, DEV ? source.trace_name : undefined, DEV ? false : undefined) : value;
let new_value = should_proxy
? proxy(value, DEV ? source.trace_name : undefined, DEV ? PROXY_REMOVE_PATH : undefined)
: value;
return internal_set(source, new_value);
}

Loading…
Cancel
Save