|
|
@ -49,47 +49,47 @@ let is_inspecting_signal = false;
|
|
|
|
|
|
|
|
|
|
|
|
// Handle effect queues
|
|
|
|
// Handle effect queues
|
|
|
|
|
|
|
|
|
|
|
|
/** @type {import('./types.js').Effect[]} */
|
|
|
|
/** @type {import('#client').Effect[]} */
|
|
|
|
let current_queued_root_effects = [];
|
|
|
|
let current_queued_root_effects = [];
|
|
|
|
|
|
|
|
|
|
|
|
let flush_count = 0;
|
|
|
|
let flush_count = 0;
|
|
|
|
// Handle signal reactivity tree dependencies and reactions
|
|
|
|
// Handle signal reactivity tree dependencies and reactions
|
|
|
|
|
|
|
|
|
|
|
|
/** @type {null | import('./types.js').Reaction} */
|
|
|
|
/** @type {null | import('#client').Reaction} */
|
|
|
|
export let current_reaction = null;
|
|
|
|
export let current_reaction = null;
|
|
|
|
|
|
|
|
|
|
|
|
/** @param {null | import('./types.js').Reaction} reaction */
|
|
|
|
/** @param {null | import('#client').Reaction} reaction */
|
|
|
|
export function set_current_reaction(reaction) {
|
|
|
|
export function set_current_reaction(reaction) {
|
|
|
|
current_reaction = reaction;
|
|
|
|
current_reaction = reaction;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** @type {null | import('./types.js').Effect} */
|
|
|
|
/** @type {null | import('#client').Effect} */
|
|
|
|
export let current_effect = null;
|
|
|
|
export let current_effect = null;
|
|
|
|
|
|
|
|
|
|
|
|
/** @param {null | import('./types.js').Effect} effect */
|
|
|
|
/** @param {null | import('#client').Effect} effect */
|
|
|
|
export function set_current_effect(effect) {
|
|
|
|
export function set_current_effect(effect) {
|
|
|
|
current_effect = effect;
|
|
|
|
current_effect = effect;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** @type {null | import('./types.js').Value[]} */
|
|
|
|
/** @type {null | import('#client').Value[]} */
|
|
|
|
export let current_dependencies = null;
|
|
|
|
export let current_dependencies = null;
|
|
|
|
let current_dependencies_index = 0;
|
|
|
|
let current_dependencies_index = 0;
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Tracks writes that the effect it's executed in doesn't listen to yet,
|
|
|
|
* Tracks writes that the effect it's executed in doesn't listen to yet,
|
|
|
|
* so that the dependency can be added to the effect later on if it then reads it
|
|
|
|
* so that the dependency can be added to the effect later on if it then reads it
|
|
|
|
* @type {null | import('./types.js').Source[]}
|
|
|
|
* @type {null | import('#client').Source[]}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export let current_untracked_writes = null;
|
|
|
|
export let current_untracked_writes = null;
|
|
|
|
|
|
|
|
|
|
|
|
/** @param {null | import('./types.js').Source[]} value */
|
|
|
|
/** @param {null | import('#client').Source[]} value */
|
|
|
|
export function set_current_untracked_writes(value) {
|
|
|
|
export function set_current_untracked_writes(value) {
|
|
|
|
current_untracked_writes = value;
|
|
|
|
current_untracked_writes = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** @type {null | import('./types.js').ValueDebug} */
|
|
|
|
/** @type {null | import('#client').ValueDebug} */
|
|
|
|
export let last_inspected_signal = null;
|
|
|
|
export let last_inspected_signal = null;
|
|
|
|
|
|
|
|
|
|
|
|
/** @param {null | import('./types.js').ValueDebug} signal */
|
|
|
|
/** @param {null | import('#client').ValueDebug} signal */
|
|
|
|
export function set_last_inspected_signal(signal) {
|
|
|
|
export function set_last_inspected_signal(signal) {
|
|
|
|
last_inspected_signal = signal;
|
|
|
|
last_inspected_signal = signal;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -105,10 +105,10 @@ export let is_signals_recorded = false;
|
|
|
|
let captured_signals = new Set();
|
|
|
|
let captured_signals = new Set();
|
|
|
|
|
|
|
|
|
|
|
|
// Handling runtime component context
|
|
|
|
// Handling runtime component context
|
|
|
|
/** @type {import('./types.js').ComponentContext | null} */
|
|
|
|
/** @type {import('#client').ComponentContext | null} */
|
|
|
|
export let current_component_context = null;
|
|
|
|
export let current_component_context = null;
|
|
|
|
|
|
|
|
|
|
|
|
/** @param {import('./types.js').ComponentContext | null} context */
|
|
|
|
/** @param {import('#client').ComponentContext | null} context */
|
|
|
|
export function set_current_component_context(context) {
|
|
|
|
export function set_current_component_context(context) {
|
|
|
|
current_component_context = context;
|
|
|
|
current_component_context = context;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -119,7 +119,7 @@ export function is_runes() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').ProxyStateObject} target
|
|
|
|
* @param {import('#client').ProxyStateObject} target
|
|
|
|
* @param {string | symbol} prop
|
|
|
|
* @param {string | symbol} prop
|
|
|
|
* @param {any} receiver
|
|
|
|
* @param {any} receiver
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -153,7 +153,7 @@ export function batch_inspect(target, prop, receiver) {
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Determines whether a derived or effect is dirty.
|
|
|
|
* Determines whether a derived or effect is dirty.
|
|
|
|
* If it is MAYBE_DIRTY, will set the status to CLEAN
|
|
|
|
* If it is MAYBE_DIRTY, will set the status to CLEAN
|
|
|
|
* @param {import('./types.js').Reaction} reaction
|
|
|
|
* @param {import('#client').Reaction} reaction
|
|
|
|
* @returns {boolean}
|
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function check_dirtiness(reaction) {
|
|
|
|
export function check_dirtiness(reaction) {
|
|
|
@ -218,7 +218,7 @@ export function check_dirtiness(reaction) {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @template V
|
|
|
|
* @template V
|
|
|
|
* @param {import('./types.js').Reaction} signal
|
|
|
|
* @param {import('#client').Reaction} signal
|
|
|
|
* @returns {V}
|
|
|
|
* @returns {V}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function execute_reaction_fn(signal) {
|
|
|
|
export function execute_reaction_fn(signal) {
|
|
|
@ -229,7 +229,7 @@ export function execute_reaction_fn(signal) {
|
|
|
|
const previous_skip_reaction = current_skip_reaction;
|
|
|
|
const previous_skip_reaction = current_skip_reaction;
|
|
|
|
const previous_untracking = current_untracking;
|
|
|
|
const previous_untracking = current_untracking;
|
|
|
|
|
|
|
|
|
|
|
|
current_dependencies = /** @type {null | import('./types.js').Value[]} */ (null);
|
|
|
|
current_dependencies = /** @type {null | import('#client').Value[]} */ (null);
|
|
|
|
current_dependencies_index = 0;
|
|
|
|
current_dependencies_index = 0;
|
|
|
|
current_untracked_writes = null;
|
|
|
|
current_untracked_writes = null;
|
|
|
|
current_reaction = signal;
|
|
|
|
current_reaction = signal;
|
|
|
@ -238,7 +238,7 @@ export function execute_reaction_fn(signal) {
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
let res = signal.fn();
|
|
|
|
let res = signal.fn();
|
|
|
|
let dependencies = /** @type {import('./types.js').Value<unknown>[]} **/ (signal.deps);
|
|
|
|
let dependencies = /** @type {import('#client').Value<unknown>[]} **/ (signal.deps);
|
|
|
|
if (current_dependencies !== null) {
|
|
|
|
if (current_dependencies !== null) {
|
|
|
|
let i;
|
|
|
|
let i;
|
|
|
|
if (dependencies !== null) {
|
|
|
|
if (dependencies !== null) {
|
|
|
@ -273,7 +273,7 @@ export function execute_reaction_fn(signal) {
|
|
|
|
dependencies[current_dependencies_index + i] = current_dependencies[i];
|
|
|
|
dependencies[current_dependencies_index + i] = current_dependencies[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
signal.deps = /** @type {import('./types.js').Value<V>[]} **/ (
|
|
|
|
signal.deps = /** @type {import('#client').Value<V>[]} **/ (
|
|
|
|
dependencies = current_dependencies
|
|
|
|
dependencies = current_dependencies
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -311,8 +311,8 @@ export function execute_reaction_fn(signal) {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @template V
|
|
|
|
* @template V
|
|
|
|
* @param {import('./types.js').Reaction} signal
|
|
|
|
* @param {import('#client').Reaction} signal
|
|
|
|
* @param {import('./types.js').Value<V>} dependency
|
|
|
|
* @param {import('#client').Value<V>} dependency
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function remove_reaction(signal, dependency) {
|
|
|
|
function remove_reaction(signal, dependency) {
|
|
|
@ -334,12 +334,12 @@ function remove_reaction(signal, dependency) {
|
|
|
|
if (reactions_length === 0 && (dependency.f & UNOWNED) !== 0) {
|
|
|
|
if (reactions_length === 0 && (dependency.f & UNOWNED) !== 0) {
|
|
|
|
// If the signal is unowned then we need to make sure to change it to dirty.
|
|
|
|
// If the signal is unowned then we need to make sure to change it to dirty.
|
|
|
|
set_signal_status(dependency, DIRTY);
|
|
|
|
set_signal_status(dependency, DIRTY);
|
|
|
|
remove_reactions(/** @type {import('./types.js').Derived} **/ (dependency), 0);
|
|
|
|
remove_reactions(/** @type {import('#client').Derived} **/ (dependency), 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Reaction} signal
|
|
|
|
* @param {import('#client').Reaction} signal
|
|
|
|
* @param {number} start_index
|
|
|
|
* @param {number} start_index
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -359,7 +359,7 @@ export function remove_reactions(signal, start_index) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Reaction} signal
|
|
|
|
* @param {import('#client').Reaction} signal
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function destroy_effect_children(signal) {
|
|
|
|
export function destroy_effect_children(signal) {
|
|
|
@ -375,7 +375,7 @@ export function destroy_effect_children(signal) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Effect} effect
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function execute_effect(effect) {
|
|
|
|
export function execute_effect(effect) {
|
|
|
@ -424,7 +424,7 @@ function infinite_loop_guard() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {Array<import('./types.js').Effect>} root_effects
|
|
|
|
* @param {Array<import('#client').Effect>} root_effects
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function flush_queued_root_effects(root_effects) {
|
|
|
|
function flush_queued_root_effects(root_effects) {
|
|
|
@ -435,7 +435,7 @@ function flush_queued_root_effects(root_effects) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {Array<import('./types.js').Effect>} effects
|
|
|
|
* @param {Array<import('#client').Effect>} effects
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function flush_queued_effects(effects) {
|
|
|
|
function flush_queued_effects(effects) {
|
|
|
@ -466,7 +466,7 @@ function process_microtask() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Effect} signal
|
|
|
|
* @param {import('#client').Effect} signal
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function schedule_effect(signal) {
|
|
|
|
export function schedule_effect(signal) {
|
|
|
@ -499,10 +499,10 @@ export function schedule_effect(signal) {
|
|
|
|
* bitwise flag passed in only. The collected effects array will be populated with all the user
|
|
|
|
* bitwise flag passed in only. The collected effects array will be populated with all the user
|
|
|
|
* effects to be flushed.
|
|
|
|
* effects to be flushed.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param {import('./types.js').Effect} effect
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
* @param {number} filter_flags
|
|
|
|
* @param {number} filter_flags
|
|
|
|
* @param {boolean} shallow
|
|
|
|
* @param {boolean} shallow
|
|
|
|
* @param {import('./types.js').Effect[]} collected_effects
|
|
|
|
* @param {import('#client').Effect[]} collected_effects
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function process_effects(effect, filter_flags, shallow, collected_effects) {
|
|
|
|
function process_effects(effect, filter_flags, shallow, collected_effects) {
|
|
|
@ -591,7 +591,7 @@ function process_effects(effect, filter_flags, shallow, collected_effects) {
|
|
|
|
* Effects will be collected when they match the filtered bitwise flag passed in only. The collected
|
|
|
|
* Effects will be collected when they match the filtered bitwise flag passed in only. The collected
|
|
|
|
* array will be populated with all the effects.
|
|
|
|
* array will be populated with all the effects.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param {import('./types.js').Effect} effect
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
* @param {number} filter_flags
|
|
|
|
* @param {number} filter_flags
|
|
|
|
* @param {boolean} [shallow]
|
|
|
|
* @param {boolean} [shallow]
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
@ -617,7 +617,7 @@ function flush_nested_effects(effect, filter_flags, shallow = false) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Effect} effect
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function flush_local_render_effects(effect) {
|
|
|
|
export function flush_local_render_effects(effect) {
|
|
|
@ -640,7 +640,7 @@ export function flush_sync(fn, flush_previous = true) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
infinite_loop_guard();
|
|
|
|
infinite_loop_guard();
|
|
|
|
|
|
|
|
|
|
|
|
/** @type {import('./types.js').Effect[]} */
|
|
|
|
/** @type {import('#client').Effect[]} */
|
|
|
|
const root_effects = [];
|
|
|
|
const root_effects = [];
|
|
|
|
|
|
|
|
|
|
|
|
current_scheduler_mode = FLUSH_SYNC;
|
|
|
|
current_scheduler_mode = FLUSH_SYNC;
|
|
|
@ -679,7 +679,7 @@ export async function tick() {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @template V
|
|
|
|
* @template V
|
|
|
|
* @param {import('./types.js').Value<V>} signal
|
|
|
|
* @param {import('#client').Value<V>} signal
|
|
|
|
* @returns {V}
|
|
|
|
* @returns {V}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function get(signal) {
|
|
|
|
export function get(signal) {
|
|
|
@ -744,10 +744,10 @@ export function get(signal) {
|
|
|
|
// we want to avoid tracking indirect dependencies
|
|
|
|
// we want to avoid tracking indirect dependencies
|
|
|
|
const previous_inspect_fn = inspect_fn;
|
|
|
|
const previous_inspect_fn = inspect_fn;
|
|
|
|
set_inspect_fn(null);
|
|
|
|
set_inspect_fn(null);
|
|
|
|
update_derived(/** @type {import('./types.js').Derived} **/ (signal), false);
|
|
|
|
update_derived(/** @type {import('#client').Derived} **/ (signal), false);
|
|
|
|
set_inspect_fn(previous_inspect_fn);
|
|
|
|
set_inspect_fn(previous_inspect_fn);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
update_derived(/** @type {import('./types.js').Derived} **/ (signal), false);
|
|
|
|
update_derived(/** @type {import('#client').Derived} **/ (signal), false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -849,7 +849,7 @@ export function untrack(fn) {
|
|
|
|
const STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);
|
|
|
|
const STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Signal} signal
|
|
|
|
* @param {import('#client').Signal} signal
|
|
|
|
* @param {number} status
|
|
|
|
* @param {number} status
|
|
|
|
* @returns {void}
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -859,14 +859,14 @@ export function set_signal_status(signal, status) {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @template V
|
|
|
|
* @template V
|
|
|
|
* @param {V | import('./types.js').Value<V>} val
|
|
|
|
* @param {V | import('#client').Value<V>} val
|
|
|
|
* @returns {val is import('./types.js').Value<V>}
|
|
|
|
* @returns {val is import('#client').Value<V>}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function is_signal(val) {
|
|
|
|
export function is_signal(val) {
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|
typeof val === 'object' &&
|
|
|
|
typeof val === 'object' &&
|
|
|
|
val !== null &&
|
|
|
|
val !== null &&
|
|
|
|
typeof (/** @type {import('./types.js').Value<V>} */ (val).f) === 'number'
|
|
|
|
typeof (/** @type {import('#client').Value<V>} */ (val).f) === 'number'
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -964,7 +964,7 @@ function get_or_init_context_map() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').ComponentContext} component_context
|
|
|
|
* @param {import('#client').ComponentContext} component_context
|
|
|
|
* @returns {Map<unknown, unknown> | null}
|
|
|
|
* @returns {Map<unknown, unknown> | null}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function get_parent_context(component_context) {
|
|
|
|
function get_parent_context(component_context) {
|
|
|
@ -980,7 +980,7 @@ function get_parent_context(component_context) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Value<number>} signal
|
|
|
|
* @param {import('#client').Value<number>} signal
|
|
|
|
* @param {1 | -1} [d]
|
|
|
|
* @param {1 | -1} [d]
|
|
|
|
* @returns {number}
|
|
|
|
* @returns {number}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -991,7 +991,7 @@ export function update(signal, d = 1) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param {import('./types.js').Value<number>} signal
|
|
|
|
* @param {import('#client').Value<number>} signal
|
|
|
|
* @param {1 | -1} [d]
|
|
|
|
* @param {1 | -1} [d]
|
|
|
|
* @returns {number}
|
|
|
|
* @returns {number}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|