From ac1e5d836630a7748a8febcb57b192fccf65f36d Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 21 May 2017 21:18:24 -0400 Subject: [PATCH] more TS --- src/generators/server-side-rendering/Block.ts | 21 +++++++++++++++---- src/generators/server-side-rendering/index.ts | 1 + src/generators/server-side-rendering/visit.ts | 7 +++++-- .../visitors/Component.ts | 15 +++++++------ .../visitors/EachBlock.ts | 7 +++++-- .../server-side-rendering/visitors/Element.ts | 11 ++++++---- .../server-side-rendering/visitors/IfBlock.ts | 9 +++++--- .../visitors/MustacheTag.ts | 6 +++++- .../visitors/RawMustacheTag.ts | 6 +++++- .../server-side-rendering/visitors/Text.ts | 6 +++++- .../visitors/YieldTag.ts | 4 +++- 11 files changed, 68 insertions(+), 25 deletions(-) diff --git a/src/generators/server-side-rendering/Block.ts b/src/generators/server-side-rendering/Block.ts index 11bb494a89..d73fde6c6e 100644 --- a/src/generators/server-side-rendering/Block.ts +++ b/src/generators/server-side-rendering/Block.ts @@ -1,12 +1,25 @@ import deindent from '../../utils/deindent.js'; import flattenReference from '../../utils/flattenReference'; +import { SsrGenerator } from './index'; +import { Node } from '../../interfaces'; + +interface BlockOptions { + // TODO +} export default class Block { - constructor ( options ) { + generator: SsrGenerator; + conditions: string[]; + + contexts: Map; + indexes: Map; + contextDependencies: Map; + + constructor ( options: BlockOptions ) { Object.assign( this, options ); } - addBinding ( binding, name ) { + addBinding ( binding: Node, name: string ) { const conditions = [ `!( '${binding.name}' in state )`].concat( // TODO handle contextual bindings... this.conditions.map( c => `(${c})` ) ); @@ -24,11 +37,11 @@ export default class Block { ` ); } - child ( options ) { + child ( options: BlockOptions ) { return new Block( Object.assign( {}, this, options, { parent: this } ) ); } - contextualise ( expression, context, isEventHandler ) { + contextualise ( expression: Node, context?: string, isEventHandler?: boolean ) { return this.generator.contextualise( this, expression, context, isEventHandler ); } } \ No newline at end of file diff --git a/src/generators/server-side-rendering/index.ts b/src/generators/server-side-rendering/index.ts index 7d53d018d8..5a95b48965 100644 --- a/src/generators/server-side-rendering/index.ts +++ b/src/generators/server-side-rendering/index.ts @@ -7,6 +7,7 @@ import { Parsed, Node, CompileOptions } from '../../interfaces'; export class SsrGenerator extends Generator { bindings: string[]; renderCode: string; + elementDepth: number; constructor ( parsed: Parsed, source: string, name: string, options: CompileOptions ) { super( parsed, source, name, options ); diff --git a/src/generators/server-side-rendering/visit.ts b/src/generators/server-side-rendering/visit.ts index ac75e0af03..8668a8a922 100644 --- a/src/generators/server-side-rendering/visit.ts +++ b/src/generators/server-side-rendering/visit.ts @@ -1,6 +1,9 @@ import visitors from './visitors/index'; +import { SsrGenerator } from './index'; +import Block from './Block'; +import { Node } from '../../interfaces'; -export default function visit ( generator, fragment, node ) { +export default function visit ( generator: SsrGenerator, block: Block, node: Node ) { const visitor = visitors[ node.type ]; - visitor( generator, fragment, node ); + visitor( generator, block, node ); } \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/Component.ts b/src/generators/server-side-rendering/visitors/Component.ts index 14ab2ca8f7..557b6553c1 100644 --- a/src/generators/server-side-rendering/visitors/Component.ts +++ b/src/generators/server-side-rendering/visitors/Component.ts @@ -1,8 +1,11 @@ import flattenReference from '../../../utils/flattenReference'; import visit from '../visit'; +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; -export default function visitComponent ( generator, block, node ) { - function stringify ( chunk ) { +export default function visitComponent ( generator: SsrGenerator, block: Block, node: Node ) { + function stringify ( chunk: Node ) { if ( chunk.type === 'Text' ) return chunk.data; if ( chunk.type === 'MustacheTag' ) { const { snippet } = block.contextualise( chunk.expression ); @@ -10,10 +13,10 @@ export default function visitComponent ( generator, block, node ) { } } - const attributes = []; - const bindings = []; + const attributes: Node[] = []; + const bindings: Node[] = []; - node.attributes.forEach( attribute => { + node.attributes.forEach( ( attribute: Node ) => { if ( attribute.type === 'Attribute' ) { attributes.push( attribute ); } else if ( attribute.type === 'Binding' ) { @@ -66,7 +69,7 @@ export default function visitComponent ( generator, block, node ) { generator.elementDepth += 1; - node.children.forEach( child => { + node.children.forEach( ( child: Node ) => { visit( generator, block, child ); }); diff --git a/src/generators/server-side-rendering/visitors/EachBlock.ts b/src/generators/server-side-rendering/visitors/EachBlock.ts index f09f334cf3..a08ffd2668 100644 --- a/src/generators/server-side-rendering/visitors/EachBlock.ts +++ b/src/generators/server-side-rendering/visitors/EachBlock.ts @@ -1,6 +1,9 @@ import visit from '../visit'; +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; -export default function visitEachBlock ( generator, block, node ) { +export default function visitEachBlock ( generator: SsrGenerator, block: Block, node: Node ) { const { dependencies, snippet } = block.contextualise( node.expression ); const open = `\${ ${snippet}.map( ${ node.index ? `( ${node.context}, ${node.index} )` : node.context} => \``; @@ -23,7 +26,7 @@ export default function visitEachBlock ( generator, block, node ) { contextDependencies }); - node.children.forEach( child => { + node.children.forEach( ( child: Node ) => { visit( generator, childBlock, child ); }); diff --git a/src/generators/server-side-rendering/visitors/Element.ts b/src/generators/server-side-rendering/visitors/Element.ts index 20ac1b20ed..bfa615227a 100644 --- a/src/generators/server-side-rendering/visitors/Element.ts +++ b/src/generators/server-side-rendering/visitors/Element.ts @@ -2,12 +2,15 @@ import visitComponent from './Component'; import isVoidElementName from '../../../utils/isVoidElementName'; import visit from '../visit'; import visitWindow from './meta/Window'; +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; const meta = { ':Window': visitWindow }; -export default function visitElement ( generator, block, node ) { +export default function visitElement ( generator: SsrGenerator, block: Block, node: Node ) { if ( node.name in meta ) { return meta[ node.name ]( generator, block, node ); } @@ -19,13 +22,13 @@ export default function visitElement ( generator, block, node ) { let openingTag = `<${node.name}`; - node.attributes.forEach( attribute => { + node.attributes.forEach( ( attribute: Node ) => { if ( attribute.type !== 'Attribute' ) return; let str = ` ${attribute.name}`; if ( attribute.value !== true ) { - str += `="` + attribute.value.map( chunk => { + str += `="` + attribute.value.map( ( chunk: Node ) => { if ( chunk.type === 'Text' ) { return chunk.data; } @@ -48,7 +51,7 @@ export default function visitElement ( generator, block, node ) { generator.elementDepth += 1; - node.children.forEach( child => { + node.children.forEach( ( child: Node ) => { visit( generator, block, child ); }); diff --git a/src/generators/server-side-rendering/visitors/IfBlock.ts b/src/generators/server-side-rendering/visitors/IfBlock.ts index 0b7e2b912a..42cd2f861b 100644 --- a/src/generators/server-side-rendering/visitors/IfBlock.ts +++ b/src/generators/server-side-rendering/visitors/IfBlock.ts @@ -1,6 +1,9 @@ import visit from '../visit'; +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; -export default function visitIfBlock ( generator, block, node ) { +export default function visitIfBlock ( generator: SsrGenerator, block: Block, node: Node ) { const { snippet } = block.contextualise( node.expression ); generator.append( '${ ' + snippet + ' ? `' ); @@ -9,14 +12,14 @@ export default function visitIfBlock ( generator, block, node ) { conditions: block.conditions.concat( snippet ) }); - node.children.forEach( child => { + node.children.forEach( ( child: Node ) => { visit( generator, childBlock, child ); }); generator.append( '` : `' ); if ( node.else ) { - node.else.children.forEach( child => { + node.else.children.forEach( ( child: Node ) => { visit( generator, childBlock, child ); }); } diff --git a/src/generators/server-side-rendering/visitors/MustacheTag.ts b/src/generators/server-side-rendering/visitors/MustacheTag.ts index 4135ef9203..78c4646588 100644 --- a/src/generators/server-side-rendering/visitors/MustacheTag.ts +++ b/src/generators/server-side-rendering/visitors/MustacheTag.ts @@ -1,4 +1,8 @@ -export default function visitMustacheTag ( generator, block, node ) { +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; + +export default function visitMustacheTag ( generator: SsrGenerator, block: Block, node: Node ) { const { snippet } = block.contextualise( node.expression ); generator.append( '${__escape( ' + snippet + ' )}' ); } \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/RawMustacheTag.ts b/src/generators/server-side-rendering/visitors/RawMustacheTag.ts index 93b1f3c5f8..9dfaf171e6 100644 --- a/src/generators/server-side-rendering/visitors/RawMustacheTag.ts +++ b/src/generators/server-side-rendering/visitors/RawMustacheTag.ts @@ -1,4 +1,8 @@ -export default function visitRawMustacheTag ( generator, block, node ) { +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; + +export default function visitRawMustacheTag ( generator: SsrGenerator, block: Block, node: Node ) { const { snippet } = block.contextualise( node.expression ); generator.append( '${' + snippet + '}' ); } \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/Text.ts b/src/generators/server-side-rendering/visitors/Text.ts index d7e30d41c5..3d119ff6be 100644 --- a/src/generators/server-side-rendering/visitors/Text.ts +++ b/src/generators/server-side-rendering/visitors/Text.ts @@ -1,3 +1,7 @@ -export default function visitText ( generator, block, node ) { +import { SsrGenerator } from '../index'; +import Block from '../Block'; +import { Node } from '../../../interfaces'; + +export default function visitText ( generator: SsrGenerator, block: Block, node: Node ) { generator.append( node.data.replace( /\${/g, '\\${' ) ); } \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/YieldTag.ts b/src/generators/server-side-rendering/visitors/YieldTag.ts index bde5ab1a00..16dd83ddbc 100644 --- a/src/generators/server-side-rendering/visitors/YieldTag.ts +++ b/src/generators/server-side-rendering/visitors/YieldTag.ts @@ -1,3 +1,5 @@ -export default function visitYieldTag ( generator ) { +import { SsrGenerator } from '../index'; + +export default function visitYieldTag ( generator: SsrGenerator ) { generator.append( `\${options && options.yield ? options.yield() : ''}` ); } \ No newline at end of file