dont worry con i promise i will squash these commits

pull/3539/head
Richard Harris 6 years ago
parent 42f4d69d3b
commit 8d093c6200

@ -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() {

@ -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});`);

@ -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);
}
}

@ -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);
});
}
}

@ -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);

@ -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;

@ -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;

@ -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);

@ -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`)

@ -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);
}

@ -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);
}
}

@ -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

@ -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);
});
}

@ -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
);
}
}

@ -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) {

@ -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;

@ -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
);
}
}

@ -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) {

@ -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;

@ -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');
}
}

@ -0,0 +1,3 @@
export function is_head(node) {
return node && node.type === 'MemberExpression' && node.object.name === '@_document' && node.property.name === 'head';
}
Loading…
Cancel
Save