guarantee fork

pull/16197/head
Rich Harris 6 months ago
parent e247f665af
commit d42b358f99

@ -1,5 +1,5 @@
/** @import { Effect, TemplateNode, Value } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js' */
import { async_derived } from '../../reactivity/deriveds.js';
import { active_fork } from '../../reactivity/forks.js';
import { active_effect, schedule_effect } from '../../runtime.js';
@ -13,15 +13,16 @@ import { capture } from './boundary.js';
export function async(node, expressions, fn) {
// TODO handle hydration
var fork = active_fork;
var fork = /** @type {Fork} */ (active_fork);
var effect = /** @type {Effect} */ (active_effect);
var restore = capture();
Promise.all(expressions.map((fn) => async_derived(fn))).then((result) => {
restore();
fn(node, ...result);
fork?.run(() => {
fork.run(() => {
schedule_effect(effect);
});
});

@ -24,7 +24,7 @@ import { queue_boundary_micro_task } from '../task.js';
import * as e from '../../../shared/errors.js';
import { DEV } from 'esm-env';
import { from_async_derived, set_from_async_derived } from '../../reactivity/deriveds.js';
import { active_fork, Fork } from '../../reactivity/forks.js';
import { Fork } from '../../reactivity/forks.js';
/**
* @typedef {{

@ -1,4 +1,5 @@
/** @import { EachItem, EachState, Effect, MaybeSource, Source, TemplateNode, TransitionManager, Value } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import {
EACH_INDEX_REACTIVE,
EACH_IS_ANIMATED,
@ -266,8 +267,9 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
fallback = branch(() => fallback_fn(anchor));
}
} else {
if (active_fork !== null && should_defer_append()) {
if (should_defer_append()) {
var keys = new Set();
var fork = /** @type {Fork} */ (active_fork);
for (i = 0; i < length; i += 1) {
value = array[i];
@ -303,11 +305,11 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
for (const [key, item] of state.items) {
if (!keys.has(key)) {
active_fork.skipped_effects.add(item.e);
fork.skipped_effects.add(item.e);
}
}
active_fork?.add_callback(commit);
fork.add_callback(commit);
} else {
commit();
}

@ -1,4 +1,5 @@
/** @import { Effect, TemplateNode } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { EFFECT_TRANSPARENT } from '#client/constants';
import {
hydrate_next,
@ -112,7 +113,7 @@ export function if_block(node, fn, elseif = false) {
}
}
var defer = active_fork !== null && should_defer_append();
var defer = should_defer_append();
var target = anchor;
if (defer) {
@ -125,13 +126,15 @@ export function if_block(node, fn, elseif = false) {
}
if (defer) {
var fork = /** @type {Fork} */ (active_fork);
const skipped = condition ? alternate_effect : consequent_effect;
if (skipped !== null) {
// TODO need to do this for other kinds of blocks
active_fork?.skipped_effects.add(skipped);
fork.skipped_effects.add(skipped);
}
active_fork?.add_callback(commit);
fork.add_callback(commit);
} else {
commit();
}

@ -1,4 +1,5 @@
/** @import { Effect, TemplateNode } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { UNINITIALIZED } from '../../../../constants.js';
import { block, branch, pause_effect } from '../../reactivity/effects.js';
import { not_equal, safe_not_equal } from '../../reactivity/equality.js';
@ -55,7 +56,7 @@ export function key_block(node, get_key, render_fn) {
if (changed(key, (key = get_key()))) {
var target = anchor;
var defer = active_fork !== null && should_defer_append();
var defer = should_defer_append();
if (defer) {
offscreen_fragment = document.createDocumentFragment();
@ -65,7 +66,7 @@ export function key_block(node, get_key, render_fn) {
pending_effect = branch(() => render_fn(target));
if (defer) {
active_fork?.add_callback(commit);
/** @type {Fork} */ (active_fork).add_callback(commit);
} else {
commit();
}

@ -1,4 +1,5 @@
/** @import { TemplateNode, Dom, Effect } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { EFFECT_TRANSPARENT } from '#client/constants';
import { block, branch, pause_effect } from '../../reactivity/effects.js';
import { active_fork } from '../../reactivity/forks.js';
@ -53,7 +54,7 @@ export function component(node, get_component, render_fn) {
block(() => {
if (component === (component = get_component())) return;
var defer = active_fork !== null && should_defer_append();
var defer = should_defer_append();
if (component) {
var target = anchor;
@ -67,7 +68,7 @@ export function component(node, get_component, render_fn) {
}
if (defer) {
active_fork?.add_callback(commit);
/** @type {Fork} */ (active_fork).add_callback(commit);
} else {
commit();
}

@ -343,7 +343,7 @@ export function template_effect(fn, sync = [], async = [], d = derived) {
var parent = /** @type {Effect} */ (active_effect);
if (async.length > 0) {
var fork = active_fork;
var fork = /** @type {Fork} */ (active_fork);
var restore = capture();
Promise.all(async.map((expression) => async_derived(expression))).then((result) => {
@ -355,11 +355,9 @@ export function template_effect(fn, sync = [], async = [], d = derived) {
var effect = create_template_effect(fn, [...sync.map(d), ...result]);
if (fork !== null) {
fork.run(() => {
schedule_effect(effect);
});
}
fork.run(() => {
schedule_effect(effect);
});
});
} else {
create_template_effect(fn, sync.map(d));

Loading…
Cancel
Save