@b9g/crank 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dom.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dom.cjs","sources":["../src/dom.ts"],"sourcesContent":["import {\n\tChildren,\n\tContext,\n\tElementValue,\n\tPortal,\n\tRenderer,\n\tRendererImpl,\n} from \"./crank\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\nexport const impl: Partial<RendererImpl<Node, string>> = {\n\tparse(text: string): DocumentFragment {\n\t\tif (typeof document.createRange === \"function\") {\n\t\t\treturn document.createRange().createContextualFragment(text);\n\t\t} else {\n\t\t\tconst fragment = document.createDocumentFragment();\n\t\t\tconst childNodes = new DOMParser().parseFromString(text, \"text/html\").body\n\t\t\t\t.childNodes;\n\t\t\tfor (let i = 0; i < childNodes.length; i++) {\n\t\t\t\tfragment.appendChild(childNodes[i]);\n\t\t\t}\n\n\t\t\treturn fragment;\n\t\t}\n\t},\n\n\tscope(scope: string, tag: string | symbol): string | undefined {\n\t\t// TODO: Should we handle xmlns???\n\t\tswitch (tag) {\n\t\t\tcase Portal:\n\t\t\tcase \"foreignObject\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"svg\":\n\t\t\t\treturn SVG_NAMESPACE;\n\t\t\tdefault:\n\t\t\t\treturn scope;\n\t\t}\n\t},\n\n\tcreate(tag: string | symbol, _props: unknown, ns: string | undefined): Node {\n\t\tif (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t} else if (tag.toLowerCase() === \"svg\") {\n\t\t\tns = SVG_NAMESPACE;\n\t\t}\n\n\t\treturn ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n\t},\n\n\tpatch(\n\t\t_tag: string | symbol,\n\t\t// TODO: Why does this assignment work?\n\t\tnode: HTMLElement | SVGElement,\n\t\tname: string,\n\t\t// TODO: Stricter typings?\n\t\tvalue: unknown,\n\t\toldValue: unknown,\n\t\tscope: string | undefined,\n\t): void {\n\t\tconst isSVG = scope === SVG_NAMESPACE;\n\t\tswitch (name) {\n\t\t\tcase \"style\": {\n\t\t\t\tconst style: CSSStyleDeclaration = node.style;\n\t\t\t\tif (style == null) {\n\t\t\t\t\tnode.setAttribute(\"style\", value as string);\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(\"style\");\n\t\t\t\t} else if (value === true) {\n\t\t\t\t\tnode.setAttribute(\"style\", \"\");\n\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\tif (style.cssText !== value) {\n\t\t\t\t\t\tstyle.cssText = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof oldValue === \"string\") {\n\t\t\t\t\t\tstyle.cssText = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const styleName in {...(oldValue as {}), ...(value as {})}) {\n\t\t\t\t\t\tconst styleValue = value && (value as any)[styleName];\n\t\t\t\t\t\tif (styleValue == null) {\n\t\t\t\t\t\t\tstyle.removeProperty(styleName);\n\t\t\t\t\t\t} else if (style.getPropertyValue(styleName) !== styleValue) {\n\t\t\t\t\t\t\tstyle.setProperty(styleName, styleValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"class\":\n\t\t\tcase \"className\":\n\t\t\t\tif (value === true) {\n\t\t\t\t\tnode.setAttribute(\"class\", \"\");\n\t\t\t\t} else if (value == null) {\n\t\t\t\t\tnode.removeAttribute(\"class\");\n\t\t\t\t} else if (!isSVG) {\n\t\t\t\t\tif (node.className !== value) {\n\t\t\t\t\t\t(node as any)[\"className\"] = value;\n\t\t\t\t\t}\n\t\t\t\t} else if (node.getAttribute(\"class\") !== value) {\n\t\t\t\t\tnode.setAttribute(\"class\", value as string);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"innerHTML\":\n\t\t\t\tif (value !== oldValue) {\n\t\t\t\t\tnode.innerHTML = value as any;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tif (\n\t\t\t\t\tname in node &&\n\t\t\t\t\t// boolean properties will coerce strings, but sometimes they map to\n\t\t\t\t\t// enumerated attributes, where truthy strings (\"false\", \"no\") map to\n\t\t\t\t\t// falsy properties, so we use attributes in this case.\n\t\t\t\t\t!(\n\t\t\t\t\t\ttypeof value === \"string\" &&\n\t\t\t\t\t\ttypeof (node as any)[name] === \"boolean\"\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ((node as any)[name] !== value) {\n\t\t\t\t\t\t\t(node as any)[name] = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// some properties are readonly so we fallback to setting them as\n\t\t\t\t\t\t// attributes\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value === true) {\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (node.getAttribute(name) !== value) {\n\t\t\t\t\tnode.setAttribute(name, value as any);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Element | string>,\n\t\t_oldProps: Record<string, any> | undefined,\n\t\toldChildren: Array<Element | string> | undefined,\n\t): void {\n\t\tif (tag === Portal && (node == null || typeof node.nodeType !== \"number\")) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Portal root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\tnode && node.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t!(\"innerHTML\" in props) &&\n\t\t\t// We don’t want to update elements without explicit children (<div/>),\n\t\t\t// because these elements sometimes have child nodes added via raw\n\t\t\t// DOM manipulations.\n\t\t\t// However, if an element has previously rendered children, we clear the\n\t\t\t// them because it would be surprising not to clear Crank managed\n\t\t\t// children, even if the new element does not have explicit children.\n\t\t\t(\"children\" in props || (oldChildren && oldChildren.length))\n\t\t) {\n\t\t\tif (children.length === 0) {\n\t\t\t\tnode.textContent = \"\";\n\t\t\t} else {\n\t\t\t\tlet oldChild = node.firstChild;\n\t\t\t\tlet i = 0;\n\t\t\t\twhile (oldChild !== null && i < children.length) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tif (oldChild === newChild) {\n\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (typeof newChild === \"string\") {\n\t\t\t\t\t\tif (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\tif ((oldChild as Text).data !== newChild) {\n\t\t\t\t\t\t\t\t(oldChild as Text).data = newChild;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.insertBefore(document.createTextNode(newChild), oldChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.insertBefore(newChild, oldChild);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\t// TODO: This is an optimization but we need to think a little more about other cases like prepending.\n\t\t\t\t\t\tif (oldChild !== children[i]) {\n\t\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// remove excess DOM nodes\n\t\t\t\twhile (oldChild !== null) {\n\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t}\n\n\t\t\t\t// append excess children\n\t\t\t\tfor (; i < children.length; i++) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tnode.appendChild(\n\t\t\t\t\t\ttypeof newChild === \"string\"\n\t\t\t\t\t\t\t? document.createTextNode(newChild)\n\t\t\t\t\t\t\t: newChild,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport class DOMRenderer extends Renderer<Node, string> {\n\tconstructor() {\n\t\tsuper(impl);\n\t}\n\n\trender(\n\t\tchildren: Children,\n\t\troot: Node,\n\t\tctx?: Context,\n\t): Promise<ElementValue<Node>> | ElementValue<Node> {\n\t\tif (root == null || typeof root.nodeType !== \"number\") {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Render root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\troot && root.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn super.render(children, root, ctx);\n\t}\n}\n\nexport const renderer = new DOMRenderer();\n\ndeclare global {\n\tmodule Crank {\n\t\tinterface EventMap extends GlobalEventHandlersEventMap {}\n\t}\n}\n"],"names":["Portal","Renderer"],"mappings":"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"}
1
+ {"version":3,"file":"dom.cjs","sources":["../src/dom.ts"],"sourcesContent":["import {\n\tChildren,\n\tContext,\n\tElementValue,\n\tPortal,\n\tRenderer,\n\tRendererImpl,\n} from \"./crank.js\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\nexport const impl: Partial<RendererImpl<Node, string>> = {\n\tparse(text: string): ElementValue<Node> {\n\t\tif (typeof document.createRange === \"function\") {\n\t\t\tconst fragment = document.createRange().createContextualFragment(text);\n\t\t\treturn Array.from(fragment.childNodes);\n\t\t} else {\n\t\t\tconst childNodes = new DOMParser().parseFromString(text, \"text/html\").body\n\t\t\t\t.childNodes;\n\t\t\treturn Array.from(childNodes);\n\t\t}\n\t},\n\n\tscope(scope: string, tag: string | symbol): string | undefined {\n\t\t// TODO: Should we handle xmlns???\n\t\tswitch (tag) {\n\t\t\tcase Portal:\n\t\t\tcase \"foreignObject\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"svg\":\n\t\t\t\treturn SVG_NAMESPACE;\n\t\t\tdefault:\n\t\t\t\treturn scope;\n\t\t}\n\t},\n\n\tcreate(tag: string | symbol, _props: unknown, ns: string | undefined): Node {\n\t\tif (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t} else if (tag.toLowerCase() === \"svg\") {\n\t\t\tns = SVG_NAMESPACE;\n\t\t}\n\n\t\treturn ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n\t},\n\n\tpatch(\n\t\t_tag: string | symbol,\n\t\t// TODO: Why does this assignment work?\n\t\tnode: HTMLElement | SVGElement,\n\t\tname: string,\n\t\t// TODO: Stricter typings?\n\t\tvalue: unknown,\n\t\toldValue: unknown,\n\t\tscope: string | undefined,\n\t): void {\n\t\tconst isSVG = scope === SVG_NAMESPACE;\n\t\tswitch (name) {\n\t\t\tcase \"style\": {\n\t\t\t\tconst style: CSSStyleDeclaration = node.style;\n\t\t\t\tif (style == null) {\n\t\t\t\t\tnode.setAttribute(\"style\", value as string);\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(\"style\");\n\t\t\t\t} else if (value === true) {\n\t\t\t\t\tnode.setAttribute(\"style\", \"\");\n\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\tif (style.cssText !== value) {\n\t\t\t\t\t\tstyle.cssText = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof oldValue === \"string\") {\n\t\t\t\t\t\tstyle.cssText = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const styleName in {...(oldValue as {}), ...(value as {})}) {\n\t\t\t\t\t\tconst styleValue = value && (value as any)[styleName];\n\t\t\t\t\t\tif (styleValue == null) {\n\t\t\t\t\t\t\tstyle.removeProperty(styleName);\n\t\t\t\t\t\t} else if (style.getPropertyValue(styleName) !== styleValue) {\n\t\t\t\t\t\t\tstyle.setProperty(styleName, styleValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"class\":\n\t\t\tcase \"className\":\n\t\t\t\tif (value === true) {\n\t\t\t\t\tnode.setAttribute(\"class\", \"\");\n\t\t\t\t} else if (value == null) {\n\t\t\t\t\tnode.removeAttribute(\"class\");\n\t\t\t\t} else if (!isSVG) {\n\t\t\t\t\tif (node.className !== value) {\n\t\t\t\t\t\t(node as any)[\"className\"] = value;\n\t\t\t\t\t}\n\t\t\t\t} else if (node.getAttribute(\"class\") !== value) {\n\t\t\t\t\tnode.setAttribute(\"class\", value as string);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"innerHTML\":\n\t\t\t\tif (value !== oldValue) {\n\t\t\t\t\tnode.innerHTML = value as any;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tif (\n\t\t\t\t\tname in node &&\n\t\t\t\t\t// boolean properties will coerce strings, but sometimes they map to\n\t\t\t\t\t// enumerated attributes, where truthy strings (\"false\", \"no\") map to\n\t\t\t\t\t// falsy properties, so we use attributes in this case.\n\t\t\t\t\t!(\n\t\t\t\t\t\ttypeof value === \"string\" &&\n\t\t\t\t\t\ttypeof (node as any)[name] === \"boolean\"\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ((node as any)[name] !== value) {\n\t\t\t\t\t\t\t(node as any)[name] = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// some properties are readonly so we fallback to setting them as\n\t\t\t\t\t\t// attributes\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value === true) {\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (node.getAttribute(name) !== value) {\n\t\t\t\t\tnode.setAttribute(name, value as any);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Element | string>,\n\t\t_oldProps: Record<string, any> | undefined,\n\t\toldChildren: Array<Element | string> | undefined,\n\t): void {\n\t\tif (tag === Portal && (node == null || typeof node.nodeType !== \"number\")) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Portal root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\tnode && node.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t!(\"innerHTML\" in props) &&\n\t\t\t// We don’t want to update elements without explicit children (<div/>),\n\t\t\t// because these elements sometimes have child nodes added via raw\n\t\t\t// DOM manipulations.\n\t\t\t// However, if an element has previously rendered children, we clear the\n\t\t\t// them because it would be surprising not to clear Crank managed\n\t\t\t// children, even if the new element does not have explicit children.\n\t\t\t(\"children\" in props || (oldChildren && oldChildren.length))\n\t\t) {\n\t\t\tif (children.length === 0) {\n\t\t\t\tnode.textContent = \"\";\n\t\t\t} else {\n\t\t\t\tlet oldChild = node.firstChild;\n\t\t\t\tlet i = 0;\n\t\t\t\twhile (oldChild !== null && i < children.length) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tif (oldChild === newChild) {\n\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (typeof newChild === \"string\") {\n\t\t\t\t\t\tif (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\tif ((oldChild as Text).data !== newChild) {\n\t\t\t\t\t\t\t\t(oldChild as Text).data = newChild;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.insertBefore(document.createTextNode(newChild), oldChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.insertBefore(newChild, oldChild);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\t// TODO: This is an optimization but we need to think a little more about other cases like prepending.\n\t\t\t\t\t\tif (oldChild !== children[i]) {\n\t\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// remove excess DOM nodes\n\t\t\t\twhile (oldChild !== null) {\n\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t}\n\n\t\t\t\t// append excess children\n\t\t\t\tfor (; i < children.length; i++) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tnode.appendChild(\n\t\t\t\t\t\ttypeof newChild === \"string\"\n\t\t\t\t\t\t\t? document.createTextNode(newChild)\n\t\t\t\t\t\t\t: newChild,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport class DOMRenderer extends Renderer<Node, string> {\n\tconstructor() {\n\t\tsuper(impl);\n\t}\n\n\trender(\n\t\tchildren: Children,\n\t\troot: Node,\n\t\tctx?: Context,\n\t): Promise<ElementValue<Node>> | ElementValue<Node> {\n\t\tif (root == null || typeof root.nodeType !== \"number\") {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Render root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\troot && root.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn super.render(children, root, ctx);\n\t}\n}\n\nexport const renderer = new DOMRenderer();\n\ndeclare global {\n\tmodule Crank {\n\t\tinterface EventMap extends GlobalEventHandlersEventMap {}\n\t}\n}\n"],"names":["Portal","Renderer"],"mappings":"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"}
package/dom.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Children, Context, ElementValue, Renderer, RendererImpl } from "./crank";
1
+ import { Children, Context, ElementValue, Renderer, RendererImpl } from "./crank.js";
2
2
  export declare const impl: Partial<RendererImpl<Node, string>>;
