Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Jan 9, 2025. It is now read-only.

Commit 7455cb0

Browse files
keithamuskoddsson
andauthored
move all functions to their own files
Co-authored-by: Kristján Oddsson <[email protected]>
1 parent 2237f90 commit 7455cb0

File tree

11 files changed

+381
-361
lines changed

11 files changed

+381
-361
lines changed

src/document-fragment.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {NodeTemplatePart} from '@github/template-parts'
2+
import type {TemplatePart} from '@github/template-parts'
3+
4+
export function processDocumentFragment(part: TemplatePart, value: unknown): boolean {
5+
if (value instanceof DocumentFragment && part instanceof NodeTemplatePart) {
6+
if (value.childNodes.length) part.replace(...value.childNodes)
7+
return true
8+
}
9+
return false
10+
}

src/html.ts

Lines changed: 3 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,6 @@
1-
import {
2-
TemplateInstance,
3-
NodeTemplatePart,
4-
createProcessor,
5-
processPropertyIdentity,
6-
processBooleanAttribute
7-
} from '@github/template-parts'
8-
import {processDirective} from './directive.js'
9-
import {processEvent} from './events.js'
10-
import type {TemplatePart, TemplateTypeInit} from '@github/template-parts'
1+
import {processor} from './processor.js'
2+
import {TemplateResult} from './template-result.js'
113

12-
function processSubTemplate(part: TemplatePart, value: unknown): boolean {
13-
if (value instanceof TemplateResult && part instanceof NodeTemplatePart) {
14-
value.renderInto(part)
15-
return true
16-
}
17-
return false
18-
}
19-
20-
function processDocumentFragment(part: TemplatePart, value: unknown): boolean {
21-
if (value instanceof DocumentFragment && part instanceof NodeTemplatePart) {
22-
if (value.childNodes.length) part.replace(...value.childNodes)
23-
return true
24-
}
25-
return false
26-
}
27-
28-
function isIterable(value: unknown): value is Iterable<unknown> {
29-
return typeof value === 'object' && Symbol.iterator in ((value as unknown) as Record<symbol, unknown>)
30-
}
31-
32-
function processIterable(part: TemplatePart, value: unknown): boolean {
33-
if (!isIterable(value)) return false
34-
if (part instanceof NodeTemplatePart) {
35-
const nodes = []
36-
for (const item of value) {
37-
if (item instanceof TemplateResult) {
38-
const fragment = document.createDocumentFragment()
39-
item.renderInto(fragment)
40-
nodes.push(...fragment.childNodes)
41-
} else if (item instanceof DocumentFragment) {
42-
nodes.push(...item.childNodes)
43-
} else {
44-
nodes.push(String(item))
45-
}
46-
}
47-
if (nodes.length) part.replace(...nodes)
48-
return true
49-
} else {
50-
part.value = Array.from(value).join(' ')
51-
return true
52-
}
53-
}
54-
55-
export function processPart(part: TemplatePart, value: unknown): void {
56-
processDirective(part, value) ||
57-
processBooleanAttribute(part, value) ||
58-
processEvent(part, value) ||
59-
processSubTemplate(part, value) ||
60-
processDocumentFragment(part, value) ||
61-
processIterable(part, value) ||
62-
processPropertyIdentity(part, value)
63-
}
64-
65-
const templates = new WeakMap<TemplateStringsArray, HTMLTemplateElement>()
66-
const renderedTemplates = new WeakMap<Node | NodeTemplatePart, HTMLTemplateElement>()
67-
const renderedTemplateInstances = new WeakMap<Node | NodeTemplatePart, TemplateInstance>()
68-
export class TemplateResult {
69-
constructor(
70-
public readonly strings: TemplateStringsArray,
71-
public readonly values: unknown[],
72-
public readonly processor: TemplateTypeInit
73-
) {}
74-
75-
get template(): HTMLTemplateElement {
76-
if (templates.has(this.strings)) {
77-
return templates.get(this.strings)!
78-
} else {
79-
const template = document.createElement('template')
80-
const end = this.strings.length - 1
81-
template.innerHTML = this.strings.reduce((str, cur, i) => str + cur + (i < end ? `{{ ${i} }}` : ''), '')
82-
templates.set(this.strings, template)
83-
return template
84-
}
85-
}
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-
return
99-
}
100-
renderedTemplateInstances.get(element)!.update((this.values as unknown) as Record<string, unknown>)
101-
}
102-
}
103-
104-
const defaultProcessor = createProcessor(processPart)
1054
export function html(strings: TemplateStringsArray, ...values: unknown[]): TemplateResult {
106-
return new TemplateResult(strings, values, defaultProcessor)
107-
}
108-
109-
export function render(result: TemplateResult, element: Node | NodeTemplatePart): void {
110-
result.renderInto(element)
5+
return new TemplateResult(strings, values, processor)
1116
}

src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
export {TemplateResult, html, render} from './html.js'
1+
export {TemplateResult} from './template-result.js'
2+
export {render} from './render.js'
3+
export {processor} from './processor.js'
4+
export {html} from './html.js'
25
export {isDirective, directive} from './directive.js'
36
export {until} from './until.js'
47
export {unsafeHTML} from './unsafe-html.js'

