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

@ -22,6 +22,10 @@ export const HEAD_EFFECT = 1 << 19;
export const EFFECT_HAS_DERIVED = 1 << 20; export const EFFECT_HAS_DERIVED = 1 << 20;
export const EFFECT_IS_UPDATING = 1 << 21; 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 STATE_SYMBOL = Symbol('$state');
export const LEGACY_PROPS = Symbol('legacy props'); export const LEGACY_PROPS = Symbol('legacy props');
export const LOADING_ATTR_SYMBOL = Symbol(''); export const LOADING_ATTR_SYMBOL = Symbol('');

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

Loading…
Cancel
Save