diff --git a/src/compiler/compile/nodes/Attribute.ts b/src/compiler/compile/nodes/Attribute.ts index 92b6dde405..a43bf2e8f6 100644 --- a/src/compiler/compile/nodes/Attribute.ts +++ b/src/compiler/compile/nodes/Attribute.ts @@ -1,4 +1,4 @@ -import { stringify, string_literal } from '../utils/stringify'; +import { string_literal } from '../utils/stringify'; import add_to_set from '../utils/add_to_set'; import Component from '../Component'; import Node from './shared/Node'; @@ -6,6 +6,7 @@ import Element from './Element'; import Text from './Text'; import Expression from './shared/Expression'; import TemplateScope from './shared/TemplateScope'; +import { x } from 'code-red'; export default class Attribute extends Node { type: 'Attribute'; @@ -78,8 +79,8 @@ export default class Attribute extends Node { } get_value(block) { - if (this.is_true) return true; - if (this.chunks.length === 0) return `""`; + if (this.is_true) return x`true`; + if (this.chunks.length === 0) return x`""`; if (this.chunks.length === 1) { return this.chunks[0].type === 'Text' @@ -87,17 +88,15 @@ export default class Attribute extends Node { : (this.chunks[0] as Expression).manipulate(block); } - return (this.chunks[0].type === 'Text' ? '' : `"" + `) + - this.chunks - .map(chunk => { - if (chunk.type === 'Text') { - return stringify(chunk.data); - } else { - // @ts-ignore todo: probably error - return chunk.get_precedence() <= 13 ? `(${chunk.render()})` : chunk.render(); - } - }) - .join(' + '); + let expression = this.chunks + .map(chunk => chunk.type === 'Text' ? string_literal(chunk.data) : chunk.manipulate(block)) + .reduce((lhs, rhs) => x`${lhs} + ${rhs}`); + + if (this.chunks[0].type !== 'Text') { + expression = x`"" + ${expression}`; + } + + return expression; } get_static_value() { diff --git a/src/compiler/compile/render_dom/Block.ts b/src/compiler/compile/render_dom/Block.ts index db3c383fec..610511ca4f 100644 --- a/src/compiler/compile/render_dom/Block.ts +++ b/src/compiler/compile/render_dom/Block.ts @@ -2,6 +2,7 @@ import Renderer from './Renderer'; import Wrapper from './wrappers/shared/Wrapper'; import { b, x } from 'code-red'; import { Node, Identifier } from '../../interfaces'; +import { is_head } from './wrappers/shared/is_head'; export interface BlockOptions { parent?: Block; @@ -167,7 +168,7 @@ export default class Block { id: Identifier, render_statement: Node, claim_statement: Node, - parent_node: string, + parent_node: Node, no_detach?: boolean ) { this.add_variable(id); @@ -179,7 +180,7 @@ export default class Block { if (parent_node) { this.chunks.mount.push(b`@append(${parent_node}, ${id});`); - if (parent_node === '@_document.head' && !no_detach) this.chunks.destroy.push(b`@detach(${id});`); + if (is_head(parent_node) && !no_detach) this.chunks.destroy.push(b`@detach(${id});`); } else { this.chunks.mount.push(b`@insert(#target, ${id}, anchor);`); if (!no_detach) this.chunks.destroy.push(b`if (detaching) @detach(${id});`); @@ -450,4 +451,4 @@ export default class Block { // } // `; // } -} +} \ No newline at end of file diff --git a/src/compiler/compile/render_dom/Renderer.ts b/src/compiler/compile/render_dom/Renderer.ts index 90a76a68b7..615db5e074 100644 --- a/src/compiler/compile/render_dom/Renderer.ts +++ b/src/compiler/compile/render_dom/Renderer.ts @@ -2,6 +2,7 @@ import Block from './Block'; import { CompileOptions, Node, Identifier } from '../../interfaces'; import Component from '../Component'; import FragmentWrapper from './wrappers/Fragment'; +import { x } from 'code-red'; export default class Renderer { component: Component; // TODO Maybe Renderer shouldn't know about Component? @@ -56,6 +57,6 @@ export default class Renderer { this.block.assign_variable_names(); - this.fragment.render(this.block, null, 'nodes'); + this.fragment.render(this.block, null, x`nodes` as unknown as Identifier); } } diff --git a/src/compiler/compile/render_dom/wrappers/AwaitBlock.ts b/src/compiler/compile/render_dom/wrappers/AwaitBlock.ts index 5669765284..8c8b3d8ae0 100644 --- a/src/compiler/compile/render_dom/wrappers/AwaitBlock.ts +++ b/src/compiler/compile/render_dom/wrappers/AwaitBlock.ts @@ -122,8 +122,8 @@ export default class AwaitBlockWrapper extends Wrapper { render( block: Block, - parent_node: string, - parent_nodes: string + parent_node: Identifier, + parent_nodes: Identifier ) { const anchor = this.get_or_create_anchor(block, parent_node, parent_nodes); const update_mount_node = this.get_update_mount_node(anchor); @@ -234,7 +234,7 @@ export default class AwaitBlockWrapper extends Wrapper { `); [this.pending, this.then, this.catch].forEach(branch => { - branch.fragment.render(branch.block, null, 'nodes'); + branch.fragment.render(branch.block, null, x`nodes` as unknown as Identifier); }); } } diff --git a/src/compiler/compile/render_dom/wrappers/Body.ts b/src/compiler/compile/render_dom/wrappers/Body.ts index 21d7f90ae7..42e5d562f1 100644 --- a/src/compiler/compile/render_dom/wrappers/Body.ts +++ b/src/compiler/compile/render_dom/wrappers/Body.ts @@ -2,11 +2,12 @@ import Block from '../Block'; import Wrapper from './shared/Wrapper'; import { b } from 'code-red'; import Body from '../../nodes/Body'; +import { Identifier } from '../../../interfaces'; export default class BodyWrapper extends Wrapper { node: Body; - render(block: Block, _parent_node: string, _parent_nodes: string) { + render(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { this.node.handlers.forEach(handler => { const snippet = handler.render(block); diff --git a/src/compiler/compile/render_dom/wrappers/DebugTag.ts b/src/compiler/compile/render_dom/wrappers/DebugTag.ts index aa74f2f89d..2208732183 100644 --- a/src/compiler/compile/render_dom/wrappers/DebugTag.ts +++ b/src/compiler/compile/render_dom/wrappers/DebugTag.ts @@ -4,6 +4,7 @@ import Block from '../Block'; import DebugTag from '../../nodes/DebugTag'; // import add_to_set from '../../utils/add_to_set'; import { b } from 'code-red'; +import { Identifier } from '../../../interfaces'; export default class DebugTagWrapper extends Wrapper { node: DebugTag; @@ -19,7 +20,7 @@ export default class DebugTagWrapper extends Wrapper { super(renderer, block, parent, node); } - render(block: Block, _parent_node: string, _parent_nodes: string) { + render(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { const { renderer } = this; // const { component } = renderer; diff --git a/src/compiler/compile/render_dom/wrappers/EachBlock.ts b/src/compiler/compile/render_dom/wrappers/EachBlock.ts index 1bb62ff7f0..db631a304e 100644 --- a/src/compiler/compile/render_dom/wrappers/EachBlock.ts +++ b/src/compiler/compile/render_dom/wrappers/EachBlock.ts @@ -179,7 +179,7 @@ export default class EachBlockWrapper extends Wrapper { } } - render(block: Block, parent_node: string, parent_nodes: string) { + render(block: Block, parent_node: Identifier, parent_nodes: Identifier) { if (this.fragment.nodes.length === 0) return; const { renderer } = this; @@ -207,7 +207,7 @@ export default class EachBlockWrapper extends Wrapper { `); const initial_anchor_node: Identifier = { type: 'Identifier', name: parent_node ? 'null' : 'anchor' }; - const initial_mount_node: Identifier = { type: 'Identifier', name: parent_node || '#target' }; + const initial_mount_node: Identifier = parent_node || { type: 'Identifier', name: '#target' }; const update_anchor_node = needs_anchor ? block.get_unique_name(`${this.var.name}_anchor`) : (this.next && this.next.var) || { type: 'Identifier', name: 'null' }; @@ -243,7 +243,7 @@ export default class EachBlockWrapper extends Wrapper { update_anchor_node as Identifier, x`@empty()`, parent_nodes && x`@empty()`, - parent_node + parent_node as unknown as Node ); } @@ -299,10 +299,10 @@ export default class EachBlockWrapper extends Wrapper { `); } - this.fragment.render(this.block, null, 'nodes'); + this.fragment.render(this.block, null, x`nodes` as unknown as Identifier); if (this.else) { - this.else.fragment.render(this.else.block, null, 'nodes'); + this.else.fragment.render(this.else.block, null, x`nodes` as unknown as Identifier); } } @@ -317,8 +317,8 @@ export default class EachBlockWrapper extends Wrapper { update_mount_node }: { block: Block; - parent_node: string; - parent_nodes: string; + parent_node: Identifier; + parent_nodes: Identifier; snippet: Node; initial_anchor_node: Identifier; initial_mount_node: Identifier; @@ -425,7 +425,7 @@ export default class EachBlockWrapper extends Wrapper { update_mount_node }: { block: Block; - parent_nodes: string; + parent_nodes: Identifier; snippet: Node; initial_anchor_node: Identifier; initial_mount_node: Identifier; diff --git a/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts b/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts index 8c1891aa32..fbe273046f 100644 --- a/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts +++ b/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts @@ -172,8 +172,8 @@ export default class AttributeWrapper { is_legacy_input_type ? b`@set_input_type(${element.var}, ${value});` : property_name - ? b`${element.var}.${property_name} = ${value === true ? { type: 'Literal', value: true } : value};` - : b`${method}(${element.var}, "${name}", ${value === true ? x`""` : value});` + ? b`${element.var}.${property_name} = ${value};` + : b`${method}(${element.var}, "${name}", ${value});` ); block.chunks.hydrate.push(statement); diff --git a/src/compiler/compile/render_dom/wrappers/Element/index.ts b/src/compiler/compile/render_dom/wrappers/Element/index.ts index 365d92977b..a3f05ecec8 100644 --- a/src/compiler/compile/render_dom/wrappers/Element/index.ts +++ b/src/compiler/compile/render_dom/wrappers/Element/index.ts @@ -21,6 +21,8 @@ import create_debugging_comment from '../shared/create_debugging_comment'; import { get_context_merger } from '../shared/get_context_merger'; import bind_this from '../shared/bind_this'; import { changed } from '../shared/changed'; +import { is_head } from '../shared/is_head'; +import { Identifier } from '../../../../interfaces'; const events = [ { @@ -152,7 +154,7 @@ export default class ElementWrapper extends Wrapper { if (owner && owner.node.type === 'InlineComponent') { const name = attribute.get_static_value() as string; - if (!(owner as InlineComponentWrapper).slots.has(name)) { + if (!(owner as unknown as InlineComponentWrapper).slots.has(name)) { const child_block = block.child({ comment: create_debugging_comment(node, this.renderer.component), name: this.renderer.component.get_unique_name(`create_${sanitize(name)}_slot`), @@ -162,13 +164,13 @@ export default class ElementWrapper extends Wrapper { const lets = this.node.lets; const seen = new Set(lets.map(l => l.name)); - (owner as InlineComponentWrapper).node.lets.forEach(l => { + (owner as unknown as InlineComponentWrapper).node.lets.forEach(l => { if (!seen.has(l.name)) lets.push(l); }); const fn = get_context_merger(lets); - (owner as InlineComponentWrapper).slots.set(name, { + (owner as unknown as InlineComponentWrapper).slots.set(name, { block: child_block, scope: this.node.scope, fn @@ -176,7 +178,7 @@ export default class ElementWrapper extends Wrapper { this.renderer.blocks.push(child_block); } - this.slot_block = (owner as InlineComponentWrapper).slots.get(name).block; + this.slot_block = (owner as unknown as InlineComponentWrapper).slots.get(name).block; block = this.slot_block; } } @@ -240,7 +242,7 @@ export default class ElementWrapper extends Wrapper { } } - render(block: Block, parent_node: string, parent_nodes: string) { + render(block: Block, parent_node: Identifier, parent_nodes: Identifier) { const { renderer } = this; if (this.node.name === 'noscript') return; @@ -276,7 +278,7 @@ export default class ElementWrapper extends Wrapper { b`@append(${parent_node}, ${node});` ); - if (parent_node === '@_document.head') { + if (is_head(parent_node)) { block.chunks.destroy.push(b`@detach(${node});`); } } else { @@ -320,7 +322,7 @@ export default class ElementWrapper extends Wrapper { child.render( block, this.node.name === 'template' ? `${node}.content` : node, - nodes.name + nodes ); }); } @@ -376,7 +378,7 @@ export default class ElementWrapper extends Wrapper { return x`@element("${name}")`; } - get_claim_statement(nodes: string) { + get_claim_statement(nodes: Identifier) { const attributes = this.node.attributes .filter((attr) => attr.type === 'Attribute') .map((attr) => `${quote_name_if_necessary(attr.name)}: true`) diff --git a/src/compiler/compile/render_dom/wrappers/Fragment.ts b/src/compiler/compile/render_dom/wrappers/Fragment.ts index d81bd6bcc9..224b17d43f 100644 --- a/src/compiler/compile/render_dom/wrappers/Fragment.ts +++ b/src/compiler/compile/render_dom/wrappers/Fragment.ts @@ -17,6 +17,7 @@ import { INode } from '../../nodes/interfaces'; import Renderer from '../Renderer'; import Block from '../Block'; import { trim_start, trim_end } from '../../../utils/trim'; +import { Identifier } from 'estree'; const wrappers = { AwaitBlock, @@ -145,7 +146,7 @@ export default class FragmentWrapper { } } - render(block: Block, parent_node: string, parent_nodes: string) { + render(block: Block, parent_node: Identifier, parent_nodes: Identifier) { for (let i = 0; i < this.nodes.length; i += 1) { this.nodes[i].render(block, parent_node, parent_nodes); } diff --git a/src/compiler/compile/render_dom/wrappers/Head.ts b/src/compiler/compile/render_dom/wrappers/Head.ts index a5226e7efa..3c9d9f9ad1 100644 --- a/src/compiler/compile/render_dom/wrappers/Head.ts +++ b/src/compiler/compile/render_dom/wrappers/Head.ts @@ -3,6 +3,8 @@ import Renderer from '../Renderer'; import Block from '../Block'; import Head from '../../nodes/Head'; import FragmentWrapper from './Fragment'; +import { x } from 'code-red'; +import { Identifier } from 'estree'; export default class HeadWrapper extends Wrapper { fragment: FragmentWrapper; @@ -29,7 +31,7 @@ export default class HeadWrapper extends Wrapper { ); } - render(block: Block, _parent_node: string, _parent_nodes: string) { - this.fragment.render(block, '@_document.head', 'nodes'); + render(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { + this.fragment.render(block, x`@_document.head` as unknown as Identifier, x`nodes` as unknown as Identifier); } } diff --git a/src/compiler/compile/render_dom/wrappers/IfBlock.ts b/src/compiler/compile/render_dom/wrappers/IfBlock.ts index 10cc0c5dd9..236f4c3e7b 100644 --- a/src/compiler/compile/render_dom/wrappers/IfBlock.ts +++ b/src/compiler/compile/render_dom/wrappers/IfBlock.ts @@ -10,6 +10,7 @@ import { b, x } from 'code-red'; import { walk } from 'estree-walker'; import { Identifier } from '../../../interfaces'; import Node from '../../nodes/shared/Node'; +import { is_head } from './shared/is_head'; function is_else_if(node: ElseBlock) { return ( @@ -170,8 +171,8 @@ export default class IfBlockWrapper extends Wrapper { render( block: Block, - parent_node: string, - parent_nodes: string + parent_node: Identifier, + parent_nodes: Identifier ) { const name = this.var; @@ -190,7 +191,7 @@ export default class IfBlockWrapper extends Wrapper { const vars = { name, anchor, if_exists_condition, has_else, has_transitions }; - const detaching = (parent_node && parent_node !== '@_document.head') ? '' : 'detaching'; + const detaching = is_head(parent_node) ? '' : 'detaching'; if (this.node.else) { this.branches.forEach(branch => { @@ -229,19 +230,19 @@ export default class IfBlockWrapper extends Wrapper { anchor as Identifier, x`@empty()`, parent_nodes && x`@empty()`, - parent_node + parent_node as unknown as Node ); } this.branches.forEach(branch => { - branch.fragment.render(branch.block, null, 'nodes'); + branch.fragment.render(branch.block, null, x`nodes` as unknown as Identifier); }); } render_compound( block: Block, - parent_node: string, - _parent_nodes: string, + parent_node: Identifier, + _parent_nodes: Identifier, dynamic, { name, anchor, has_else, if_exists_condition, has_transitions }, detaching @@ -328,8 +329,8 @@ export default class IfBlockWrapper extends Wrapper { // (TODO does this only apply to bidi transitions?) render_compound_with_outros( block: Block, - parent_node: string, - _parent_nodes: string, + parent_node: Identifier, + _parent_nodes: Identifier, dynamic, { name, anchor, has_else, has_transitions }, detaching @@ -467,8 +468,8 @@ export default class IfBlockWrapper extends Wrapper { render_simple( block: Block, - parent_node: string, - _parent_nodes: string, + parent_node: Identifier, + _parent_nodes: Identifier, dynamic, { name, anchor, if_exists_condition, has_transitions }, detaching diff --git a/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts b/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts index 8df1faf436..2241bfd96e 100644 --- a/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts +++ b/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts @@ -106,8 +106,8 @@ export default class InlineComponentWrapper extends Wrapper { render( block: Block, - parent_node: string, - parent_nodes: string + parent_node: Identifier, + parent_nodes: Identifier ) { const { renderer } = this; const { component } = renderer; @@ -149,7 +149,7 @@ export default class InlineComponentWrapper extends Wrapper { kind: 'init', key: { type: 'Identifier', name: '$$scope' }, value: x`{ ctx: #ctx }` - }) + }); } if (uses_spread) { @@ -189,7 +189,7 @@ export default class InlineComponentWrapper extends Wrapper { const default_slot = this.slots.get('default'); this.fragment.nodes.forEach((child) => { - child.render(default_slot.block, null, 'nodes'); + child.render(default_slot.block, null, x`nodes` as unknown as Identifier); }); } diff --git a/src/compiler/compile/render_dom/wrappers/MustacheTag.ts b/src/compiler/compile/render_dom/wrappers/MustacheTag.ts index 99413ee314..aab21cd0e2 100644 --- a/src/compiler/compile/render_dom/wrappers/MustacheTag.ts +++ b/src/compiler/compile/render_dom/wrappers/MustacheTag.ts @@ -4,7 +4,7 @@ import Tag from './shared/Tag'; import Wrapper from './shared/Wrapper'; import MustacheTag from '../../nodes/MustacheTag'; import RawMustacheTag from '../../nodes/RawMustacheTag'; -import { Identifier } from '../../../interfaces'; +import { Identifier, Node } from '../../../interfaces'; import { x } from 'code-red'; export default class MustacheTagWrapper extends Tag { @@ -15,7 +15,7 @@ export default class MustacheTagWrapper extends Tag { this.cannot_use_innerhtml(); } - render(block: Block, parent_node: string, parent_nodes: string) { + render(block: Block, parent_node: Identifier, parent_nodes: Identifier) { const { init } = this.rename_this_method( block, value => x`@set_data(${this.var}, ${value});` @@ -25,7 +25,7 @@ export default class MustacheTagWrapper extends Tag { this.var, x`@text(${init})`, parent_nodes && x`@claim_text(${parent_nodes}, ${init})`, - parent_node + parent_node as unknown as Node ); } } diff --git a/src/compiler/compile/render_dom/wrappers/RawMustacheTag.ts b/src/compiler/compile/render_dom/wrappers/RawMustacheTag.ts index 609e57e0d1..5e9f15f7fd 100644 --- a/src/compiler/compile/render_dom/wrappers/RawMustacheTag.ts +++ b/src/compiler/compile/render_dom/wrappers/RawMustacheTag.ts @@ -5,7 +5,8 @@ import Tag from './shared/Tag'; import Wrapper from './shared/Wrapper'; import MustacheTag from '../../nodes/MustacheTag'; import RawMustacheTag from '../../nodes/RawMustacheTag'; -import { Identifier } from '../../../interfaces'; +import { Identifier, Node } from '../../../interfaces'; +import { is_head } from './shared/is_head'; export default class RawMustacheTagWrapper extends Tag { var: Identifier = { type: 'Identifier', name: 'raw' }; @@ -20,8 +21,8 @@ export default class RawMustacheTagWrapper extends Tag { this.cannot_use_innerhtml(); } - render(block: Block, parent_node: string, _parent_nodes: string) { - const in_head = parent_node === '@_document.head'; + render(block: Block, parent_node: Identifier, _parent_nodes: Identifier) { + const in_head = is_head(parent_node); const can_use_innerhtml = !in_head && parent_node && !this.prev && !this.next; @@ -55,7 +56,7 @@ export default class RawMustacheTagWrapper extends Tag { block.chunks.mount.push(b`${html_tag}.m(${parent_node || '#target'}, ${parent_node ? null : 'anchor'});`); if (needs_anchor) { - block.add_element(html_anchor, x`@empty()`, x`@empty()`, parent_node); + block.add_element(html_anchor, x`@empty()`, x`@empty()`, parent_node as unknown as Node); } if (!parent_node || in_head) { diff --git a/src/compiler/compile/render_dom/wrappers/Slot.ts b/src/compiler/compile/render_dom/wrappers/Slot.ts index 40ef5b2626..ec78099062 100644 --- a/src/compiler/compile/render_dom/wrappers/Slot.ts +++ b/src/compiler/compile/render_dom/wrappers/Slot.ts @@ -52,8 +52,8 @@ export default class SlotWrapper extends Wrapper { render( block: Block, - parent_node: string, - parent_nodes: string + parent_node: Identifier, + parent_nodes: Identifier ) { const { renderer } = this; diff --git a/src/compiler/compile/render_dom/wrappers/Text.ts b/src/compiler/compile/render_dom/wrappers/Text.ts index 553ecd8e83..5bf139962b 100644 --- a/src/compiler/compile/render_dom/wrappers/Text.ts +++ b/src/compiler/compile/render_dom/wrappers/Text.ts @@ -4,6 +4,7 @@ import Text from '../../nodes/Text'; import Wrapper from './shared/Wrapper'; import { Identifier } from '../../../interfaces'; import { x } from 'code-red'; +import Node from '../../nodes/shared/Node'; // Whitespace inside one of these elements will not result in // a whitespace node being created in any circumstances. (This @@ -65,7 +66,7 @@ export default class TextWrapper extends Wrapper { return true; } - render(block: Block, parent_node: string, parent_nodes: string) { + render(block: Block, parent_node: Identifier, parent_nodes: Identifier) { if (this.skip) return; const use_space = this.use_space(); @@ -73,7 +74,7 @@ export default class TextWrapper extends Wrapper { this.var, use_space ? x`@space()` : x`@text("${this.data}")`, parent_nodes && (use_space ? x`@claim_space(${parent_nodes})` : x`@claim_text(${parent_nodes}, "${this.data}")`), - parent_node + parent_node as unknown as Node ); } } \ No newline at end of file diff --git a/src/compiler/compile/render_dom/wrappers/Title.ts b/src/compiler/compile/render_dom/wrappers/Title.ts index c2f2997c8c..b1ae7a6d52 100644 --- a/src/compiler/compile/render_dom/wrappers/Title.ts +++ b/src/compiler/compile/render_dom/wrappers/Title.ts @@ -6,6 +6,7 @@ import Title from '../../nodes/Title'; import { stringify } from '../../utils/stringify'; import add_to_set from '../../utils/add_to_set'; import Text from '../../nodes/Text'; +import { Identifier } from '../../../interfaces'; export default class TitleWrapper extends Wrapper { node: Title; @@ -21,7 +22,7 @@ export default class TitleWrapper extends Wrapper { super(renderer, block, parent, node); } - render(block: Block, _parent_node: string, _parent_nodes: string) { + render(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { const is_dynamic = !!this.node.children.find(node => node.type !== 'Text'); if (is_dynamic) { diff --git a/src/compiler/compile/render_dom/wrappers/Window.ts b/src/compiler/compile/render_dom/wrappers/Window.ts index ccb655aad2..9f8edd5682 100644 --- a/src/compiler/compile/render_dom/wrappers/Window.ts +++ b/src/compiler/compile/render_dom/wrappers/Window.ts @@ -7,6 +7,7 @@ import Window from '../../nodes/Window'; import add_actions from './shared/add_actions'; import { INode } from '../../nodes/interfaces'; import { changed } from './shared/changed'; +import { Identifier } from '../../../interfaces'; const associated_events = { innerWidth: 'resize', @@ -38,7 +39,7 @@ export default class WindowWrapper extends Wrapper { super(renderer, block, parent, node); } - render(block: Block, _parent_node: string, _parent_nodes: string) { + render(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { const { renderer } = this; const { component } = renderer; diff --git a/src/compiler/compile/render_dom/wrappers/shared/Wrapper.ts b/src/compiler/compile/render_dom/wrappers/shared/Wrapper.ts index 9fd7991ced..de1475bfe5 100644 --- a/src/compiler/compile/render_dom/wrappers/shared/Wrapper.ts +++ b/src/compiler/compile/render_dom/wrappers/shared/Wrapper.ts @@ -1,7 +1,7 @@ import Renderer from '../../Renderer'; import Block from '../../Block'; import { INode } from '../../../nodes/interfaces'; -import { Identifier } from '../../../../interfaces'; +import { Identifier, Node } from '../../../../interfaces'; import { x } from 'code-red'; export default class Wrapper { @@ -44,7 +44,7 @@ export default class Wrapper { if (this.parent) this.parent.cannot_use_innerhtml(); } - get_or_create_anchor(block: Block, parent_node: string, parent_nodes: string) { + get_or_create_anchor(block: Block, parent_node: Identifier, parent_nodes: Identifier) { // 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(); @@ -57,7 +57,7 @@ export default class Wrapper { anchor, x`@empty()`, parent_nodes && x`@empty()`, - parent_node + parent_node as unknown as Node ); } @@ -78,7 +78,7 @@ export default class Wrapper { ); } - render(_block: Block, _parent_node: string, _parent_nodes: string) { + render(_block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { throw Error('Wrapper class is not renderable'); } } diff --git a/src/compiler/compile/render_dom/wrappers/shared/is_head.ts b/src/compiler/compile/render_dom/wrappers/shared/is_head.ts new file mode 100644 index 0000000000..ebc6e27548 --- /dev/null +++ b/src/compiler/compile/render_dom/wrappers/shared/is_head.ts @@ -0,0 +1,3 @@ +export function is_head(node) { + return node && node.type === 'MemberExpression' && node.object.name === '@_document' && node.property.name === 'head'; +} \ No newline at end of file