src/iterable.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import {TemplateResult} from './template-result.js'
2+
import {NodeTemplatePart} from '@github/template-parts'
3+
import type {TemplatePart} from '@github/template-parts'
4+
5+
function isIterable(value: unknown): value is Iterable<unknown> {
6+
return typeof value === 'object' && Symbol.iterator in ((value as unknown) as Record<symbol, unknown>)
7+
}
8+
9+
export function processIterable(part: TemplatePart, value: unknown): boolean {
10+
if (!isIterable(value)) return false
11+
if (part instanceof NodeTemplatePart) {
12+
const nodes = []
13+
for (const item of value) {
14+
if (item instanceof TemplateResult) {
15+
const fragment = document.createDocumentFragment()
16+
item.renderInto(fragment)
17+
nodes.push(...fragment.childNodes)
18+
} else if (item instanceof DocumentFragment) {
19+
nodes.push(...item.childNodes)
20+
} else {
21+
nodes.push(String(item))
22+
}
23+
}
24+
if (nodes.length) part.replace(...nodes)
25+
return true
26+
} else {
27+
part.value = Array.from(value).join(' ')
28+
return true
29+
}
30+
}

src/processor.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {createProcessor, processPropertyIdentity, processBooleanAttribute} from '@github/template-parts'
2+
import type {TemplatePart} from '@github/template-parts'
3+
4+
import {processDirective} from './directive.js'
5+
import {processEvent} from './events.js'
6+
import {processIterable} from './iterable.js'
7+
import {processDocumentFragment} from './document-fragment.js'
8+
import {processSubTemplate} from './sub-template.js'
9+
10+
export function processPart(part: TemplatePart, value: unknown): void {
11+
processDirective(part, value) ||
12+
processBooleanAttribute(part, value) ||
13+
processEvent(part, value) ||
14+
processSubTemplate(part, value) ||
15+
processDocumentFragment(part, value) ||
16+
processIterable(part, value) ||
17+
processPropertyIdentity(part, value)
18+
}
19+
20+
export const processor = createProcessor(processPart)

src/render.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type {NodeTemplatePart} from '@github/template-parts'
2+
3+
import {TemplateResult} from './template-result.js'
4+
5+
export function render(result: TemplateResult, element: Node | NodeTemplatePart): void {
6+
result.renderInto(element)
7+
}

src/sub-template.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import {NodeTemplatePart} from '@github/template-parts'
2+
import type {TemplatePart} from '@github/template-parts'
3+
4+
import {TemplateResult} from './template-result.js'
5+
6+
export function processSubTemplate(part: TemplatePart, value: unknown): boolean {
7+
if (value instanceof TemplateResult && part instanceof NodeTemplatePart) {
8+
value.renderInto(part)
9+
return true
10+
}
11+
return false
12+
}

src/template-result.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import {TemplateInstance, NodeTemplatePart} from '@github/template-parts'
2+
import type {TemplateTypeInit} from '@github/template-parts'
3+
4+
const templates = new WeakMap<TemplateStringsArray, HTMLTemplateElement>()
5+
const renderedTemplates = new WeakMap<Node | NodeTemplatePart, HTMLTemplateElement>()
6+
const renderedTemplateInstances = new WeakMap<Node | NodeTemplatePart, TemplateInstance>()
7+
export class TemplateResult {
8+
constructor(
9+
public readonly strings: TemplateStringsArray,
10+
public readonly values: unknown[],
11+
public readonly processor: TemplateTypeInit
12+
) {}
13+
14+
get template(): HTMLTemplateElement {
15+
if (templates.has(this.strings)) {
16+
return templates.get(this.strings)!
17+
} else {
18+
const template = document.createElement('template')
19+
const end = this.strings.length - 1
20+
template.innerHTML = this.strings.reduce((str, cur, i) => str + cur + (i < end ? `{{ ${i} }}` : ''), '')
21+
templates.set(this.strings, template)
22+
return template
23+
}
24+
}
25+
26+
renderInto(element: Node | NodeTemplatePart): void {
27+
const template = this.template
28+
if (renderedTemplates.get(element) !== template) {
29+
renderedTemplates.set(element, template)
30+
const instance = new TemplateInstance(template, this.values, this.processor)
31+
renderedTemplateInstances.set(element, instance)
32+
if (element instanceof NodeTemplatePart) {
33+
element.replace(...instance.children)
34+
} else {
35+
element.appendChild(instance)
36+
}
37+
return
38+
}
39+
renderedTemplateInstances.get(element)!.update((this.values as unknown) as Record<string, unknown>)
40+
}
41+
}

src/until.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import {processPart} from './html.js'
2-
import {directive} from './directive.js'
31
import type {TemplatePart} from '@github/template-parts'
42

3+
import {processPart} from './processor.js'
4+
import {directive} from './directive.js'
5+
56
const untils: WeakMap<TemplatePart, {i: number}> = new WeakMap()
67
export const until = directive((...promises: unknown[]) => (part: TemplatePart) => {
78
if (!untils.has(part)) untils.set(part, {i: promises.length})

0 commit comments

Comments
 (0)