From 5761b21046fe31be71ac730dbd9f934274b62c8c Mon Sep 17 00:00:00 2001 From: Vladimir Kutepov Date: Wed, 29 Jun 2022 18:38:24 +0300 Subject: [PATCH] 4.0.1 --- CHANGELOG.md | 7 ++++++- dist/hyperapp-render.js | 3 ++- dist/hyperapp-render.js.map | 2 +- dist/hyperapp-render.min.js | 4 ++-- dist/hyperapp-render.min.js.map | 2 +- package.json | 2 +- src/index.js | 2 +- 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2125ec..1b9de55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [4.0.1] - 2022-06-29 + +- Allow empty string text nodes ([#23](https://github.com/kriasoft/hyperapp-render/pull/23)). + ## [4.0.0] - 2021-01-25 - [BREAKING] Drop support for legacy Hyperapp v2.0.0-v2.0.8. @@ -72,7 +76,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Initial public release. -[unreleased]: https://github.com/kriasoft/hyperapp-render/compare/v4.0.0...HEAD +[unreleased]: https://github.com/kriasoft/hyperapp-render/compare/v4.0.1...HEAD +[4.0.1]: https://github.com/kriasoft/hyperapp-render/compare/v4.0.0...v4.0.1 [4.0.0]: https://github.com/kriasoft/hyperapp-render/compare/v3.5.0...v4.0.0 [3.5.0]: https://github.com/kriasoft/hyperapp-render/compare/v3.4.0...v3.5.0 [3.4.0]: https://github.com/kriasoft/hyperapp-render/compare/v3.3.0...v3.4.0 diff --git a/dist/hyperapp-render.js b/dist/hyperapp-render.js index f4fe217..919d395 100644 --- a/dist/hyperapp-render.js +++ b/dist/hyperapp-render.js @@ -1,4 +1,4 @@ -/*! Hyperapp Render v4.0.0 | MIT Licence | https://github.com/kriasoft/hyperapp-render */ +/*! Hyperapp Render v4.0.1 | MIT Licence | https://github.com/kriasoft/hyperapp-render */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : @@ -14,6 +14,7 @@ var escapeRegExp = /["&'<>]/; var voidElements = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']); function escapeHtml(value) { + if (value == null) return ''; var str = '' + value; if (typeof value === 'number') { diff --git a/dist/hyperapp-render.js.map b/dist/hyperapp-render.js.map index a069841..bb9f225 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 if (!styleNameCache.has(styleName)) {\n const name = styleName.replace(uppercasePattern, '-$&').toLowerCase().replace(msPattern, '-ms-')\n\n // returns 'undefined' instead of the 'Map' object in IE11\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' && 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 if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\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 if (node && node.type === 2) {\n return resolveNode(node.lazy.view(node.lazy), state, actions)\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.tag || node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.tag || 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","push","childIndex","innerHTML","resolveNode","node","state","actions","type","lazy","view","renderer","end","bytes","frame","pop","tag","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 if (value == null) return ''\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.replace(uppercasePattern, '-$&').toLowerCase().replace(msPattern, '-ms-')\n\n // returns 'undefined' instead of the 'Map' object in IE11\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' && 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 if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\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 if (node && node.type === 2) {\n return resolveNode(node.lazy.view(node.lazy), state, actions)\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.tag || node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.tag || 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","push","childIndex","innerHTML","resolveNode","node","state","actions","type","lazy","view","renderer","end","bytes","frame","pop","tag","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 36fbdbb..651ba05 100644 --- a/dist/hyperapp-render.min.js +++ b/dist/hyperapp-render.min.js @@ -1,3 +1,3 @@ -/*! Hyperapp Render v4.0.0 | 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="undefined"!=typeof globalThis?globalThis:e||self).hyperappRender={})}(this,(function(e){"use strict";var r=Array.isArray,n=Object.prototype.hasOwnProperty,t=new Map,a=/[A-Z]/g,o=/^ms-/,i=/["&'<>]/,l=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function f(e){var r=""+e;if("number"==typeof e)return r;var n=i.exec(r);if(!n)return r;for(var t=n.index,a=0,o="",l="";t":(o+=">",i="")}if(t.length>0)a.push({childIndex:0,children:t,footer:i});else{var d=r.innerHTML;null!=d&&(o+=d),o+=i}return o}function d(e,r,n){return"function"==typeof e?d(e(r,n),r,n):e&&2===e.type?d(e.lazy.view(e.lazy),r,n):e}e.renderToString=function(e,n,t){return function(e,n,t){var a=[{childIndex:0,children:[e],footer:""}],o=!1;return function(e){if(o)return null;for(var i="";i.length=l.children.length)i+=l.footer,a.pop();else{var c=d(l.children[l.childIndex++],n,t);null!=c&&"boolean"!=typeof c&&(r(c)?a.push({childIndex:0,children:c,footer:""}):3===c.type?i+=f(c.tag||c.name):i+="object"==typeof c?p(c.tag||c.nodeName,c.props||c.attributes,c.children,a):f(c))}}return i}}(e,n,t)(1/0)},Object.defineProperty(e,"__esModule",{value:!0})})); +/*! Hyperapp Render v4.0.1 | 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="undefined"!=typeof globalThis?globalThis:e||self).hyperappRender={})}(this,(function(e){"use strict";var r=Array.isArray,n=Object.prototype.hasOwnProperty,t=new Map,a=/[A-Z]/g,o=/^ms-/,i=/["&'<>]/,l=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function f(e){if(null==e)return"";var r=""+e;if("number"==typeof e)return r;var n=i.exec(r);if(!n)return r;for(var t=n.index,a=0,o="",l="";t":(o+=">",i="")}if(t.length>0)a.push({childIndex:0,children:t,footer:i});else{var d=r.innerHTML;null!=d&&(o+=d),o+=i}return o}function d(e,r,n){return"function"==typeof e?d(e(r,n),r,n):e&&2===e.type?d(e.lazy.view(e.lazy),r,n):e}e.renderToString=function(e,n,t){return function(e,n,t){var a=[{childIndex:0,children:[e],footer:""}],o=!1;return function(e){if(o)return null;for(var i="";i.length=l.children.length)i+=l.footer,a.pop();else{var c=d(l.children[l.childIndex++],n,t);null!=c&&"boolean"!=typeof c&&(r(c)?a.push({childIndex:0,children:c,footer:""}):3===c.type?i+=f(c.tag||c.name):i+="object"==typeof c?p(c.tag||c.nodeName,c.props||c.attributes,c.children,a):f(c))}}return i}}(e,n,t)(1/0)},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 e72299f..b77459d 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 if (!styleNameCache.has(styleName)) {\n const name = styleName.replace(uppercasePattern, '-$&').toLowerCase().replace(msPattern, '-ms-')\n\n // returns 'undefined' instead of the 'Map' object in IE11\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' && 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 if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\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 if (node && node.type === 2) {\n return resolveNode(node.lazy.view(node.lazy), state, actions)\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.tag || node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.tag || 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","push","childIndex","innerHTML","resolveNode","node","state","actions","type","lazy","view","end","bytes","frame","pop","tag","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 if (value == null) return ''\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.replace(uppercasePattern, '-$&').toLowerCase().replace(msPattern, '-ms-')\n\n // returns 'undefined' instead of the 'Map' object in IE11\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' && 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 if (children.length > 0) {\n stack.push({\n childIndex: 0,\n children,\n footer,\n })\n } else {\n const { innerHTML } = props\n\n if (innerHTML != null) {\n out += innerHTML\n }\n\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 if (node && node.type === 2) {\n return resolveNode(node.lazy.view(node.lazy), state, actions)\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.tag || node.name)\n } else if (typeof node === 'object') {\n out += renderFragment(\n node.tag || 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","push","childIndex","innerHTML","resolveNode","node","state","actions","type","lazy","view","end","bytes","frame","pop","tag","nodeName","attributes","renderer","Infinity"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index a66538d..0d7bfe2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "hyperapp-render", - "version": "4.0.0", + "version": "4.0.1", "description": "Render Hyperapp to an HTML string with SSR and Node.js streaming support", "repository": "kriasoft/hyperapp-render", "author": "Vladimir Kutepov", diff --git a/src/index.js b/src/index.js index f590b51..a166021 100644 --- a/src/index.js +++ b/src/index.js @@ -27,7 +27,7 @@ const voidElements = new Set([ // credits to https://github.com/component/escape-html export function escapeHtml(value) { - if (value == null) return ''; + if (value == null) return '' const str = '' + value if (typeof value === 'number') { // better performance for safe values