From 596c432f5e7d23da031730c80e1d89e22bb7756d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 9 Dec 2017 14:20:07 -0500 Subject: [PATCH] move shared MustacheTag/RawMustacheTag logic --- src/generators/dom/visitors/shared/Tag.ts | 50 ----------------------- src/generators/nodes/MustacheTag.ts | 10 ++--- src/generators/nodes/RawMustacheTag.ts | 10 ++--- src/generators/nodes/shared/Tag.ts | 47 +++++++++++++++++++++ 4 files changed, 53 insertions(+), 64 deletions(-) delete mode 100644 src/generators/dom/visitors/shared/Tag.ts create mode 100644 src/generators/nodes/shared/Tag.ts diff --git a/src/generators/dom/visitors/shared/Tag.ts b/src/generators/dom/visitors/shared/Tag.ts deleted file mode 100644 index cc30e570b3..0000000000 --- a/src/generators/dom/visitors/shared/Tag.ts +++ /dev/null @@ -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 }; -} diff --git a/src/generators/nodes/MustacheTag.ts b/src/generators/nodes/MustacheTag.ts index ef0ac1ae62..a353896299 100644 --- a/src/generators/nodes/MustacheTag.ts +++ b/src/generators/nodes/MustacheTag.ts @@ -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};` ); diff --git a/src/generators/nodes/RawMustacheTag.ts b/src/generators/nodes/RawMustacheTag.ts index 94cc21937e..dda177f18c 100644 --- a/src/generators/nodes/RawMustacheTag.ts +++ b/src/generators/nodes/RawMustacheTag.ts @@ -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)} diff --git a/src/generators/nodes/shared/Tag.ts b/src/generators/nodes/shared/Tag.ts new file mode 100644 index 0000000000..7b29d21440 --- /dev/null +++ b/src/generators/nodes/shared/Tag.ts @@ -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 }; + } +} \ No newline at end of file