From e0512236411a100cf46f9ef3e4f824dc90481b27 Mon Sep 17 00:00:00 2001 From: Gorm Casper Date: Mon, 18 Mar 2019 11:52:11 +0100 Subject: [PATCH] Fix styles rendering in IE11 (#14) --- dist/hyperapp-render.js | 7 ++++++- dist/hyperapp-render.js.map | 2 +- dist/hyperapp-render.min.js | 2 +- dist/hyperapp-render.min.js.map | 2 +- src/index.js | 20 ++++++++------------ 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/dist/hyperapp-render.js b/dist/hyperapp-render.js index 0936151..0657bc3 100644 --- a/dist/hyperapp-render.js +++ b/dist/hyperapp-render.js @@ -96,7 +96,12 @@ } function hyphenateStyleName(styleName) { - return styleNameCache.get(styleName) || styleNameCache.set(styleName, styleName.replace(uppercasePattern, '-$&').toLowerCase().replace(msPattern, '-ms-')).get(styleName); + if (!styleNameCache.has(styleName)) { + var name = styleName.replace(uppercasePattern, '-$&').toLowerCase().replace(msPattern, '-ms-'); + styleNameCache.set(styleName, name); + } + + return styleNameCache.get(styleName); } function stringifyStyles(style) { diff --git a/dist/hyperapp-render.js.map b/dist/hyperapp-render.js.map index 1c57c38..94bd037 100644 --- a/dist/hyperapp-render.js.map +++ b/dist/hyperapp-render.js.map @@ -1 +1 @@ -{"version":3,"file":"hyperapp-render.js","sources":["src/index.js"],"sourcesContent":["const { isArray } = Array\nconst { hasOwnProperty } = Object.prototype\nconst styleNameCache = new Map()\nconst uppercasePattern = /[A-Z]/g\nconst msPattern = /^ms-/\n\n// https://www.w3.org/International/questions/qa-escapes#use\nconst escapeRegExp = /[\"&'<>]/\n\n// https://www.w3.org/TR/html/syntax.html#void-elements\nconst voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\n// credits to https://github.com/component/escape-html\nexport function escapeHtml(value) {\n const str = '' + value\n if (typeof value === 'number') {\n // better performance for safe values\n return str\n }\n\n const match = escapeRegExp.exec(str)\n if (!match) {\n return str\n }\n\n let { index } = match\n let lastIndex = 0\n let out = ''\n\n for (let escape = ''; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"'\n break\n case 38: // &\n escape = '&'\n break\n case 39: // '\n escape = ''' // shorter than \"'\" and \"'\" plus supports HTML4\n break\n case 60: // <\n escape = '<'\n break\n case 62: // >\n escape = '>'\n break\n default:\n continue\n }\n\n if (lastIndex !== index) {\n out += str.substring(lastIndex, index)\n }\n\n lastIndex = index + 1\n out += escape\n }\n\n return lastIndex !== index ? out + str.substring(lastIndex, index) : out\n}\n\n// credits to https://github.com/jorgebucaran/classcat\nexport function concatClassNames(value) {\n if (typeof value === 'string' || typeof value === 'number') {\n return value || ''\n }\n\n let out = ''\n let delimiter = ''\n\n if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const name = concatClassNames(value[i])\n if (name !== '') {\n out += delimiter + name\n delimiter = ' '\n }\n }\n } else {\n for (const name in value) {\n if (hasOwnProperty.call(value, name) && value[name]) {\n out += delimiter + name\n delimiter = ' '\n }\n }\n }\n\n return out\n}\n\n// \"backgroundColor\" => \"background-color\"\n// \"MozTransition\" => \"-moz-transition\"\n// \"msTransition\" => \"-ms-transition\"\nfunction hyphenateStyleName(styleName) {\n return (\n styleNameCache.get(styleName) ||\n styleNameCache\n .set(\n styleName,\n styleName\n .replace(uppercasePattern, '-$&')\n .toLowerCase()\n .replace(msPattern, '-ms-'),\n )\n .get(styleName)\n )\n}\n\nexport function stringifyStyles(style) {\n let out = ''\n let delimiter = ''\n\n for (const name in style) {\n if (hasOwnProperty.call(style, name)) {\n const value = style[name]\n\n if (value != null) {\n if (name === 'cssText') {\n out += delimiter + value\n } else {\n out += delimiter + hyphenateStyleName(name) + ':' + value\n }\n delimiter = ';'\n }\n }\n }\n\n return out\n}\n\n// https://www.w3.org/TR/html51/syntax.html#serializing-html-fragments\nfunction renderFragment(name, props, children, stack) {\n let out = ''\n let footer = ''\n\n if (name) {\n out += '<' + name\n\n for (let prop in props) {\n if (hasOwnProperty.call(props, prop)) {\n let value = props[prop]\n\n if (\n value != null &&\n prop !== 'key' &&\n prop !== 'innerHTML' &&\n prop !== '__source' && // babel-plugin-transform-react-jsx-source\n !(prop[0] === 'o' && prop[1] === 'n')\n ) {\n if (prop === 'class' || prop === 'className') {\n prop = 'class'\n value = concatClassNames(value) || false\n } else if (prop === 'style' && value && typeof value === 'object') {\n value = stringifyStyles(value) || false\n }\n\n if (value !== false) {\n out += ' ' + prop\n\n if (value !== true) {\n out += '=\"' + escapeHtml(value) + '\"'\n }\n }\n }\n }\n }\n\n if (voidElements.has(name)) {\n out += '/>'\n } else {\n out += '>'\n footer = ''\n }\n }\n\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\n if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n out += footer\n }\n\n return out\n}\n\nfunction resolveNode(node, state, actions) {\n if (typeof node === 'function') {\n return resolveNode(node(state, actions), state, actions)\n }\n\n return node\n}\n\nexport function renderer(view, state, actions) {\n const stack = [\n {\n childIndex: 0,\n children: [view],\n footer: '',\n },\n ]\n let end = false\n\n return (bytes) => {\n if (end) {\n return null\n }\n\n let out = ''\n\n while (out.length < bytes) {\n if (stack.length === 0) {\n end = true\n break\n }\n\n const frame = stack[stack.length - 1]\n\n if (frame.childIndex >= frame.children.length) {\n out += frame.footer\n stack.pop()\n } else {\n const node = resolveNode(frame.children[frame.childIndex++], state, actions)\n\n if (node != null && typeof node !== 'boolean') {\n if (isArray(node)) {\n stack.push({\n childIndex: 0,\n children: node,\n footer: '',\n })\n } else if (node.type === 3) {\n out += escapeHtml(node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.name || node.nodeName,\n node.props || node.attributes,\n node.children,\n stack,\n )\n } else {\n out += escapeHtml(node)\n }\n }\n }\n }\n\n return out\n }\n}\n\nexport function renderToString(view, state, actions) {\n return renderer(view, state, actions)(Infinity)\n}\n"],"names":["isArray","Array","hasOwnProperty","Object","prototype","styleNameCache","Map","uppercasePattern","msPattern","escapeRegExp","voidElements","Set","escapeHtml","value","str","match","exec","index","lastIndex","out","escape","length","charCodeAt","substring","concatClassNames","delimiter","i","name","call","hyphenateStyleName","styleName","get","set","replace","toLowerCase","stringifyStyles","style","renderFragment","props","children","stack","footer","prop","has","innerHTML","push","childIndex","resolveNode","node","state","actions","renderer","view","end","bytes","frame","pop","type","nodeName","attributes","renderToString","Infinity"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hyperapp-render.js","sources":["src/index.js"],"sourcesContent":["const { isArray } = Array\nconst { hasOwnProperty } = Object.prototype\nconst styleNameCache = new Map()\nconst uppercasePattern = /[A-Z]/g\nconst msPattern = /^ms-/\n\n// https://www.w3.org/International/questions/qa-escapes#use\nconst escapeRegExp = /[\"&'<>]/\n\n// https://www.w3.org/TR/html/syntax.html#void-elements\nconst voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\n// credits to https://github.com/component/escape-html\nexport function escapeHtml(value) {\n const str = '' + value\n if (typeof value === 'number') {\n // better performance for safe values\n return str\n }\n\n const match = escapeRegExp.exec(str)\n if (!match) {\n return str\n }\n\n let { index } = match\n let lastIndex = 0\n let out = ''\n\n for (let escape = ''; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"'\n break\n case 38: // &\n escape = '&'\n break\n case 39: // '\n escape = ''' // shorter than \"'\" and \"'\" plus supports HTML4\n break\n case 60: // <\n escape = '<'\n break\n case 62: // >\n escape = '>'\n break\n default:\n continue\n }\n\n if (lastIndex !== index) {\n out += str.substring(lastIndex, index)\n }\n\n lastIndex = index + 1\n out += escape\n }\n\n return lastIndex !== index ? out + str.substring(lastIndex, index) : out\n}\n\n// credits to https://github.com/jorgebucaran/classcat\nexport function concatClassNames(value) {\n if (typeof value === 'string' || typeof value === 'number') {\n return value || ''\n }\n\n let out = ''\n let delimiter = ''\n\n if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const name = concatClassNames(value[i])\n if (name !== '') {\n out += delimiter + name\n delimiter = ' '\n }\n }\n } else {\n for (const name in value) {\n if (hasOwnProperty.call(value, name) && value[name]) {\n out += delimiter + name\n delimiter = ' '\n }\n }\n }\n\n return out\n}\n\n// \"backgroundColor\" => \"background-color\"\n// \"MozTransition\" => \"-moz-transition\"\n// \"msTransition\" => \"-ms-transition\"\nfunction hyphenateStyleName(styleName) {\n if (!styleNameCache.has(styleName)) {\n const name = styleName\n .replace(uppercasePattern, '-$&')\n .toLowerCase()\n .replace(msPattern, '-ms-')\n styleNameCache.set(styleName, name)\n }\n return styleNameCache.get(styleName)\n}\n\nexport function stringifyStyles(style) {\n let out = ''\n let delimiter = ''\n\n for (const name in style) {\n if (hasOwnProperty.call(style, name)) {\n const value = style[name]\n\n if (value != null) {\n if (name === 'cssText') {\n out += delimiter + value\n } else {\n out += delimiter + hyphenateStyleName(name) + ':' + value\n }\n delimiter = ';'\n }\n }\n }\n\n return out\n}\n\n// https://www.w3.org/TR/html51/syntax.html#serializing-html-fragments\nfunction renderFragment(name, props, children, stack) {\n let out = ''\n let footer = ''\n\n if (name) {\n out += '<' + name\n\n for (let prop in props) {\n if (hasOwnProperty.call(props, prop)) {\n let value = props[prop]\n\n if (\n value != null &&\n prop !== 'key' &&\n prop !== 'innerHTML' &&\n prop !== '__source' && // babel-plugin-transform-react-jsx-source\n !(prop[0] === 'o' && prop[1] === 'n')\n ) {\n if (prop === 'class' || prop === 'className') {\n prop = 'class'\n value = concatClassNames(value) || false\n } else if (prop === 'style' && value && typeof value === 'object') {\n value = stringifyStyles(value) || false\n }\n\n if (value !== false) {\n out += ' ' + prop\n\n if (value !== true) {\n out += '=\"' + escapeHtml(value) + '\"'\n }\n }\n }\n }\n }\n\n if (voidElements.has(name)) {\n out += '/>'\n } else {\n out += '>'\n footer = ''\n }\n }\n\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\n if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n out += footer\n }\n\n return out\n}\n\nfunction resolveNode(node, state, actions) {\n if (typeof node === 'function') {\n return resolveNode(node(state, actions), state, actions)\n }\n\n return node\n}\n\nexport function renderer(view, state, actions) {\n const stack = [\n {\n childIndex: 0,\n children: [view],\n footer: '',\n },\n ]\n let end = false\n\n return (bytes) => {\n if (end) {\n return null\n }\n\n let out = ''\n\n while (out.length < bytes) {\n if (stack.length === 0) {\n end = true\n break\n }\n\n const frame = stack[stack.length - 1]\n\n if (frame.childIndex >= frame.children.length) {\n out += frame.footer\n stack.pop()\n } else {\n const node = resolveNode(frame.children[frame.childIndex++], state, actions)\n\n if (node != null && typeof node !== 'boolean') {\n if (isArray(node)) {\n stack.push({\n childIndex: 0,\n children: node,\n footer: '',\n })\n } else if (node.type === 3) {\n out += escapeHtml(node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.name || node.nodeName,\n node.props || node.attributes,\n node.children,\n stack,\n )\n } else {\n out += escapeHtml(node)\n }\n }\n }\n }\n\n return out\n }\n}\n\nexport function renderToString(view, state, actions) {\n return renderer(view, state, actions)(Infinity)\n}\n"],"names":["isArray","Array","hasOwnProperty","Object","prototype","styleNameCache","Map","uppercasePattern","msPattern","escapeRegExp","voidElements","Set","escapeHtml","value","str","match","exec","index","lastIndex","out","escape","length","charCodeAt","substring","concatClassNames","delimiter","i","name","call","hyphenateStyleName","styleName","has","replace","toLowerCase","set","get","stringifyStyles","style","renderFragment","props","children","stack","footer","prop","innerHTML","push","childIndex","resolveNode","node","state","actions","renderer","view","end","bytes","frame","pop","type","nodeName","attributes","renderToString","Infinity"],"mappings":"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"} \ No newline at end of file diff --git a/dist/hyperapp-render.min.js b/dist/hyperapp-render.min.js index 73ab8ef..bfe0c45 100644 --- a/dist/hyperapp-render.min.js +++ b/dist/hyperapp-render.min.js @@ -1,3 +1,3 @@ /*! Hyperapp Render | MIT Licence | https://github.com/kriasoft/hyperapp-render */ -!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.hyperappRender={})}(this,function(e){"use strict";var l=Array.isArray,f=Object.prototype.hasOwnProperty,i=new Map,c=/[A-Z]/g,u=/^ms-/,s=/["&'<>]/,p=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function d(e){var r=""+e;if("number"==typeof e)return r;var n=s.exec(r);if(!n)return r;for(var t=n.index,a=0,o="",i="";t":(a+=">",o="")}var l=r.innerHTML;return null!=l&&(a+=l),0=n.children.length)r+=n.footer,i.pop();else{var t=y(n.children[n.childIndex++],a,o);null!=t&&"boolean"!=typeof t&&(l(t)?i.push({childIndex:0,children:t,footer:""}):3===t.type?r+=d(t.name):r+="object"==typeof t?v(t.name||t.nodeName,t.props||t.attributes,t.children,i):d(t))}}return r}(1/0);var a,o,i,c},Object.defineProperty(e,"__esModule",{value:!0})}); +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.hyperappRender={})}(this,function(e){"use strict";var l=Array.isArray,f=Object.prototype.hasOwnProperty,n=new Map,t=/[A-Z]/g,a=/^ms-/,c=/["&'<>]/,u=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function s(e){var r=""+e;if("number"==typeof e)return r;var n=c.exec(r);if(!n)return r;for(var t=n.index,a=0,o="",i="";t":(a+=">",o="")}var l=r.innerHTML;return null!=l&&(a+=l),0=n.children.length)r+=n.footer,i.pop();else{var t=b(n.children[n.childIndex++],a,o);null!=t&&"boolean"!=typeof t&&(l(t)?i.push({childIndex:0,children:t,footer:""}):3===t.type?r+=s(t.name):r+="object"==typeof t?h(t.name||t.nodeName,t.props||t.attributes,t.children,i):s(t))}}return r}(1/0);var a,o,i,c},Object.defineProperty(e,"__esModule",{value:!0})}); //# sourceMappingURL=hyperapp-render.min.js.map diff --git a/dist/hyperapp-render.min.js.map b/dist/hyperapp-render.min.js.map index 91de8c2..c72146f 100644 --- a/dist/hyperapp-render.min.js.map +++ b/dist/hyperapp-render.min.js.map @@ -1 +1 @@ -{"version":3,"file":"hyperapp-render.min.js","sources":["src/index.js"],"sourcesContent":["const { isArray } = Array\nconst { hasOwnProperty } = Object.prototype\nconst styleNameCache = new Map()\nconst uppercasePattern = /[A-Z]/g\nconst msPattern = /^ms-/\n\n// https://www.w3.org/International/questions/qa-escapes#use\nconst escapeRegExp = /[\"&'<>]/\n\n// https://www.w3.org/TR/html/syntax.html#void-elements\nconst voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\n// credits to https://github.com/component/escape-html\nexport function escapeHtml(value) {\n const str = '' + value\n if (typeof value === 'number') {\n // better performance for safe values\n return str\n }\n\n const match = escapeRegExp.exec(str)\n if (!match) {\n return str\n }\n\n let { index } = match\n let lastIndex = 0\n let out = ''\n\n for (let escape = ''; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"'\n break\n case 38: // &\n escape = '&'\n break\n case 39: // '\n escape = ''' // shorter than \"'\" and \"'\" plus supports HTML4\n break\n case 60: // <\n escape = '<'\n break\n case 62: // >\n escape = '>'\n break\n default:\n continue\n }\n\n if (lastIndex !== index) {\n out += str.substring(lastIndex, index)\n }\n\n lastIndex = index + 1\n out += escape\n }\n\n return lastIndex !== index ? out + str.substring(lastIndex, index) : out\n}\n\n// credits to https://github.com/jorgebucaran/classcat\nexport function concatClassNames(value) {\n if (typeof value === 'string' || typeof value === 'number') {\n return value || ''\n }\n\n let out = ''\n let delimiter = ''\n\n if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const name = concatClassNames(value[i])\n if (name !== '') {\n out += delimiter + name\n delimiter = ' '\n }\n }\n } else {\n for (const name in value) {\n if (hasOwnProperty.call(value, name) && value[name]) {\n out += delimiter + name\n delimiter = ' '\n }\n }\n }\n\n return out\n}\n\n// \"backgroundColor\" => \"background-color\"\n// \"MozTransition\" => \"-moz-transition\"\n// \"msTransition\" => \"-ms-transition\"\nfunction hyphenateStyleName(styleName) {\n return (\n styleNameCache.get(styleName) ||\n styleNameCache\n .set(\n styleName,\n styleName\n .replace(uppercasePattern, '-$&')\n .toLowerCase()\n .replace(msPattern, '-ms-'),\n )\n .get(styleName)\n )\n}\n\nexport function stringifyStyles(style) {\n let out = ''\n let delimiter = ''\n\n for (const name in style) {\n if (hasOwnProperty.call(style, name)) {\n const value = style[name]\n\n if (value != null) {\n if (name === 'cssText') {\n out += delimiter + value\n } else {\n out += delimiter + hyphenateStyleName(name) + ':' + value\n }\n delimiter = ';'\n }\n }\n }\n\n return out\n}\n\n// https://www.w3.org/TR/html51/syntax.html#serializing-html-fragments\nfunction renderFragment(name, props, children, stack) {\n let out = ''\n let footer = ''\n\n if (name) {\n out += '<' + name\n\n for (let prop in props) {\n if (hasOwnProperty.call(props, prop)) {\n let value = props[prop]\n\n if (\n value != null &&\n prop !== 'key' &&\n prop !== 'innerHTML' &&\n prop !== '__source' && // babel-plugin-transform-react-jsx-source\n !(prop[0] === 'o' && prop[1] === 'n')\n ) {\n if (prop === 'class' || prop === 'className') {\n prop = 'class'\n value = concatClassNames(value) || false\n } else if (prop === 'style' && value && typeof value === 'object') {\n value = stringifyStyles(value) || false\n }\n\n if (value !== false) {\n out += ' ' + prop\n\n if (value !== true) {\n out += '=\"' + escapeHtml(value) + '\"'\n }\n }\n }\n }\n }\n\n if (voidElements.has(name)) {\n out += '/>'\n } else {\n out += '>'\n footer = ''\n }\n }\n\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\n if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n out += footer\n }\n\n return out\n}\n\nfunction resolveNode(node, state, actions) {\n if (typeof node === 'function') {\n return resolveNode(node(state, actions), state, actions)\n }\n\n return node\n}\n\nexport function renderer(view, state, actions) {\n const stack = [\n {\n childIndex: 0,\n children: [view],\n footer: '',\n },\n ]\n let end = false\n\n return (bytes) => {\n if (end) {\n return null\n }\n\n let out = ''\n\n while (out.length < bytes) {\n if (stack.length === 0) {\n end = true\n break\n }\n\n const frame = stack[stack.length - 1]\n\n if (frame.childIndex >= frame.children.length) {\n out += frame.footer\n stack.pop()\n } else {\n const node = resolveNode(frame.children[frame.childIndex++], state, actions)\n\n if (node != null && typeof node !== 'boolean') {\n if (isArray(node)) {\n stack.push({\n childIndex: 0,\n children: node,\n footer: '',\n })\n } else if (node.type === 3) {\n out += escapeHtml(node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.name || node.nodeName,\n node.props || node.attributes,\n node.children,\n stack,\n )\n } else {\n out += escapeHtml(node)\n }\n }\n }\n }\n\n return out\n }\n}\n\nexport function renderToString(view, state, actions) {\n return renderer(view, state, actions)(Infinity)\n}\n"],"names":["isArray","Array","hasOwnProperty","Object","prototype","styleNameCache","Map","uppercasePattern","msPattern","escapeRegExp","voidElements","Set","escapeHtml","value","str","match","exec","index","lastIndex","out","escape","length","charCodeAt","substring","concatClassNames","delimiter","i","name","call","stringifyStyles","style","styleName","get","set","replace","toLowerCase","renderFragment","props","children","stack","footer","prop","has","innerHTML","push","childIndex","resolveNode","node","state","actions","view","end","bytes","frame","pop","type","nodeName","attributes","renderer","Infinity"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hyperapp-render.min.js","sources":["src/index.js"],"sourcesContent":["const { isArray } = Array\nconst { hasOwnProperty } = Object.prototype\nconst styleNameCache = new Map()\nconst uppercasePattern = /[A-Z]/g\nconst msPattern = /^ms-/\n\n// https://www.w3.org/International/questions/qa-escapes#use\nconst escapeRegExp = /[\"&'<>]/\n\n// https://www.w3.org/TR/html/syntax.html#void-elements\nconst voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\n// credits to https://github.com/component/escape-html\nexport function escapeHtml(value) {\n const str = '' + value\n if (typeof value === 'number') {\n // better performance for safe values\n return str\n }\n\n const match = escapeRegExp.exec(str)\n if (!match) {\n return str\n }\n\n let { index } = match\n let lastIndex = 0\n let out = ''\n\n for (let escape = ''; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"'\n break\n case 38: // &\n escape = '&'\n break\n case 39: // '\n escape = ''' // shorter than \"'\" and \"'\" plus supports HTML4\n break\n case 60: // <\n escape = '<'\n break\n case 62: // >\n escape = '>'\n break\n default:\n continue\n }\n\n if (lastIndex !== index) {\n out += str.substring(lastIndex, index)\n }\n\n lastIndex = index + 1\n out += escape\n }\n\n return lastIndex !== index ? out + str.substring(lastIndex, index) : out\n}\n\n// credits to https://github.com/jorgebucaran/classcat\nexport function concatClassNames(value) {\n if (typeof value === 'string' || typeof value === 'number') {\n return value || ''\n }\n\n let out = ''\n let delimiter = ''\n\n if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const name = concatClassNames(value[i])\n if (name !== '') {\n out += delimiter + name\n delimiter = ' '\n }\n }\n } else {\n for (const name in value) {\n if (hasOwnProperty.call(value, name) && value[name]) {\n out += delimiter + name\n delimiter = ' '\n }\n }\n }\n\n return out\n}\n\n// \"backgroundColor\" => \"background-color\"\n// \"MozTransition\" => \"-moz-transition\"\n// \"msTransition\" => \"-ms-transition\"\nfunction hyphenateStyleName(styleName) {\n if (!styleNameCache.has(styleName)) {\n const name = styleName\n .replace(uppercasePattern, '-$&')\n .toLowerCase()\n .replace(msPattern, '-ms-')\n styleNameCache.set(styleName, name)\n }\n return styleNameCache.get(styleName)\n}\n\nexport function stringifyStyles(style) {\n let out = ''\n let delimiter = ''\n\n for (const name in style) {\n if (hasOwnProperty.call(style, name)) {\n const value = style[name]\n\n if (value != null) {\n if (name === 'cssText') {\n out += delimiter + value\n } else {\n out += delimiter + hyphenateStyleName(name) + ':' + value\n }\n delimiter = ';'\n }\n }\n }\n\n return out\n}\n\n// https://www.w3.org/TR/html51/syntax.html#serializing-html-fragments\nfunction renderFragment(name, props, children, stack) {\n let out = ''\n let footer = ''\n\n if (name) {\n out += '<' + name\n\n for (let prop in props) {\n if (hasOwnProperty.call(props, prop)) {\n let value = props[prop]\n\n if (\n value != null &&\n prop !== 'key' &&\n prop !== 'innerHTML' &&\n prop !== '__source' && // babel-plugin-transform-react-jsx-source\n !(prop[0] === 'o' && prop[1] === 'n')\n ) {\n if (prop === 'class' || prop === 'className') {\n prop = 'class'\n value = concatClassNames(value) || false\n } else if (prop === 'style' && value && typeof value === 'object') {\n value = stringifyStyles(value) || false\n }\n\n if (value !== false) {\n out += ' ' + prop\n\n if (value !== true) {\n out += '=\"' + escapeHtml(value) + '\"'\n }\n }\n }\n }\n }\n\n if (voidElements.has(name)) {\n out += '/>'\n } else {\n out += '>'\n footer = ''\n }\n }\n\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\n if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n out += footer\n }\n\n return out\n}\n\nfunction resolveNode(node, state, actions) {\n if (typeof node === 'function') {\n return resolveNode(node(state, actions), state, actions)\n }\n\n return node\n}\n\nexport function renderer(view, state, actions) {\n const stack = [\n {\n childIndex: 0,\n children: [view],\n footer: '',\n },\n ]\n let end = false\n\n return (bytes) => {\n if (end) {\n return null\n }\n\n let out = ''\n\n while (out.length < bytes) {\n if (stack.length === 0) {\n end = true\n break\n }\n\n const frame = stack[stack.length - 1]\n\n if (frame.childIndex >= frame.children.length) {\n out += frame.footer\n stack.pop()\n } else {\n const node = resolveNode(frame.children[frame.childIndex++], state, actions)\n\n if (node != null && typeof node !== 'boolean') {\n if (isArray(node)) {\n stack.push({\n childIndex: 0,\n children: node,\n footer: '',\n })\n } else if (node.type === 3) {\n out += escapeHtml(node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.name || node.nodeName,\n node.props || node.attributes,\n node.children,\n stack,\n )\n } else {\n out += escapeHtml(node)\n }\n }\n }\n }\n\n return out\n }\n}\n\nexport function renderToString(view, state, actions) {\n return renderer(view, state, actions)(Infinity)\n}\n"],"names":["isArray","Array","hasOwnProperty","Object","prototype","styleNameCache","Map","uppercasePattern","msPattern","escapeRegExp","voidElements","Set","escapeHtml","value","str","match","exec","index","lastIndex","out","escape","length","charCodeAt","substring","concatClassNames","delimiter","i","name","call","hyphenateStyleName","styleName","has","replace","toLowerCase","set","get","stringifyStyles","style","renderFragment","props","children","stack","footer","prop","innerHTML","push","childIndex","resolveNode","node","state","actions","view","end","bytes","frame","pop","type","nodeName","attributes","renderer","Infinity"],"mappings":"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"} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 64ea0bd..aa18e33 100644 --- a/src/index.js +++ b/src/index.js @@ -107,18 +107,14 @@ export function concatClassNames(value) { // "MozTransition" => "-moz-transition" // "msTransition" => "-ms-transition" function hyphenateStyleName(styleName) { - return ( - styleNameCache.get(styleName) || - styleNameCache - .set( - styleName, - styleName - .replace(uppercasePattern, '-$&') - .toLowerCase() - .replace(msPattern, '-ms-'), - ) - .get(styleName) - ) + if (!styleNameCache.has(styleName)) { + const name = styleName + .replace(uppercasePattern, '-$&') + .toLowerCase() + .replace(msPattern, '-ms-') + styleNameCache.set(styleName, name) + } + return styleNameCache.get(styleName) } export function stringifyStyles(style) {