All files / src/internal/client/dev hmr.js

92% Statements 46/50
66.66% Branches 4/6
100% Functions 1/1
91.3% Lines 42/46

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 472x 2x 2x 2x 2x 2x 2x 2x 2x 2x 5x 5x 5x 5x 5x 7x 7x 7x 7x 7x 7x 7x 7x 7x         7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 5x 5x  
import { block, branch, destroy_effect } from '../reactivity/effects.js';
import { set_should_intro } from '../render.js';
import { get } from '../runtime.js';
import { check_target } from './legacy.js';
 
/**
 * @template {(anchor: Comment, props: any) => any} Component
 * @param {import("#client").Source<Component>} source
 */
export function hmr(source) {
	/**
	 * @param {Comment} anchor
	 * @param {any} props
	 */
	return function (anchor, props) {
		let instance = {};
 
		/** @type {import("#client").Effect} */
		let effect;
 
		block(anchor, 0, () => {
			const component = get(source);
 
			if (effect) {
				// @ts-ignore
				for (var k in instance) delete instance[k];
				destroy_effect(effect);
			}
 
			effect = branch(() => {
				set_should_intro(false);
				// preserve getters/setters
				Object.defineProperties(
					instance,
					Object.getOwnPropertyDescriptors(
						// @ts-expect-error
						new.target ? new component(anchor, props) : component(anchor, props)
					)
				);
				set_should_intro(true);
			});
		});
 
		return instance;
	};
}