|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
/** @import { ComponentContext, ComponentContextLegacy, Effect, Reaction, TemplateNode, TransitionManager } from '#client' */
|
|
|
|
|
import {
|
|
|
|
|
check_dirtiness,
|
|
|
|
|
current_component_context,
|
|
|
|
@ -57,8 +58,8 @@ export function validate_effect(rune) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import("#client").Effect} effect
|
|
|
|
|
* @param {import("#client").Reaction} parent_effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
* @param {Reaction} parent_effect
|
|
|
|
|
*/
|
|
|
|
|
export function push_effect(effect, parent_effect) {
|
|
|
|
|
var parent_last = parent_effect.last;
|
|
|
|
@ -76,12 +77,12 @@ export function push_effect(effect, parent_effect) {
|
|
|
|
|
* @param {null | (() => void | (() => void))} fn
|
|
|
|
|
* @param {boolean} sync
|
|
|
|
|
* @param {boolean} push
|
|
|
|
|
* @returns {import('#client').Effect}
|
|
|
|
|
* @returns {Effect}
|
|
|
|
|
*/
|
|
|
|
|
function create_effect(type, fn, sync, push = true) {
|
|
|
|
|
var is_root = (type & ROOT_EFFECT) !== 0;
|
|
|
|
|
|
|
|
|
|
/** @type {import('#client').Effect} */
|
|
|
|
|
/** @type {Effect} */
|
|
|
|
|
var effect = {
|
|
|
|
|
ctx: current_component_context,
|
|
|
|
|
deps: null,
|
|
|
|
@ -187,7 +188,7 @@ export function user_effect(fn) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (defer) {
|
|
|
|
|
var context = /** @type {import('#client').ComponentContext} */ (current_component_context);
|
|
|
|
|
var context = /** @type {ComponentContext} */ (current_component_context);
|
|
|
|
|
(context.e ??= []).push(fn);
|
|
|
|
|
} else {
|
|
|
|
|
var signal = effect(fn);
|
|
|
|
@ -198,7 +199,7 @@ export function user_effect(fn) {
|
|
|
|
|
/**
|
|
|
|
|
* Internal representation of `$effect.pre(...)`
|
|
|
|
|
* @param {() => void | (() => void)} fn
|
|
|
|
|
* @returns {import('#client').Effect}
|
|
|
|
|
* @returns {Effect}
|
|
|
|
|
*/
|
|
|
|
|
export function user_pre_effect(fn) {
|
|
|
|
|
validate_effect('$effect.pre');
|
|
|
|
@ -229,7 +230,7 @@ export function effect_root(fn) {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {() => void | (() => void)} fn
|
|
|
|
|
* @returns {import('#client').Effect}
|
|
|
|
|
* @returns {Effect}
|
|
|
|
|
*/
|
|
|
|
|
export function effect(fn) {
|
|
|
|
|
return create_effect(EFFECT, fn, false);
|
|
|
|
@ -241,9 +242,9 @@ export function effect(fn) {
|
|
|
|
|
* @param {() => void | (() => void)} fn
|
|
|
|
|
*/
|
|
|
|
|
export function legacy_pre_effect(deps, fn) {
|
|
|
|
|
var context = /** @type {import('#client').ComponentContextLegacy} */ (current_component_context);
|
|
|
|
|
var context = /** @type {ComponentContextLegacy} */ (current_component_context);
|
|
|
|
|
|
|
|
|
|
/** @type {{ effect: null | import('#client').Effect, ran: boolean }} */
|
|
|
|
|
/** @type {{ effect: null | Effect, ran: boolean }} */
|
|
|
|
|
var token = { effect: null, ran: false };
|
|
|
|
|
context.l.r1.push(token);
|
|
|
|
|
|
|
|
|
@ -261,7 +262,7 @@ export function legacy_pre_effect(deps, fn) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function legacy_pre_effect_reset() {
|
|
|
|
|
var context = /** @type {import('#client').ComponentContextLegacy} */ (current_component_context);
|
|
|
|
|
var context = /** @type {ComponentContextLegacy} */ (current_component_context);
|
|
|
|
|
|
|
|
|
|
render_effect(() => {
|
|
|
|
|
if (!get(context.l.r2)) return;
|
|
|
|
@ -283,7 +284,7 @@ export function legacy_pre_effect_reset() {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {() => void | (() => void)} fn
|
|
|
|
|
* @returns {import('#client').Effect}
|
|
|
|
|
* @returns {Effect}
|
|
|
|
|
*/
|
|
|
|
|
export function render_effect(fn) {
|
|
|
|
|
return create_effect(RENDER_EFFECT, fn, true);
|
|
|
|
@ -291,7 +292,7 @@ export function render_effect(fn) {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {() => void | (() => void)} fn
|
|
|
|
|
* @returns {import('#client').Effect}
|
|
|
|
|
* @returns {Effect}
|
|
|
|
|
*/
|
|
|
|
|
export function template_effect(fn) {
|
|
|
|
|
if (DEV) {
|
|
|
|
@ -319,7 +320,7 @@ export function branch(fn, push = true) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import("#client").Effect} effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
*/
|
|
|
|
|
export function execute_effect_teardown(effect) {
|
|
|
|
|
var teardown = effect.teardown;
|
|
|
|
@ -338,7 +339,7 @@ export function execute_effect_teardown(effect) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
* @param {boolean} [remove_dom]
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
@ -346,14 +347,13 @@ export function destroy_effect(effect, remove_dom = true) {
|
|
|
|
|
var removed = false;
|
|
|
|
|
|
|
|
|
|
if ((remove_dom || (effect.f & HEAD_EFFECT) !== 0) && effect.nodes !== null) {
|
|
|
|
|
/** @type {import('#client').TemplateNode | null} */
|
|
|
|
|
/** @type {TemplateNode | null} */
|
|
|
|
|
var node = effect.nodes.start;
|
|
|
|
|
var end = effect.nodes.end;
|
|
|
|
|
|
|
|
|
|
while (node !== null) {
|
|
|
|
|
/** @type {import('#client').TemplateNode | null} */
|
|
|
|
|
var next =
|
|
|
|
|
node === end ? null : /** @type {import('#client').TemplateNode} */ (node.nextSibling);
|
|
|
|
|
/** @type {TemplateNode | null} */
|
|
|
|
|
var next = node === end ? null : /** @type {TemplateNode} */ (node.nextSibling);
|
|
|
|
|
|
|
|
|
|
node.remove();
|
|
|
|
|
node = next;
|
|
|
|
@ -396,7 +396,7 @@ export function destroy_effect(effect, remove_dom = true) {
|
|
|
|
|
/**
|
|
|
|
|
* Detach an effect from the effect tree, freeing up memory and
|
|
|
|
|
* reducing the amount of work that happens on subsequent traversals
|
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
*/
|
|
|
|
|
export function unlink_effect(effect) {
|
|
|
|
|
var parent = effect.parent;
|
|
|
|
@ -418,11 +418,11 @@ export function unlink_effect(effect) {
|
|
|
|
|
* It stays around (in memory, and in the DOM) until outro transitions have
|
|
|
|
|
* completed, and if the state change is reversed then we _resume_ it.
|
|
|
|
|
* A paused effect does not update, and the DOM subtree becomes inert.
|
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
* @param {() => void} [callback]
|
|
|
|
|
*/
|
|
|
|
|
export function pause_effect(effect, callback) {
|
|
|
|
|
/** @type {import('#client').TransitionManager[]} */
|
|
|
|
|
/** @type {TransitionManager[]} */
|
|
|
|
|
var transitions = [];
|
|
|
|
|
|
|
|
|
|
pause_children(effect, transitions, true);
|
|
|
|
@ -434,7 +434,7 @@ export function pause_effect(effect, callback) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import('#client').TransitionManager[]} transitions
|
|
|
|
|
* @param {TransitionManager[]} transitions
|
|
|
|
|
* @param {() => void} fn
|
|
|
|
|
*/
|
|
|
|
|
export function run_out_transitions(transitions, fn) {
|
|
|
|
@ -450,8 +450,8 @@ export function run_out_transitions(transitions, fn) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
|
* @param {import('#client').TransitionManager[]} transitions
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
* @param {TransitionManager[]} transitions
|
|
|
|
|
* @param {boolean} local
|
|
|
|
|
*/
|
|
|
|
|
export function pause_children(effect, transitions, local) {
|
|
|
|
@ -482,14 +482,14 @@ export function pause_children(effect, transitions, local) {
|
|
|
|
|
/**
|
|
|
|
|
* The opposite of `pause_effect`. We call this if (for example)
|
|
|
|
|
* `x` becomes falsy then truthy: `{#if x}...{/if}`
|
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
*/
|
|
|
|
|
export function resume_effect(effect) {
|
|
|
|
|
resume_children(effect, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import('#client').Effect} effect
|
|
|
|
|
* @param {Effect} effect
|
|
|
|
|
* @param {boolean} local
|
|
|
|
|
*/
|
|
|
|
|
function resume_children(effect, local) {
|
|
|
|
|