move shared MustacheTag/RawMustacheTag logic

pull/992/head
Rich Harris 8 years ago
parent 8072f6ad77
commit 596c432f5e

@ -1,50 +0,0 @@
import deindent from '../../../../utils/deindent';
import { DomGenerator } from '../../index';
import Block from '../../Block';
import { Node } from '../../../../interfaces';
import State from '../../State';
export default function visitTag(
generator: DomGenerator,
block: Block,
state: State,
node: Node,
name: string,
update: (value: string) => string
) {
const { indexes } = block.contextualise(node.expression);
const { dependencies, snippet } = node.metadata;
const hasChangeableIndex = Array.from(indexes).some(index => block.changeableIndexes.get(index));
const shouldCache = (
node.expression.type !== 'Identifier' ||
block.contexts.has(node.expression.name) ||
hasChangeableIndex
);
const value = shouldCache && block.getUniqueName(`${name}_value`);
const content = shouldCache ? value : snippet;
if (shouldCache) block.addVariable(value, snippet);
if (dependencies.length || hasChangeableIndex) {
const changedCheck = (
(block.hasOutroMethod ? `#outroing || ` : '') +
dependencies.map((dependency: string) => `changed.${dependency}`).join(' || ')
);
const updateCachedValue = `${value} !== (${value} = ${snippet})`;
const condition = shouldCache ?
(dependencies.length ? `(${changedCheck}) && ${updateCachedValue}` : updateCachedValue) :
changedCheck;
block.builders.update.addConditional(
condition,
update(content)
);
}
return { init: content };
}

@ -1,9 +1,9 @@
import Node from './shared/Node';
import Tag from './shared/Tag';
import Block from '../dom/Block';
import State from '../dom/State';
import visitTag from '../dom/visitors/shared/Tag';
export default class MustacheTag extends Node {
export default class MustacheTag extends Tag {
init(block: Block) {
this.cannotUseInnerHTML();
this.var = block.getUniqueName('text');
@ -16,12 +16,8 @@ export default class MustacheTag extends Node {
elementStack: Node[],
componentStack: Node[]
) {
const { init } = visitTag(
this.generator,
const { init } = this.renameThisMethod(
block,
state,
this,
this.var,
value => `${this.var}.data = ${value};`
);

@ -1,10 +1,10 @@
import deindent from '../../utils/deindent';
import Node from './shared/Node';
import Tag from './shared/Tag';
import Block from '../dom/Block';
import State from '../dom/State';
import visitTag from '../dom/visitors/shared/Tag';
export default class RawMustacheTag extends Node {
export default class RawMustacheTag extends Tag {
init(block: Block) {
this.cannotUseInnerHTML();
this.var = block.getUniqueName('raw');
@ -49,12 +49,8 @@ export default class RawMustacheTag extends Node {
insert = content => `${anchorBefore}.insertAdjacentHTML("afterend", ${content});`;
}
const { init } = visitTag(
this.generator,
const { init } = this.renameThisMethod(
block,
state,
this,
name,
content => deindent`
${!useInnerHTML && detach}
${insert(content)}

@ -0,0 +1,47 @@
import deindent from '../../utils/deindent';
import Node from './Node';
import Block from '../../dom/Block';
import State from '../../dom/State';
export default class Tag extends Node {
renameThisMethod(
block: Block,
update: ((value: string) => string)
) {
const { indexes } = block.contextualise(this.expression);
const { dependencies, snippet } = this.metadata;
const hasChangeableIndex = Array.from(indexes).some(index => block.changeableIndexes.get(index));
const shouldCache = (
this.expression.type !== 'Identifier' ||
block.contexts.has(this.expression.name) ||
hasChangeableIndex
);
const value = shouldCache && block.getUniqueName(`${this.var}_value`);
const content = shouldCache ? value : snippet;
if (shouldCache) block.addVariable(value, snippet);
if (dependencies.length || hasChangeableIndex) {
const changedCheck = (
(block.hasOutroMethod ? `#outroing || ` : '') +
dependencies.map((dependency: string) => `changed.${dependency}`).join(' || ')
);
const updateCachedValue = `${value} !== (${value} = ${snippet})`;
const condition = shouldCache ?
(dependencies.length ? `(${changedCheck}) && ${updateCachedValue}` : updateCachedValue) :
changedCheck;
block.builders.update.addConditional(
condition,
update(content)
);
}
return { init: content };
}
}
Loading…
Cancel
Save