1
- import { Nodeish , HTMLNode } from "./Node.ts" ;
2
- import { isFalsy , escapeHTML } from "./util.ts" ;
1
+ ///<reference path="https://raw.githubusercontent.com/denoland/deno/main/cli/dts/lib.deno.ns.d.ts" />
2
+ ///<reference path="https://raw.githubusercontent.com/microsoft/TypeScript/main/lib/lib.dom.d.ts" />
3
+
4
+ import { Node , Nodeish , HTMLNode } from "./Node.ts" ;
5
+ import { Falsy , isFalsy , escapeHTML , guessEnv } from "./util.ts" ;
3
6
4
7
export function renderHTML ( node : Nodeish ) {
5
8
if ( isFalsy ( node ) ) return "" ;
@@ -21,3 +24,47 @@ export function renderHTML(node: Nodeish) {
21
24
22
25
return stringified ;
23
26
}
27
+
28
+ type NodeishtoDOM < N extends Nodeish > = N extends Falsy
29
+ ? ""
30
+ : N extends string
31
+ ? string
32
+ : N extends HTMLNode
33
+ ? { innerHTML : string }
34
+ : HTMLElement ;
35
+
36
+ const toDOM = function toDOM < N extends Nodeish > ( node : N ) {
37
+ if ( isFalsy ( node ) ) return "" ;
38
+ if ( typeof node === "string" ) return escapeHTML ( node ) ;
39
+ if ( node instanceof HTMLNode ) return { innerHTML : node . htmlString } ;
40
+
41
+ const el = document . createElement ( node . tag ) ;
42
+
43
+ for ( const attr in node . attrs ) {
44
+ el . setAttribute ( attr , node . attrs [ attr ] ) ;
45
+ }
46
+
47
+ for ( const child of node . children ) {
48
+ const childNode = toDOM ( child ) ;
49
+ if ( typeof childNode !== "string" && "innerHTML" in childNode )
50
+ el . insertAdjacentHTML ( "beforeend" , childNode . innerHTML ) ;
51
+ else el . append ( childNode ) ;
52
+ }
53
+
54
+ return el ;
55
+ } as < N extends Nodeish > ( node : N ) => NodeishtoDOM < N > ;
56
+
57
+ export function renderDOM <
58
+ HyNode extends Node | string ,
59
+ RootNode extends HTMLElement ,
60
+ > ( rootNode : RootNode , hyNode : HyNode ) {
61
+ const env = guessEnv ( ) ;
62
+ if ( env !== "browser" )
63
+ throw new Error (
64
+ `renderDOM is meant to be used in the browser.` +
65
+ ` Found: '${ env || "unknown" } '` ,
66
+ ) ;
67
+
68
+ const domNode = toDOM ( hyNode ) ;
69
+ return rootNode . append ( domNode ) ;
70
+ }
0 commit comments