diff --git a/src/compiler/compile/render_dom/wrappers/shared/Wrapper.js b/src/compiler/compile/render_dom/wrappers/shared/Wrapper.js index 1e09bd9e31..5aed5c53e2 100644 --- a/src/compiler/compile/render_dom/wrappers/shared/Wrapper.js +++ b/src/compiler/compile/render_dom/wrappers/shared/Wrapper.js @@ -1,88 +1,91 @@ import { x } from 'code-red'; export default class Wrapper { + /** @type {import('../../Renderer.js').default} */ + renderer; - /** @type {import('../../Renderer.js').default} */ - renderer; + /** @type {Wrapper} */ + parent; - /** @type {Wrapper} */ - parent; + /** @type {import('../../../../interfaces.js').TemplateNode} */ + node; - /** @type {import('../../../../interfaces.js').TemplateNode} */ - node; + /** @type {Wrapper | null} */ + prev; - /** @type {Wrapper | null} */ - prev; + /** @type {Wrapper | null} */ + next; - /** @type {Wrapper | null} */ - next; + /** @type {import('estree').Identifier} */ + var; - /** @type {import('estree').Identifier} */ - var; + /** + * @param {import('../../Renderer.js').default} renderer + * @param {import('../../Block.js').default} block + * @param {Wrapper} parent + * @param {import('../../../../interfaces.js').TemplateNode} node + */ + constructor(renderer, block, parent, node) { + this.node = node; + // make these non-enumerable so that they can be logged sensibly + // (TODO in dev only?) + Object.defineProperties(this, { + renderer: { + value: renderer + }, + parent: { + value: parent + } + }); + block.wrappers.push(this); + } - /** - * @param {import('../../Renderer.js').default} renderer - * @param {import('../../Block.js').default} block - * @param {Wrapper} parent - * @param {import('../../../../interfaces.js').TemplateNode} node - */ - constructor(renderer, block, parent, node) { - this.node = node; - // make these non-enumerable so that they can be logged sensibly - // (TODO in dev only?) - Object.defineProperties(this, { - renderer: { - value: renderer - }, - parent: { - value: parent - } - }); - block.wrappers.push(this); - } + /** + * @param {import('../../Block.js').default} block + * @param {import('estree').Identifier} parent_node + * @param {import('estree').Identifier} parent_nodes + */ + get_or_create_anchor(block, parent_node, parent_nodes) { + // TODO use this in EachBlock and IfBlock — tricky because + // children need to be created first + const needs_anchor = this.next + ? !this.next.is_dom_node() + : !parent_node || !this.parent.is_dom_node(); + const anchor = needs_anchor + ? block.get_unique_name(`${this.var.name}_anchor`) + : (this.next && this.next.var) || { type: 'Identifier', name: 'null' }; + if (needs_anchor) { + block.add_element( + anchor, + x`@empty()`, + parent_nodes && x`@empty()`, + /** @type {import('estree').Identifier} */ (parent_node) + ); + } + return anchor; + } - /** - * @param {import('../../Block.js').default} block - * @param {import('estree').Identifier} parent_node - * @param {import('estree').Identifier} parent_nodes - */ - get_or_create_anchor(block, parent_node, parent_nodes) { - // TODO use this in EachBlock and IfBlock — tricky because - // children need to be created first - const needs_anchor = this.next - ? !this.next.is_dom_node() - : !parent_node || !this.parent.is_dom_node(); - const anchor = needs_anchor - ? block.get_unique_name(`${this.var.name}_anchor`) - : (this.next && this.next.var) || { type: 'Identifier', name: 'null' }; - if (needs_anchor) { - block.add_element(anchor, x `@empty()`, parent_nodes && x `@empty()`, - /** @type {import('estree').Identifier} */ (parent_node)); - } - return anchor; - } + /** + * @param {import('estree').Identifier} anchor + * @returns {import("C:/repos/svelte/svelte/node_modules/.pnpm/@types+estree@1.0.0/node_modules/@types/estree/index").import('estree').Identifier} + */ + get_update_mount_node(anchor) { + return /** @type {import('estree').Identifier} */ ( + this.parent && this.parent.is_dom_node() ? this.parent.var : x`${anchor}.parentNode` + ); + } + is_dom_node() { + return ( + this.node.type === 'Element' || this.node.type === 'Text' || this.node.type === 'MustacheTag' + ); + } - /** - * @param {import('estree').Identifier} anchor - * @returns {import("C:/repos/svelte/svelte/node_modules/.pnpm/@types+estree@1.0.0/node_modules/@types/estree/index").import('estree').Identifier} - */ - get_update_mount_node(anchor) { - return /** @type {import('estree').Identifier} */ ((this.parent && this.parent.is_dom_node() ? this.parent.var : x `${anchor}.parentNode`)); - } - is_dom_node() { - return (this.node.type === 'Element' || this.node.type === 'Text' || this.node.type === 'MustacheTag'); - } - - /** - * @param {import('../../Block.js').default} _block - * @param {import('estree').Identifier} _parent_node - * @param {import('estree').Identifier} _parent_nodes - * @param {Record} _data - */ - render(_block, _parent_node, _parent_nodes, _data = undefined) { - throw Error('Wrapper class is not renderable'); - } + /** + * @param {import('../../Block.js').default} _block + * @param {import('estree').Identifier} _parent_node + * @param {import('estree').Identifier} _parent_nodes + * @param {Record} _data + */ + render(_block, _parent_node, _parent_nodes, _data = undefined) { + throw Error('Wrapper class is not renderable'); + } } - - - -