@@ -11,7 +11,7 @@ import type {TemplatePart, TemplateTypeInit} from '@github/template-parts'
1111
1212function processSubTemplate ( part : TemplatePart , value : unknown ) : boolean {
1313 if ( value instanceof TemplateResult && part instanceof NodeTemplatePart ) {
14- render ( value , part )
14+ value . renderInto ( part )
1515 return true
1616 }
1717 return false
@@ -36,7 +36,7 @@ function processIterable(part: TemplatePart, value: unknown): boolean {
3636 for ( const item of value ) {
3737 if ( item instanceof TemplateResult ) {
3838 const fragment = document . createDocumentFragment ( )
39- render ( item , fragment )
39+ item . renderInto ( fragment )
4040 nodes . push ( ...fragment . children )
4141 } else if ( item instanceof DocumentFragment ) {
4242 nodes . push ( ...item . children )
@@ -63,6 +63,8 @@ export function processPart(part: TemplatePart, value: unknown): void {
6363}
6464
6565const templates = new WeakMap < TemplateStringsArray , HTMLTemplateElement > ( )
66+ const renderedTemplates = new WeakMap < Node | NodeTemplatePart , HTMLTemplateElement > ( )
67+ const renderedTemplateInstances = new WeakMap < Node | NodeTemplatePart , TemplateInstance > ( )
6668export class TemplateResult {
6769 constructor (
6870 public readonly strings : TemplateStringsArray ,
@@ -81,25 +83,28 @@ export class TemplateResult {
8183 return template
8284 }
8385 }
86+
87+ renderInto ( element : Node | NodeTemplatePart ) : void {
88+ const template = this . template
89+ if ( renderedTemplates . get ( element ) !== template ) {
90+ renderedTemplates . set ( element , template )
91+ const instance = new TemplateInstance ( template , this . values , this . processor )
92+ renderedTemplateInstances . set ( element , instance )
93+ if ( element instanceof NodeTemplatePart ) {
94+ element . replace ( ...instance . children )
95+ } else {
96+ element . appendChild ( instance )
97+ }
98+ }
99+ renderedTemplateInstances . get ( element ) ! . update ( ( this . values as unknown ) as Record < string , unknown > )
100+ }
84101}
85102
86103const defaultProcessor = createProcessor ( processPart )
87104export function html ( strings : TemplateStringsArray , ...values : unknown [ ] ) : TemplateResult {
88105 return new TemplateResult ( strings , values , defaultProcessor )
89106}
90107
91- const renderedTemplates = new WeakMap < Node | NodeTemplatePart , HTMLTemplateElement > ( )
92- const renderedTemplateInstances = new WeakMap < Node | NodeTemplatePart , TemplateInstance > ( )
93108export function render ( result : TemplateResult , element : Node | NodeTemplatePart ) : void {
94- if ( renderedTemplates . get ( element ) !== result . template ) {
95- renderedTemplates . set ( element , result . template )
96- const instance = new TemplateInstance ( result . template , result . values , result . processor )
97- renderedTemplateInstances . set ( element , instance )
98- if ( element instanceof NodeTemplatePart ) {
99- element . replace ( ...instance . children )
100- } else {
101- element . appendChild ( instance )
102- }
103- }
104- renderedTemplateInstances . get ( element ) ! . update ( ( result . values as unknown ) as Record < string , unknown > )
109+ result . renderInto ( element )
105110}
0 commit comments