3
3
  export declare class DOMRenderer extends Renderer<Node, string> {
4
4
  constructor();
package/dom.js CHANGED
@@ -5,16 +5,13 @@ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
5
5
  const impl = {
6
6
  parse(text) {
7
7
  if (typeof document.createRange === "function") {
8
- return document.createRange().createContextualFragment(text);
8
+ const fragment = document.createRange().createContextualFragment(text);
9
+ return Array.from(fragment.childNodes);
9
10
  }
10
11
  else {
11
- const fragment = document.createDocumentFragment();
12
12
  const childNodes = new DOMParser().parseFromString(text, "text/html").body
13
13
  .childNodes;
14
- for (let i = 0; i < childNodes.length; i++) {
15
- fragment.appendChild(childNodes[i]);
16
- }
17
- return fragment;
14
+ return Array.from(childNodes);
18
15
  }
19
16
  },
20
17
  scope(scope, tag) {
package/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sources":["../src/dom.ts"],"sourcesContent":["import {\n\tChildren,\n\tContext,\n\tElementValue,\n\tPortal,\n\tRenderer,\n\tRendererImpl,\n} from \"./crank\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\nexport const impl: Partial<RendererImpl<Node, string>> = {\n\tparse(text: string): DocumentFragment {\n\t\tif (typeof document.createRange === \"function\") {\n\t\t\treturn document.createRange().createContextualFragment(text);\n\t\t} else {\n\t\t\tconst fragment = document.createDocumentFragment();\n\t\t\tconst childNodes = new DOMParser().parseFromString(text, \"text/html\").body\n\t\t\t\t.childNodes;\n\t\t\tfor (let i = 0; i < childNodes.length; i++) {\n\t\t\t\tfragment.appendChild(childNodes[i]);\n\t\t\t}\n\n\t\t\treturn fragment;\n\t\t}\n\t},\n\n\tscope(scope: string, tag: string | symbol): string | undefined {\n\t\t// TODO: Should we handle xmlns???\n\t\tswitch (tag) {\n\t\t\tcase Portal:\n\t\t\tcase \"foreignObject\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"svg\":\n\t\t\t\treturn SVG_NAMESPACE;\n\t\t\tdefault:\n\t\t\t\treturn scope;\n\t\t}\n\t},\n\n\tcreate(tag: string | symbol, _props: unknown, ns: string | undefined): Node {\n\t\tif (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t} else if (tag.toLowerCase() === \"svg\") {\n\t\t\tns = SVG_NAMESPACE;\n\t\t}\n\n\t\treturn ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n\t},\n\n\tpatch(\n\t\t_tag: string | symbol,\n\t\t// TODO: Why does this assignment work?\n\t\tnode: HTMLElement | SVGElement,\n\t\tname: string,\n\t\t// TODO: Stricter typings?\n\t\tvalue: unknown,\n\t\toldValue: unknown,\n\t\tscope: string | undefined,\n\t): void {\n\t\tconst isSVG = scope === SVG_NAMESPACE;\n\t\tswitch (name) {\n\t\t\tcase \"style\": {\n\t\t\t\tconst style: CSSStyleDeclaration = node.style;\n\t\t\t\tif (style == null) {\n\t\t\t\t\tnode.setAttribute(\"style\", value as string);\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(\"style\");\n\t\t\t\t} else if (value === true) {\n\t\t\t\t\tnode.setAttribute(\"style\", \"\");\n\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\tif (style.cssText !== value) {\n\t\t\t\t\t\tstyle.cssText = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof oldValue === \"string\") {\n\t\t\t\t\t\tstyle.cssText = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const styleName in {...(oldValue as {}), ...(value as {})}) {\n\t\t\t\t\t\tconst styleValue = value && (value as any)[styleName];\n\t\t\t\t\t\tif (styleValue == null) {\n\t\t\t\t\t\t\tstyle.removeProperty(styleName);\n\t\t\t\t\t\t} else if (style.getPropertyValue(styleName) !== styleValue) {\n\t\t\t\t\t\t\tstyle.setProperty(styleName, styleValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"class\":\n\t\t\tcase \"className\":\n\t\t\t\tif (value === true) {\n\t\t\t\t\tnode.setAttribute(\"class\", \"\");\n\t\t\t\t} else if (value == null) {\n\t\t\t\t\tnode.removeAttribute(\"class\");\n\t\t\t\t} else if (!isSVG) {\n\t\t\t\t\tif (node.className !== value) {\n\t\t\t\t\t\t(node as any)[\"className\"] = value;\n\t\t\t\t\t}\n\t\t\t\t} else if (node.getAttribute(\"class\") !== value) {\n\t\t\t\t\tnode.setAttribute(\"class\", value as string);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"innerHTML\":\n\t\t\t\tif (value !== oldValue) {\n\t\t\t\t\tnode.innerHTML = value as any;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tif (\n\t\t\t\t\tname in node &&\n\t\t\t\t\t// boolean properties will coerce strings, but sometimes they map to\n\t\t\t\t\t// enumerated attributes, where truthy strings (\"false\", \"no\") map to\n\t\t\t\t\t// falsy properties, so we use attributes in this case.\n\t\t\t\t\t!(\n\t\t\t\t\t\ttypeof value === \"string\" &&\n\t\t\t\t\t\ttypeof (node as any)[name] === \"boolean\"\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ((node as any)[name] !== value) {\n\t\t\t\t\t\t\t(node as any)[name] = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// some properties are readonly so we fallback to setting them as\n\t\t\t\t\t\t// attributes\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value === true) {\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (node.getAttribute(name) !== value) {\n\t\t\t\t\tnode.setAttribute(name, value as any);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Element | string>,\n\t\t_oldProps: Record<string, any> | undefined,\n\t\toldChildren: Array<Element | string> | undefined,\n\t): void {\n\t\tif (tag === Portal && (node == null || typeof node.nodeType !== \"number\")) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Portal root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\tnode && node.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t!(\"innerHTML\" in props) &&\n\t\t\t// We don’t want to update elements without explicit children (<div/>),\n\t\t\t// because these elements sometimes have child nodes added via raw\n\t\t\t// DOM manipulations.\n\t\t\t// However, if an element has previously rendered children, we clear the\n\t\t\t// them because it would be surprising not to clear Crank managed\n\t\t\t// children, even if the new element does not have explicit children.\n\t\t\t(\"children\" in props || (oldChildren && oldChildren.length))\n\t\t) {\n\t\t\tif (children.length === 0) {\n\t\t\t\tnode.textContent = \"\";\n\t\t\t} else {\n\t\t\t\tlet oldChild = node.firstChild;\n\t\t\t\tlet i = 0;\n\t\t\t\twhile (oldChild !== null && i < children.length) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tif (oldChild === newChild) {\n\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (typeof newChild === \"string\") {\n\t\t\t\t\t\tif (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\tif ((oldChild as Text).data !== newChild) {\n\t\t\t\t\t\t\t\t(oldChild as Text).data = newChild;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.insertBefore(document.createTextNode(newChild), oldChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.insertBefore(newChild, oldChild);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\t// TODO: This is an optimization but we need to think a little more about other cases like prepending.\n\t\t\t\t\t\tif (oldChild !== children[i]) {\n\t\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// remove excess DOM nodes\n\t\t\t\twhile (oldChild !== null) {\n\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t}\n\n\t\t\t\t// append excess children\n\t\t\t\tfor (; i < children.length; i++) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tnode.appendChild(\n\t\t\t\t\t\ttypeof newChild === \"string\"\n\t\t\t\t\t\t\t? document.createTextNode(newChild)\n\t\t\t\t\t\t\t: newChild,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport class DOMRenderer extends Renderer<Node, string> {\n\tconstructor() {\n\t\tsuper(impl);\n\t}\n\n\trender(\n\t\tchildren: Children,\n\t\troot: Node,\n\t\tctx?: Context,\n\t): Promise<ElementValue<Node>> | ElementValue<Node> {\n\t\tif (root == null || typeof root.nodeType !== \"number\") {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Render root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\troot && root.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn super.render(children, root, ctx);\n\t}\n}\n\nexport const renderer = new DOMRenderer();\n\ndeclare global {\n\tmodule Crank {\n\t\tinterface EventMap extends GlobalEventHandlersEventMap {}\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","sources":["../src/dom.ts"],"sourcesContent":["import {\n\tChildren,\n\tContext,\n\tElementValue,\n\tPortal,\n\tRenderer,\n\tRendererImpl,\n} from \"./crank.js\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\nexport const impl: Partial<RendererImpl<Node, string>> = {\n\tparse(text: string): ElementValue<Node> {\n\t\tif (typeof document.createRange === \"function\") {\n\t\t\tconst fragment = document.createRange().createContextualFragment(text);\n\t\t\treturn Array.from(fragment.childNodes);\n\t\t} else {\n\t\t\tconst childNodes = new DOMParser().parseFromString(text, \"text/html\").body\n\t\t\t\t.childNodes;\n\t\t\treturn Array.from(childNodes);\n\t\t}\n\t},\n\n\tscope(scope: string, tag: string | symbol): string | undefined {\n\t\t// TODO: Should we handle xmlns???\n\t\tswitch (tag) {\n\t\t\tcase Portal:\n\t\t\tcase \"foreignObject\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"svg\":\n\t\t\t\treturn SVG_NAMESPACE;\n\t\t\tdefault:\n\t\t\t\treturn scope;\n\t\t}\n\t},\n\n\tcreate(tag: string | symbol, _props: unknown, ns: string | undefined): Node {\n\t\tif (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t} else if (tag.toLowerCase() === \"svg\") {\n\t\t\tns = SVG_NAMESPACE;\n\t\t}\n\n\t\treturn ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n\t},\n\n\tpatch(\n\t\t_tag: string | symbol,\n\t\t// TODO: Why does this assignment work?\n\t\tnode: HTMLElement | SVGElement,\n\t\tname: string,\n\t\t// TODO: Stricter typings?\n\t\tvalue: unknown,\n\t\toldValue: unknown,\n\t\tscope: string | undefined,\n\t): void {\n\t\tconst isSVG = scope === SVG_NAMESPACE;\n\t\tswitch (name) {\n\t\t\tcase \"style\": {\n\t\t\t\tconst style: CSSStyleDeclaration = node.style;\n\t\t\t\tif (style == null) {\n\t\t\t\t\tnode.setAttribute(\"style\", value as string);\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(\"style\");\n\t\t\t\t} else if (value === true) {\n\t\t\t\t\tnode.setAttribute(\"style\", \"\");\n\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\tif (style.cssText !== value) {\n\t\t\t\t\t\tstyle.cssText = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof oldValue === \"string\") {\n\t\t\t\t\t\tstyle.cssText = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const styleName in {...(oldValue as {}), ...(value as {})}) {\n\t\t\t\t\t\tconst styleValue = value && (value as any)[styleName];\n\t\t\t\t\t\tif (styleValue == null) {\n\t\t\t\t\t\t\tstyle.removeProperty(styleName);\n\t\t\t\t\t\t} else if (style.getPropertyValue(styleName) !== styleValue) {\n\t\t\t\t\t\t\tstyle.setProperty(styleName, styleValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"class\":\n\t\t\tcase \"className\":\n\t\t\t\tif (value === true) {\n\t\t\t\t\tnode.setAttribute(\"class\", \"\");\n\t\t\t\t} else if (value == null) {\n\t\t\t\t\tnode.removeAttribute(\"class\");\n\t\t\t\t} else if (!isSVG) {\n\t\t\t\t\tif (node.className !== value) {\n\t\t\t\t\t\t(node as any)[\"className\"] = value;\n\t\t\t\t\t}\n\t\t\t\t} else if (node.getAttribute(\"class\") !== value) {\n\t\t\t\t\tnode.setAttribute(\"class\", value as string);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"innerHTML\":\n\t\t\t\tif (value !== oldValue) {\n\t\t\t\t\tnode.innerHTML = value as any;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tif (\n\t\t\t\t\tname in node &&\n\t\t\t\t\t// boolean properties will coerce strings, but sometimes they map to\n\t\t\t\t\t// enumerated attributes, where truthy strings (\"false\", \"no\") map to\n\t\t\t\t\t// falsy properties, so we use attributes in this case.\n\t\t\t\t\t!(\n\t\t\t\t\t\ttypeof value === \"string\" &&\n\t\t\t\t\t\ttypeof (node as any)[name] === \"boolean\"\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ((node as any)[name] !== value) {\n\t\t\t\t\t\t\t(node as any)[name] = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// some properties are readonly so we fallback to setting them as\n\t\t\t\t\t\t// attributes\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value === true) {\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t} else if (value == null || value === false) {\n\t\t\t\t\tnode.removeAttribute(name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (node.getAttribute(name) !== value) {\n\t\t\t\t\tnode.setAttribute(name, value as any);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Element | string>,\n\t\t_oldProps: Record<string, any> | undefined,\n\t\toldChildren: Array<Element | string> | undefined,\n\t): void {\n\t\tif (tag === Portal && (node == null || typeof node.nodeType !== \"number\")) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Portal root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\tnode && node.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t!(\"innerHTML\" in props) &&\n\t\t\t// We don’t want to update elements without explicit children (<div/>),\n\t\t\t// because these elements sometimes have child nodes added via raw\n\t\t\t// DOM manipulations.\n\t\t\t// However, if an element has previously rendered children, we clear the\n\t\t\t// them because it would be surprising not to clear Crank managed\n\t\t\t// children, even if the new element does not have explicit children.\n\t\t\t(\"children\" in props || (oldChildren && oldChildren.length))\n\t\t) {\n\t\t\tif (children.length === 0) {\n\t\t\t\tnode.textContent = \"\";\n\t\t\t} else {\n\t\t\t\tlet oldChild = node.firstChild;\n\t\t\t\tlet i = 0;\n\t\t\t\twhile (oldChild !== null && i < children.length) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tif (oldChild === newChild) {\n\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (typeof newChild === \"string\") {\n\t\t\t\t\t\tif (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\tif ((oldChild as Text).data !== newChild) {\n\t\t\t\t\t\t\t\t(oldChild as Text).data = newChild;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toldChild = oldChild.nextSibling;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.insertBefore(document.createTextNode(newChild), oldChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (oldChild.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.insertBefore(newChild, oldChild);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\t// TODO: This is an optimization but we need to think a little more about other cases like prepending.\n\t\t\t\t\t\tif (oldChild !== children[i]) {\n\t\t\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// remove excess DOM nodes\n\t\t\t\twhile (oldChild !== null) {\n\t\t\t\t\tconst nextSibling = oldChild.nextSibling;\n\t\t\t\t\tnode.removeChild(oldChild);\n\t\t\t\t\toldChild = nextSibling;\n\t\t\t\t}\n\n\t\t\t\t// append excess children\n\t\t\t\tfor (; i < children.length; i++) {\n\t\t\t\t\tconst newChild = children[i];\n\t\t\t\t\tnode.appendChild(\n\t\t\t\t\t\ttypeof newChild === \"string\"\n\t\t\t\t\t\t\t? document.createTextNode(newChild)\n\t\t\t\t\t\t\t: newChild,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport class DOMRenderer extends Renderer<Node, string> {\n\tconstructor() {\n\t\tsuper(impl);\n\t}\n\n\trender(\n\t\tchildren: Children,\n\t\troot: Node,\n\t\tctx?: Context,\n\t): Promise<ElementValue<Node>> | ElementValue<Node> {\n\t\tif (root == null || typeof root.nodeType !== \"number\") {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Render root is not a node. Received: ${JSON.stringify(\n\t\t\t\t\troot && root.toString(),\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn super.render(children, root, ctx);\n\t}\n}\n\nexport const renderer = new DOMRenderer();\n\ndeclare global {\n\tmodule Crank {\n\t\tinterface EventMap extends GlobalEventHandlersEventMap {}\n\t}\n}\n"],"names":[],"mappings":"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"}
package/html.cjs CHANGED
@@ -64,6 +64,11 @@ function printAttrs(props) {
64
64
  attrs.push(`style="${escape(printStyleObject(value))}"`);
65
65
  }
66
66
  break;
67
+ case name === "className":
68
+ if (!("class" in props)) {
69
+ attrs.push(`class="${escape(value)}"`);
70
+ }
71
+ break;
67
72
  case typeof value === "string":
68
73
  attrs.push(`${escape(name)}="${escape(value)}"`);
69
74
  break;
package/html.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import {ElementValue, Portal, Renderer, RendererImpl} from \"./crank\";\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\tcssStrings.push(`${name}:${value};`);\n\t\t}\n\t}\n\n\treturn cssStrings.join(\"\");\n}\n\nfunction printAttrs(props: Record<string, any>): string {\n\tconst attrs: string[] = [];\n\tfor (const [name, value] of Object.entries(props)) {\n\t\tswitch (true) {\n\t\t\tcase name === \"children\":\n\t\t\tcase name === \"innerHTML\":\n\t\t\t\tbreak;\n\t\t\tcase name === \"style\":\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\tattrs.push(`style=\"${escape(value)}\"`);\n\t\t\t\t} else {\n\t\t\t\t\tattrs.push(`style=\"${escape(printStyleObject(value))}\"`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"string\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${escape(value)}\"`);\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"number\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${value}\"`);\n\t\t\t\tbreak;\n\t\t\tcase value === true:\n\t\t\t\tattrs.push(`${escape(name)}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn attrs.join(\" \");\n}\n\ninterface Node {\n\tvalue: string;\n}\n\nfunction join(children: Array<Node | 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<RendererImpl<Node, undefined, any, string>> = {\n\tcreate(): Node {\n\t\treturn {value: \"\"};\n\t},\n\n\tescape(text: string): string {\n\t\treturn escape(text);\n\t},\n\n\tread(value: ElementValue<Node>): string {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn join(value);\n\t\t} else if (typeof value === \"undefined\") {\n\t\t\treturn \"\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn value.value;\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Node | string>,\n\t): void {\n\t\tif (tag === Portal) {\n\t\t\treturn;\n\t\t} else if (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t}\n\n\t\tconst attrs = printAttrs(props);\n\t\tconst open = `<${tag}${attrs.length ? \" \" : \"\"}${attrs}>`;\n\t\tlet result: string;\n\t\tif (voidTags.has(tag)) {\n\t\t\tresult = open;\n\t\t} else {\n\t\t\tconst close = `</${tag}>`;\n\t\t\tconst contents =\n\t\t\t\t\"innerHTML\" in props ? props[\"innerHTML\"] : join(children);\n\t\t\tresult = `${open}${contents}${close}`;\n\t\t}\n\n\t\tnode.value = result;\n\t},\n};\n\nexport class HTMLRenderer extends Renderer<Node, undefined, 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":["Portal","Renderer"],"mappings":"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"}
1
+ {"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import {ElementValue, Portal, Renderer, RendererImpl} from \"./crank.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\tcssStrings.push(`${name}:${value};`);\n\t\t}\n\t}\n\n\treturn cssStrings.join(\"\");\n}\n\nfunction printAttrs(props: Record<string, any>): string {\n\tconst attrs: string[] = [];\n\tfor (const [name, value] of Object.entries(props)) {\n\t\tswitch (true) {\n\t\t\tcase name === \"children\":\n\t\t\tcase name === \"innerHTML\":\n\t\t\t\tbreak;\n\t\t\tcase name === \"style\":\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\tattrs.push(`style=\"${escape(value)}\"`);\n\t\t\t\t} else {\n\t\t\t\t\tattrs.push(`style=\"${escape(printStyleObject(value))}\"`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase name === \"className\":\n\t\t\t\tif (!(\"class\" in props)) {\n\t\t\t\t\tattrs.push(`class=\"${escape(value)}\"`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"string\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${escape(value)}\"`);\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"number\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${value}\"`);\n\t\t\t\tbreak;\n\t\t\tcase value === true:\n\t\t\t\tattrs.push(`${escape(name)}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn attrs.join(\" \");\n}\n\ninterface Node {\n\tvalue: string;\n}\n\nfunction join(children: Array<Node | 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<RendererImpl<Node, undefined, any, string>> = {\n\tcreate(): Node {\n\t\treturn {value: \"\"};\n\t},\n\n\tescape(text: string): string {\n\t\treturn escape(text);\n\t},\n\n\tread(value: ElementValue<Node>): string {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn join(value);\n\t\t} else if (typeof value === \"undefined\") {\n\t\t\treturn \"\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn value.value;\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Node | string>,\n\t): void {\n\t\tif (tag === Portal) {\n\t\t\treturn;\n\t\t} else if (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t}\n\n\t\tconst attrs = printAttrs(props);\n\t\tconst open = `<${tag}${attrs.length ? \" \" : \"\"}${attrs}>`;\n\t\tlet result: string;\n\t\tif (voidTags.has(tag)) {\n\t\t\tresult = open;\n\t\t} else {\n\t\t\tconst close = `</${tag}>`;\n\t\t\tconst contents =\n\t\t\t\t\"innerHTML\" in props ? props[\"innerHTML\"] : join(children);\n\t\t\tresult = `${open}${contents}${close}`;\n\t\t}\n\n\t\tnode.value = result;\n\t},\n};\n\nexport class HTMLRenderer extends Renderer<Node, undefined, 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":["Portal","Renderer"],"mappings":"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"}
package/html.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Renderer, RendererImpl } from "./crank";
1
+ import { Renderer, RendererImpl } from "./crank.js";
2
2
  interface Node {
3
3
  value: string;
4
4
  }
