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" ;
36
47export function renderHTML ( node : Nodeish ) {
58 if ( isFalsy ( node ) ) return "" ;
@@ -21,3 +24,47 @@ export function renderHTML(node: Nodeish) {
2124
2225 return stringified ;
2326}
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