fix: push renderer before executing a snippet

fix-interleaving
paoloricciuti 1 month ago
parent 3daa9d6b9f
commit d3e7839d41

@ -15,8 +15,9 @@ import * as e from '../../errors.js';
import { DEV } from 'esm-env';
import { get_first_child, get_next_sibling, insert_before, node_type } from '../operations.js';
import { prevent_snippet_stringification } from '../../../shared/validate.js';
import { has_own_property } from '../../../shared/utils.js';
import { BranchManager } from './branches.js';
import { current_renderer } from '../../custom-renderer/state.js';
import { current_renderer, push_renderer } from '../../custom-renderer/state.js';
/**
* @template {(node: TemplateNode, ...args: any[]) => void} SnippetFn
@ -35,7 +36,29 @@ export function snippet(node, get_snippet, ...args) {
e.invalid_snippet();
}
branches.ensure(snippet, snippet && ((anchor) => snippet(anchor, ...args)));
branches.ensure(
snippet,
snippet &&
((anchor) => {
var renderer = /** @type {any} */ (snippet).__renderer;
var has_renderer = has_own_property.call(
/** @type {any} */ (snippet),
'__renderer'
);
if (has_renderer) {
var pop_renderer = push_renderer(renderer, renderer);
try {
return snippet(anchor, ...args);
} finally {
pop_renderer();
}
}
return snippet(anchor, ...args);
})
);
}, EFFECT_TRANSPARENT);
}
@ -98,7 +121,16 @@ export function renderer_snippet(expected_renderer, fn) {
* @returns {T}
*/
export function validate_snippet_renderer(expected_renderer, fn) {
if (fn != null && /** @type {any} */ (fn).__renderer !== expected_renderer) {
if (fn == null) return fn;
var has_renderer = has_own_property.call(/** @type {any} */ (fn), '__renderer');
if (
(expected_renderer === null &&
has_renderer &&
/** @type {any} */ (fn).__renderer !== expected_renderer) ||
(expected_renderer !== null && /** @type {any} */ (fn).__renderer !== expected_renderer)
) {
e.snippet_renderer_mismatch();
}
return fn;

Loading…
Cancel
Save