package/html.js CHANGED
@@ -61,6 +61,11 @@ function printAttrs(props) {
61
61
  attrs.push(`style="${escape(printStyleObject(value))}"`);
62
62
  }
63
63
  break;
64
+ case name === "className":
65
+ if (!("class" in props)) {
66
+ attrs.push(`class="${escape(value)}"`);
67
+ }
68
+ break;
64
69
  case typeof value === "string":
65
70
  attrs.push(`${escape(name)}="${escape(value)}"`);
66
71
  break;
package/html.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import {ElementValue, Portal, Renderer, RendererImpl} from \"./crank\";\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\tcssStrings.push(`${name}:${value};`);\n\t\t}\n\t}\n\n\treturn cssStrings.join(\"\");\n}\n\nfunction printAttrs(props: Record<string, any>): string {\n\tconst attrs: string[] = [];\n\tfor (const [name, value] of Object.entries(props)) {\n\t\tswitch (true) {\n\t\t\tcase name === \"children\":\n\t\t\tcase name === \"innerHTML\":\n\t\t\t\tbreak;\n\t\t\tcase name === \"style\":\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\tattrs.push(`style=\"${escape(value)}\"`);\n\t\t\t\t} else {\n\t\t\t\t\tattrs.push(`style=\"${escape(printStyleObject(value))}\"`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"string\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${escape(value)}\"`);\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"number\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${value}\"`);\n\t\t\t\tbreak;\n\t\t\tcase value === true:\n\t\t\t\tattrs.push(`${escape(name)}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn attrs.join(\" \");\n}\n\ninterface Node {\n\tvalue: string;\n}\n\nfunction join(children: Array<Node | 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<RendererImpl<Node, undefined, any, string>> = {\n\tcreate(): Node {\n\t\treturn {value: \"\"};\n\t},\n\n\tescape(text: string): string {\n\t\treturn escape(text);\n\t},\n\n\tread(value: ElementValue<Node>): string {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn join(value);\n\t\t} else if (typeof value === \"undefined\") {\n\t\t\treturn \"\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn value.value;\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Node | string>,\n\t): void {\n\t\tif (tag === Portal) {\n\t\t\treturn;\n\t\t} else if (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t}\n\n\t\tconst attrs = printAttrs(props);\n\t\tconst open = `<${tag}${attrs.length ? \" \" : \"\"}${attrs}>`;\n\t\tlet result: string;\n\t\tif (voidTags.has(tag)) {\n\t\t\tresult = open;\n\t\t} else {\n\t\t\tconst close = `</${tag}>`;\n\t\t\tconst contents =\n\t\t\t\t\"innerHTML\" in props ? props[\"innerHTML\"] : join(children);\n\t\t\tresult = `${open}${contents}${close}`;\n\t\t}\n\n\t\tnode.value = result;\n\t},\n};\n\nexport class HTMLRenderer extends Renderer<Node, undefined, 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":[],"mappings":"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"}
1
+ {"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import {ElementValue, Portal, Renderer, RendererImpl} from \"./crank.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\tcssStrings.push(`${name}:${value};`);\n\t\t}\n\t}\n\n\treturn cssStrings.join(\"\");\n}\n\nfunction printAttrs(props: Record<string, any>): string {\n\tconst attrs: string[] = [];\n\tfor (const [name, value] of Object.entries(props)) {\n\t\tswitch (true) {\n\t\t\tcase name === \"children\":\n\t\t\tcase name === \"innerHTML\":\n\t\t\t\tbreak;\n\t\t\tcase name === \"style\":\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\tattrs.push(`style=\"${escape(value)}\"`);\n\t\t\t\t} else {\n\t\t\t\t\tattrs.push(`style=\"${escape(printStyleObject(value))}\"`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase name === \"className\":\n\t\t\t\tif (!(\"class\" in props)) {\n\t\t\t\t\tattrs.push(`class=\"${escape(value)}\"`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"string\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${escape(value)}\"`);\n\t\t\t\tbreak;\n\t\t\tcase typeof value === \"number\":\n\t\t\t\tattrs.push(`${escape(name)}=\"${value}\"`);\n\t\t\t\tbreak;\n\t\t\tcase value === true:\n\t\t\t\tattrs.push(`${escape(name)}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn attrs.join(\" \");\n}\n\ninterface Node {\n\tvalue: string;\n}\n\nfunction join(children: Array<Node | 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<RendererImpl<Node, undefined, any, string>> = {\n\tcreate(): Node {\n\t\treturn {value: \"\"};\n\t},\n\n\tescape(text: string): string {\n\t\treturn escape(text);\n\t},\n\n\tread(value: ElementValue<Node>): string {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn join(value);\n\t\t} else if (typeof value === \"undefined\") {\n\t\t\treturn \"\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn value.value;\n\t\t}\n\t},\n\n\tarrange(\n\t\ttag: string | symbol,\n\t\tnode: Node,\n\t\tprops: Record<string, any>,\n\t\tchildren: Array<Node | string>,\n\t): void {\n\t\tif (tag === Portal) {\n\t\t\treturn;\n\t\t} else if (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tag.toString()}`);\n\t\t}\n\n\t\tconst attrs = printAttrs(props);\n\t\tconst open = `<${tag}${attrs.length ? \" \" : \"\"}${attrs}>`;\n\t\tlet result: string;\n\t\tif (voidTags.has(tag)) {\n\t\t\tresult = open;\n\t\t} else {\n\t\t\tconst close = `</${tag}>`;\n\t\t\tconst contents =\n\t\t\t\t\"innerHTML\" in props ? props[\"innerHTML\"] : join(children);\n\t\t\tresult = `${open}${contents}${close}`;\n\t\t}\n\n\t\tnode.value = result;\n\t},\n};\n\nexport class HTMLRenderer extends Renderer<Node, undefined, 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":[],"mappings":"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"}
package/index.cjs CHANGED
@@ -15,5 +15,6 @@ exports.Raw = crank.Raw;
15
15
  exports.Renderer = crank.Renderer;
