{"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import {Portal, Renderer} from \"./crank.js\";\nimport type {ElementValue, RenderAdapter} from \"./crank.js\";\nimport {camelToKebabCase, formatStyleValue} from \"./_css.js\";\nimport {REACT_SVG_PROPS} from \"./_svg.js\";\n\nconst voidTags = new Set([\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"command\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"keygen\",\n\t\"link\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\",\n]);\n\nfunction escape(text: string): string {\n\treturn text.replace(/[&<>\"']/g, (match) => {\n\t\tswitch (match) {\n\t\t\tcase \"&\":\n\t\t\t\treturn \"&amp;\";\n\t\t\tcase \"<\":\n\t\t\t\treturn \"&lt;\";\n\t\t\tcase \">\":\n\t\t\t\treturn \"&gt;\";\n\t\t\tcase '\"':\n\t\t\t\treturn \"&quot;\";\n\t\t\tcase \"'\":\n\t\t\t\treturn \"&#039;\";\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t}\n\t});\n}\n\nfunction printStyleObject(style: Record<string, any>): string {\n\tconst cssStrings = [];\n\tfor (const [name, value] of Object.entries(style)) {\n\t\tif (value != null) {\n\t\t\tconst cssName = camelToKebabCase(name);\n\t\t\tconst cssValue = formatStyleValue(cssName, value);\n\t\t\tcssStrings.push(`${cssName}:${cssValue};`);\n\t\t}\n\t}\n\n\treturn cssStrings.join(\"\");\n}\n\nfunction printAttrs(props: Record<string, any>, isSVG?: boolean): string {\n\tconst attrs: string[] = [];\n\tfor (let [name, value] of Object.entries(props)) {\n\t\tif (\n\t\t\tname === \"innerHTML\" ||\n\t\t\tname === \"dangerouslySetInnerHTML\" ||\n\t\t\tname.startsWith(\"prop:\")\n\t\t) {\n\t\t\tcontinue;\n\t\t} else if (name === \"htmlFor\") {\n\t\t\tif (\"for\" in props || value == null || value === false) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tattrs.push(`for=\"${escape(String(value === true ? \"\" : value))}\"`);\n\t\t} else if (name === \"style\") {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tattrs.push(`style=\"${escape(value)}\"`);\n\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\tattrs.push(`style=\"${escape(printStyleObject(value))}\"`);\n\t\t\t}\n\t\t} else if (name === \"className\") {\n\t\t\tif (\"class\" in props || typeof value !== \"string\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tattrs.push(`class=\"${escape(value)}\"`);\n\t\t} else if (name === \"class\") {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tattrs.push(`class=\"${escape(value)}\"`);\n\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t// class={{\"foo bar\": true, \"baz\": false}} syntax\n\t\t\t\tconst classes = Object.keys(value)\n\t\t\t\t\t.filter((k) => value[k])\n\t\t\t\t\t.join(\" \");\n\t\t\t\tif (classes) {\n\t\t\t\t\tattrs.push(`class=\"${escape(classes)}\"`);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (name.startsWith(\"attr:\")) {\n\t\t\t\tname = name.slice(\"attr:\".length);\n\t\t\t} else if (isSVG && name in REACT_SVG_PROPS) {\n\t\t\t\tname = REACT_SVG_PROPS[name];\n\t\t\t}\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tattrs.push(`${escape(name)}=\"${escape(value)}\"`);\n\t\t\t} else if (typeof value === \"number\") {\n\t\t\t\tattrs.push(`${escape(name)}=\"${value}\"`);\n\t\t\t} else if (value === true) {\n\t\t\t\tattrs.push(`${escape(name)}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn attrs.join(\" \");\n}\n\n/**\n * The equivalent of DOM Node for the HTML Renderer. Not to be confused with\n * the DOM's Text node. It's just an object with value string so that\n * we can reference the value of the HTML by reference, not value.\n *\n * TextNode is never actually\n */\ninterface TextNode {\n\tvalue?: string;\n}\n\nfunction join(children: Array<TextNode | string>): string {\n\tlet result = \"\";\n\tfor (let i = 0; i < children.length; i++) {\n\t\tconst child = children[i];\n\t\tresult += typeof child === \"string\" ? child : child.value;\n\t}\n\n\treturn result;\n}\n\nexport const impl: Partial<RenderAdapter<TextNode, string, TextNode, string>> =\n\t{\n\t\tscope({\n\t\t\tscope,\n\t\t\ttag,\n\t\t}: {\n\t\t\tscope: string | undefined;\n\t\t\ttag: string | symbol;\n\t\t\tprops: Record<string, any>;\n\t\t\troot: TextNode | undefined;\n\t\t}): string | undefined {\n\t\t\tif (tag === Portal) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"svg\":\n\t\t\t\t\treturn \"svg\";\n\t\t\t\tcase \"math\":\n\t\t\t\t\treturn \"math\";\n\t\t\t\tcase \"foreignObject\":\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn scope;\n\t\t},\n\n\t\tcreate(): TextNode {\n\t\t\treturn {value: \"\"};\n\t\t},\n\n\t\ttext({value}: {value: string}): TextNode {\n\t\t\treturn {value: escape(value)};\n\t\t},\n\n\t\tread(value: ElementValue<TextNode>): string {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn join(value);\n\t\t\t} else if (typeof value === \"undefined\") {\n\t\t\t\treturn \"\";\n\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\treturn value;\n\t\t\t} else {\n\t\t\t\treturn value.value || \"\";\n\t\t\t}\n\t\t},\n\n\t\tarrange({\n\t\t\ttag,\n\t\t\ttagName,\n\t\t\tnode,\n\t\t\tprops,\n\t\t\tchildren,\n\t\t\tscope,\n\t\t}: {\n\t\t\ttag: string | symbol;\n\t\t\ttagName: string;\n\t\t\tnode: TextNode;\n\t\t\tprops: Record<string, any>;\n\t\t\tchildren: Array<TextNode | string>;\n\t\t\tscope: string | undefined;\n\t\t\troot: TextNode | undefined;\n\t\t}): void {\n\t\t\tif (tag === Portal) {\n\t\t\t\treturn;\n\t\t\t} else if (typeof tag !== \"string\") {\n\t\t\t\tthrow new Error(`Unknown tag: ${tagName}`);\n\t\t\t}\n\n\t\t\tconst attrs = printAttrs(\n\t\t\t\tprops,\n\t\t\t\tscope === \"svg\" || tag === \"foreignObject\",\n\t\t\t);\n\t\t\tconst open = `<${tag}${attrs.length ? \" \" : \"\"}${attrs}>`;\n\t\t\tlet result: string;\n\t\t\tif (voidTags.has(tag)) {\n\t\t\t\tresult = open;\n\t\t\t} else {\n\t\t\t\tconst close = `</${tag}>`;\n\t\t\t\tconst contents =\n\t\t\t\t\t\"innerHTML\" in props\n\t\t\t\t\t\t? props[\"innerHTML\"]\n\t\t\t\t\t\t: \"dangerouslySetInnerHTML\" in props\n\t\t\t\t\t\t\t? (props[\"dangerouslySetInnerHTML\"]?.__html ?? \"\")\n\t\t\t\t\t\t\t: join(children);\n\t\t\t\tresult = `${open}${contents}${close}`;\n\t\t\t}\n\n\t\t\tnode.value = result;\n\t\t},\n\t};\n\nexport class HTMLRenderer extends Renderer<TextNode, string, any, string> {\n\tconstructor() {\n\t\tsuper(impl);\n\t}\n}\n\nexport const renderer = new HTMLRenderer();\n\ndeclare global {\n\tmodule Crank {\n\t\tinterface EventMap extends GlobalEventHandlersEventMap {}\n\t}\n}\n"],"names":["camelToKebabCase","formatStyleValue","REACT_SVG_PROPS","Portal","Renderer"],"mappings":"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"}