16
16
  exports.cloneElement = crank.cloneElement;
17
17
  exports.createElement = crank.createElement;
18
+ exports["default"] = crank["default"];
18
19
  exports.isElement = crank.isElement;
19
20
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
package/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- export * from "./crank";
1
+ export * from "./crank.js";
2
+ export { default } from "./crank.js";
package/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /// <reference types="index.d.ts" />
2
- export { Context, Copy, Element, Fragment, Portal, Raw, Renderer, cloneElement, createElement, isElement } from './crank.js';
2
+ export { Context, Copy, Element, Fragment, Portal, Raw, Renderer, cloneElement, createElement, default, isElement } from './crank.js';
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@b9g/crank",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Write JSX-driven components with functions, promises and generators.",
5
5
  "homepage": "https://crank.js.org",
6
6
  "bugs": {
@@ -13,10 +13,9 @@
13
13
  "license": "MIT",
14
14
  "type": "module",
15
15
  "exports": {
16
- "./": "./",
17
16
  ".": {
18
- "import": "./index.js",
19
- "require": "./index.cjs"
17
+ "import": "./crank.js",
18
+ "require": "./crank.cjs"
20
19
  },
21
20
  "./crank": {
22
21
  "import": "./crank.js",
@@ -58,15 +57,14 @@
58
57
  "require": "./umd.js"
59
58
  }
60
59
  },
61
- "main": "index.cjs",
62
- "module": "index.js",
63
- "types": "index.d.ts",
60
+ "main": "crank.cjs",
61
+ "module": "crank.js",
62
+ "types": "crank.d.ts",
64
63
  "devDependencies": {
65
64
  "@arkweid/lefthook": "^0.7.7",
66
65
  "@types/jest": "^26.0.23",
67
66
  "@typescript-eslint/eslint-plugin": "^4.31.2",
68
67
  "@typescript-eslint/parser": "^4.31.2",
69
- "core-js": "^3.18.0",
70
68
  "eslint": "^7.32.0",
71
69
  "eslint-config-prettier": "^8.3.0",
72
70
  "eslint-plugin-jest": "^24.4.2",
@@ -79,7 +77,7 @@
79
77
  "rollup-plugin-typescript2": "^0.30.0",
80
78
  "shx": "^0.3.3",
81
79
  "ts-jest": "^26.5.6",
82
- "ts-transform-import-path-rewrite": "^0.3.0",
80
+ "ts-jest-resolver": "^2.0.0",
83
81
  "typescript": "^4.4.3"
84
82
  },
85
83
  "publishConfig": {
package/umd.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from "./crank";
2
- export * as dom from "./dom";
3
- export * as html from "./html";
1
+ export * from "./crank.js";
2
+ export * as dom from "./dom.js";
3
+ export * as html from "./html.js";
package/umd.js CHANGED
@@ -128,7 +128,6 @@
128
128
  let static_ = false;
129
129
  const props1 = {};
130
130
  if (props != null) {
131
- // TODO: deprecate crank-whatever props
132
131
  for (const name in props) {
133
132
  switch (name) {
134
133
  case "crank-key":
@@ -1642,16 +1641,13 @@
1642
1641
  const impl$1 = {
1643
1642
  parse(text) {
1644
1643
  if (typeof document.createRange === "function") {
1645
- return document.createRange().createContextualFragment(text);
1644
+ const fragment = document.createRange().createContextualFragment(text);
1645
+ return Array.from(fragment.childNodes);
1646
1646
  }
1647
1647
  else {
1648
- const fragment = document.createDocumentFragment();
1649
1648
  const childNodes = new DOMParser().parseFromString(text, "text/html").body
1650
1649
  .childNodes;
1651
- for (let i = 0; i < childNodes.length; i++) {
1652
- fragment.appendChild(childNodes[i]);
1653
- }
1654
- return fragment;
1650
+ return Array.from(childNodes);
1655
1651
  }
1656
1652
  },
1657
1653
  scope(scope, tag) {
@@ -1916,6 +1912,11 @@
1916
1912
  attrs.push(`style="${escape(printStyleObject(value))}"`);
1917
1913
  }
1918
1914
  break;
1915
+ case name === "className":
1916
+ if (!("class" in props)) {
1917
+ attrs.push(`class="${escape(value)}"`);
1918
+ }
1919
+ break;
1919
1920
  case typeof value === "string":
1920
1921
  attrs.push(`${escape(name)}="${escape(value)}"`);
1921
1922
  break;