From b476795a80b50c12b2a198ff347c6fbd0b83850e Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sun, 19 Mar 2023 12:53:06 +0100 Subject: [PATCH 1/8] improve way of fetching latest rts --- benchmarks/index.js | 2 +- benchmarks/lib/render-to-string.js | 454 ----------------------------- package-lock.json | 23 ++ package.json | 1 + 4 files changed, 25 insertions(+), 455 deletions(-) delete mode 100644 benchmarks/lib/render-to-string.js diff --git a/benchmarks/index.js b/benchmarks/index.js index 80665411..5820775d 100644 --- a/benchmarks/index.js +++ b/benchmarks/index.js @@ -1,6 +1,6 @@ import { h } from 'preact'; import Suite from 'benchmarkjs-pretty'; -import renderToStringBaseline from './lib/render-to-string'; +import renderToStringBaseline from 'baseline-rts'; // import renderToString from '../src/index'; import renderToString from '../dist/index.module.js'; import TextApp from './text'; diff --git a/benchmarks/lib/render-to-string.js b/benchmarks/lib/render-to-string.js deleted file mode 100644 index de44f9ca..00000000 --- a/benchmarks/lib/render-to-string.js +++ /dev/null @@ -1,454 +0,0 @@ -/* eslint-disable */ -// preact-render-to-string@5.2.6 (6a0bec2) -import { Fragment as e, options as t, h as r } from 'preact'; -var n = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|^--/i, - o = /^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/, - i = /[\s\n\\/='"\0<>]/, - l = /^xlink:?./, - a = /["&<]/; -function s(e) { - if (!1 === a.test((e += ''))) return e; - for (var t = 0, r = 0, n = '', o = ''; r < e.length; r++) { - switch (e.charCodeAt(r)) { - case 34: - o = '"'; - break; - case 38: - o = '&'; - break; - case 60: - o = '<'; - break; - default: - continue; - } - r !== t && (n += e.slice(t, r)), (n += o), (t = r + 1); - } - return r !== t && (n += e.slice(t, r)), n; -} -var f = function (e, t) { - return String(e).replace(/(\n+)/g, '$1' + (t || '\t')); - }, - u = function (e, t, r) { - return ( - String(e).length > (t || 40) || - (!r && -1 !== String(e).indexOf('\n')) || - -1 !== String(e).indexOf('<') - ); - }, - c = {}, - _ = /([A-Z])/g; -function p(e) { - var t = ''; - for (var r in e) { - var o = e[r]; - null != o && - '' !== o && - (t && (t += ' '), - (t += - '-' == r[0] ? r : c[r] || (c[r] = r.replace(_, '-$1').toLowerCase())), - (t = - 'number' == typeof o && !1 === n.test(r) - ? t + ': ' + o + 'px;' - : t + ': ' + o + ';')); - } - return t || void 0; -} -function d(e, t) { - return ( - Array.isArray(t) ? t.reduce(d, e) : null != t && !1 !== t && e.push(t), e - ); -} -function v() { - this.__d = !0; -} -function h(e, t) { - return { - __v: e, - context: t, - props: e.props, - setState: v, - forceUpdate: v, - __d: !0, - __h: [] - }; -} -function g(e, t) { - var r = e.contextType, - n = r && t[r.__c]; - return null != r ? (n ? n.props.value : r.__) : t; -} -var y = []; -function m(r, n, a, c, _, v) { - if (null == r || 'boolean' == typeof r) return ''; - if ('object' != typeof r) return 'function' == typeof r ? '' : s(r); - var b = a.pretty, - x = b && 'string' == typeof b ? b : '\t'; - if (Array.isArray(r)) { - for (var k = '', S = 0; S < r.length; S++) - b && S > 0 && (k += '\n'), (k += m(r[S], n, a, c, _, v)); - return k; - } - if (void 0 !== r.constructor) return ''; - var w, - C = r.type, - O = r.props, - j = !1; - if ('function' == typeof C) { - if (((j = !0), !a.shallow || (!c && !1 !== a.renderRootComponent))) { - if (C === e) { - var A = []; - return ( - d(A, r.props.children), m(A, n, a, !1 !== a.shallowHighOrder, _, v) - ); - } - var F, - H = (r.__c = h(r, n)); - t.__b && t.__b(r); - var M = t.__r; - if (C.prototype && 'function' == typeof C.prototype.render) { - var L = g(C, n); - ((H = r.__c = new C(O, L)).__v = r), - (H._dirty = H.__d = !0), - (H.props = O), - null == H.state && (H.state = {}), - null == H._nextState && - null == H.__s && - (H._nextState = H.__s = H.state), - (H.context = L), - C.getDerivedStateFromProps - ? (H.state = Object.assign( - {}, - H.state, - C.getDerivedStateFromProps(H.props, H.state) - )) - : H.componentWillMount && - (H.componentWillMount(), - (H.state = - H._nextState !== H.state - ? H._nextState - : H.__s !== H.state - ? H.__s - : H.state)), - M && M(r), - (F = H.render(H.props, H.state, H.context)); - } else - for (var T = g(C, n), E = 0; H.__d && E++ < 25; ) - (H.__d = !1), M && M(r), (F = C.call(r.__c, O, T)); - return ( - H.getChildContext && (n = Object.assign({}, n, H.getChildContext())), - t.diffed && t.diffed(r), - m(F, n, a, !1 !== a.shallowHighOrder, _, v) - ); - } - C = - (w = C).displayName || - (w !== Function && w.name) || - (function (e) { - var t = (Function.prototype.toString - .call(e) - .match(/^\s*function\s+([^( ]+)/) || '')[1]; - if (!t) { - for (var r = -1, n = y.length; n--; ) - if (y[n] === e) { - r = n; - break; - } - r < 0 && (r = y.push(e) - 1), (t = 'UnnamedComponent' + r); - } - return t; - })(w); - } - var $, - D, - N = '<' + C; - if (O) { - var P = Object.keys(O); - a && !0 === a.sortAttributes && P.sort(); - for (var W = 0; W < P.length; W++) { - var I = P[W], - R = O[I]; - if ('children' !== I) { - if ( - !i.test(I) && - ((a && a.allAttributes) || - ('key' !== I && 'ref' !== I && '__self' !== I && '__source' !== I)) - ) { - if ('defaultValue' === I) I = 'value'; - else if ('defaultChecked' === I) I = 'checked'; - else if ('defaultSelected' === I) I = 'selected'; - else if ('className' === I) { - if (void 0 !== O.class) continue; - I = 'class'; - } else - _ && - l.test(I) && - (I = I.toLowerCase().replace(/^xlink:?/, 'xlink:')); - if ('htmlFor' === I) { - if (O.for) continue; - I = 'for'; - } - 'style' === I && R && 'object' == typeof R && (R = p(R)), - 'a' === I[0] && - 'r' === I[1] && - 'boolean' == typeof R && - (R = String(R)); - var U = a.attributeHook && a.attributeHook(I, R, n, a, j); - if (U || '' === U) N += U; - else if ('dangerouslySetInnerHTML' === I) D = R && R.__html; - else if ('textarea' === C && 'value' === I) $ = R; - else if ((R || 0 === R || '' === R) && 'function' != typeof R) { - if (!((!0 !== R && '' !== R) || ((R = I), a && a.xml))) { - N = N + ' ' + I; - continue; - } - if ('value' === I) { - if ('select' === C) { - v = R; - continue; - } - 'option' === C && - v == R && - void 0 === O.selected && - (N += ' selected'); - } - N = N + ' ' + I + '="' + s(R) + '"'; - } - } - } else $ = R; - } - } - if (b) { - var V = N.replace(/\n\s*/, ' '); - V === N || ~V.indexOf('\n') - ? b && ~N.indexOf('\n') && (N += '\n') - : (N = V); - } - if (((N += '>'), i.test(C))) - throw new Error(C + ' is not a valid HTML tag name in ' + N); - var q, - z = o.test(C) || (a.voidElements && a.voidElements.test(C)), - Z = []; - if (D) b && u(D) && (D = '\n' + x + f(D, x)), (N += D); - else if (null != $ && d((q = []), $).length) { - for (var B = b && ~N.indexOf('\n'), G = !1, J = 0; J < q.length; J++) { - var K = q[J]; - if (null != K && !1 !== K) { - var Q = m(K, n, a, !0, 'svg' === C || ('foreignObject' !== C && _), v); - if ((b && !B && u(Q) && (B = !0), Q)) - if (b) { - var X = Q.length > 0 && '<' != Q[0]; - G && X ? (Z[Z.length - 1] += Q) : Z.push(Q), (G = X); - } else Z.push(Q); - } - } - if (b && B) for (var Y = Z.length; Y--; ) Z[Y] = '\n' + x + f(Z[Y], x); - } - if (Z.length || D) N += Z.join(''); - else if (a && a.xml) return N.substring(0, N.length - 1) + ' />'; - return ( - !z || q || D - ? (b && ~N.indexOf('\n') && (N += '\n'), (N = N + '')) - : (N = N.replace(/>$/, ' />')), - N - ); -} -var b = { shallow: !0 }; -S.render = S; -var x = function (e, t) { - return S(e, t, b); - }, - k = []; -function S(n, o, i) { - o = o || {}; - var l = t.__s; - t.__s = !0; - var a, - s = r(e, null); - return ( - (s.__k = [n]), - (a = - i && - (i.pretty || - i.voidElements || - i.sortAttributes || - i.shallow || - i.allAttributes || - i.xml || - i.attributeHook) - ? m(n, o, i) - : F(n, o, !1, void 0, s)), - t.__c && t.__c(n, k), - (t.__s = l), - (k.length = 0), - a - ); -} -function w(e) { - return null == e || 'boolean' == typeof e - ? null - : 'string' == typeof e || 'number' == typeof e || 'bigint' == typeof e - ? r(null, null, e) - : e; -} -function C(e, t) { - return 'className' === e - ? 'class' - : 'htmlFor' === e - ? 'for' - : 'defaultValue' === e - ? 'value' - : 'defaultChecked' === e - ? 'checked' - : 'defaultSelected' === e - ? 'selected' - : t && l.test(e) - ? e.toLowerCase().replace(/^xlink:?/, 'xlink:') - : e; -} -function O(e, t) { - return 'style' === e && null != t && 'object' == typeof t - ? p(t) - : 'a' === e[0] && 'r' === e[1] && 'boolean' == typeof t - ? String(t) - : t; -} -var j = Array.isArray, - A = Object.assign; -function F(r, n, l, a, f) { - if (null == r || !0 === r || !1 === r || '' === r) return ''; - if ('object' != typeof r) return 'function' == typeof r ? '' : s(r); - if (j(r)) { - var u = ''; - f.__k = r; - for (var c = 0; c < r.length; c++) - (u += F(r[c], n, l, a, f)), (r[c] = w(r[c])); - return u; - } - if (void 0 !== r.constructor) return ''; - (r.__ = f), t.__b && t.__b(r); - var _ = r.type, - p = r.props; - if ('function' == typeof _) { - var d; - if (_ === e) d = p.children; - else { - d = - _.prototype && 'function' == typeof _.prototype.render - ? (function (e, r) { - var n = e.type, - o = g(n, r), - i = new n(e.props, o); - (e.__c = i), - (i.__v = e), - (i.__d = !0), - (i.props = e.props), - null == i.state && (i.state = {}), - null == i.__s && (i.__s = i.state), - (i.context = o), - n.getDerivedStateFromProps - ? (i.state = A( - {}, - i.state, - n.getDerivedStateFromProps(i.props, i.state) - )) - : i.componentWillMount && - (i.componentWillMount(), - (i.state = i.__s !== i.state ? i.__s : i.state)); - var l = t.__r; - return l && l(e), i.render(i.props, i.state, i.context); - })(r, n) - : (function (e, r) { - var n, - o = h(e, r), - i = g(e.type, r); - e.__c = o; - for (var l = t.__r, a = 0; o.__d && a++ < 25; ) - (o.__d = !1), l && l(e), (n = e.type.call(o, e.props, i)); - return n; - })(r, n); - var v = r.__c; - v.getChildContext && (n = A({}, n, v.getChildContext())); - } - var y = F( - (d = null != d && d.type === e && null == d.key ? d.props.children : d), - n, - l, - a, - r - ); - return ( - t.diffed && t.diffed(r), (r.__ = void 0), t.unmount && t.unmount(r), y - ); - } - var m, - b, - x = '<'; - if (((x += _), p)) - for (var k in ((m = p.children), p)) { - var S = p[k]; - if ( - !( - 'key' === k || - 'ref' === k || - '__self' === k || - '__source' === k || - 'children' === k || - ('className' === k && 'class' in p) || - ('htmlFor' === k && 'for' in p) || - i.test(k) - ) - ) - if (((S = O((k = C(k, l)), S)), 'dangerouslySetInnerHTML' === k)) - b = S && S.__html; - else if ('textarea' === _ && 'value' === k) m = S; - else if ((S || 0 === S || '' === S) && 'function' != typeof S) { - if (!0 === S || '' === S) { - (S = k), (x = x + ' ' + k); - continue; - } - if ('value' === k) { - if ('select' === _) { - a = S; - continue; - } - 'option' !== _ || a != S || 'selected' in p || (x += ' selected'); - } - x = x + ' ' + k + '="' + s(S) + '"'; - } - } - var H = x; - if (((x += '>'), i.test(_))) - throw new Error(_ + ' is not a valid HTML tag name in ' + x); - var M = '', - L = !1; - if (b) (M += b), (L = !0); - else if ('string' == typeof m) (M += s(m)), (L = !0); - else if (j(m)) { - r.__k = m; - for (var T = 0; T < m.length; T++) { - var E = m[T]; - if (((m[T] = w(E)), null != E && !1 !== E)) { - var $ = F(E, n, 'svg' === _ || ('foreignObject' !== _ && l), a, r); - $ && ((M += $), (L = !0)); - } - } - } else if (null != m && !1 !== m && !0 !== m) { - r.__k = [w(m)]; - var D = F(m, n, 'svg' === _ || ('foreignObject' !== _ && l), a, r); - D && ((M += D), (L = !0)); - } - if ((t.diffed && t.diffed(r), (r.__ = void 0), t.unmount && t.unmount(r), L)) - x += M; - else if (o.test(_)) return H + ' />'; - return x + ''; -} -S.shallowRender = x; -export default S; -export { - S as render, - S as renderToStaticMarkup, - S as renderToString, - x as shallowRender -}; -//# sourceMappingURL=index.module.js.map diff --git a/package-lock.json b/package-lock.json index 5bb75f18..9caa5d6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@babel/register": "^7.12.10", "@changesets/changelog-github": "^0.4.1", "@changesets/cli": "^2.18.0", + "baseline-rts": "npm:preact-render-to-string@latest", "benchmarkjs-pretty": "^2.0.1", "chai": "^4.2.0", "copyfiles": "^2.4.1", @@ -2564,6 +2565,19 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "node_modules/baseline-rts": { + "name": "preact-render-to-string", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dev": true, + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -15911,6 +15925,15 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "baseline-rts": { + "version": "npm:preact-render-to-string@5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dev": true, + "requires": { + "pretty-format": "^3.8.0" + } + }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", diff --git a/package.json b/package.json index a4393301..8472c4a4 100644 --- a/package.json +++ b/package.json @@ -121,6 +121,7 @@ "lint-staged": "^10.5.3", "microbundle": "^0.15.1", "mocha": "^8.2.1", + "baseline-rts": "npm:preact-render-to-string@latest", "preact": "^10.11.1", "prettier": "^2.2.1", "sinon": "^9.2.2", From 3a84c62c66752bbf9727cc00657663baa1c1d190 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Sat, 18 Mar 2023 10:47:39 +0100 Subject: [PATCH 2/8] check whether style needs a suffix with a set --- .changeset/beige-hounds-enjoy.md | 5 +++ src/util.js | 55 +++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 .changeset/beige-hounds-enjoy.md diff --git a/.changeset/beige-hounds-enjoy.md b/.changeset/beige-hounds-enjoy.md new file mode 100644 index 00000000..15dbc9f6 --- /dev/null +++ b/.changeset/beige-hounds-enjoy.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': patch +--- + +Change style calculation to use a Set rather than Regex diff --git a/src/util.js b/src/util.js index db59ed19..c3a598e1 100644 --- a/src/util.js +++ b/src/util.js @@ -3,7 +3,6 @@ export const UNSAFE_NAME = /[\s\n\\/='"\0<>]/; export const XLINK = /^xlink:?./; // DOM properties that should NOT have "px" added when numeric -const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|^--/; const ENCODED_ENTITIES = /["&<]/; /** @param {string} str */ @@ -50,9 +49,45 @@ export let isLargeString = (s, length, ignoreLines) => String(s).indexOf('<') !== -1; const JS_TO_CSS = {}; -const SUFFIX_CACHE = {}; -const CSS_REGEX = /([A-Z])/g; +const IS_NON_DIMENSIONAL = new Set([ + 'animation-iteration-count', + 'border-image-outset', + 'border-image-slice', + 'border-image-width', + 'box-flex', + 'box-flex-group', + 'box-ordinal-group', + 'column-count', + 'fill-opacity', + 'flex', + 'flex-grow', + 'flex-negative', + 'flex-order', + 'flex-positive', + 'flex-shrink', + 'flood-opacity', + 'font-weight', + 'grid-column', + 'grid-row', + 'line-clamp', + 'line-height', + 'opacity', + 'order', + 'orphans', + 'stop-opacity', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'tab-size', + 'widows', + 'z-index', + 'zoom' +]); + +const CSS_REGEX = /[A-Z]/g; // Convert an Object style to a CSSText string export function styleObjToCss(s) { let str = ''; @@ -63,17 +98,15 @@ export function styleObjToCss(s) { prop[0] == '-' ? prop : JS_TO_CSS[prop] || - (JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$1').toLowerCase()); + (JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase()); let suffix = ';'; - let isNumber = typeof val === 'number'; - if (isNumber && SUFFIX_CACHE[name]) { - suffix = 'px;'; - } else if ( - isNumber && - IS_NON_DIMENSIONAL.test(prop.toLowerCase()) === false + if ( + typeof val === 'number' && + // Exclude custom-attributes + !name.startsWith('--') && + !IS_NON_DIMENSIONAL.has(name) ) { - SUFFIX_CACHE[name] = true; suffix = 'px;'; } str = str + name + ':' + val + suffix; From 0a945cc005e607e220a71662168eb9c715b5e6b7 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Sun, 19 Mar 2023 10:48:41 +0100 Subject: [PATCH 3/8] squeeze out some more perf by using match --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 8332afaf..ee6bbf47 100644 --- a/src/index.js +++ b/src/index.js @@ -337,7 +337,7 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { } } - if (UNSAFE_NAME.test(type)) { + if (type.match(UNSAFE_NAME)) { throw new Error(`${type} is not a valid HTML tag name in ${s}>`); } From 8643ee5a1ad9e74ce4fd0e185912e28fd6d465d2 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sun, 19 Mar 2023 12:27:39 +0100 Subject: [PATCH 4/8] remove match --- src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index ee6bbf47..f8310617 100644 --- a/src/index.js +++ b/src/index.js @@ -337,7 +337,9 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { } } - if (type.match(UNSAFE_NAME)) { + if (UNSAFE_NAME.test(type)) { + // this seems to performs a lot better than throwing + // return ''; throw new Error(`${type} is not a valid HTML tag name in ${s}>`); } From 169c1478fbf9ad1acf79d7067b1e251b07abab2d Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sun, 19 Mar 2023 12:44:03 +0100 Subject: [PATCH 5/8] remove vnode casting --- .changeset/quiet-toes-carry.md | 5 +++++ package-lock.json | 16 ++++++++-------- package.json | 2 +- src/index.js | 11 +---------- 4 files changed, 15 insertions(+), 19 deletions(-) create mode 100644 .changeset/quiet-toes-carry.md diff --git a/.changeset/quiet-toes-carry.md b/.changeset/quiet-toes-carry.md new file mode 100644 index 00000000..445e54d6 --- /dev/null +++ b/.changeset/quiet-toes-carry.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': major +--- + +Remove the castin to VNode for `preact/debug`, this is fixed in Preact >= 10.13.0 diff --git a/package-lock.json b/package-lock.json index 9caa5d6d..de9a14f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,14 +27,14 @@ "lint-staged": "^10.5.3", "microbundle": "^0.15.1", "mocha": "^8.2.1", - "preact": "^10.11.1", + "preact": "^10.13.0", "prettier": "^2.2.1", "sinon": "^9.2.2", "sinon-chai": "^3.5.0", "typescript": "^4.1.3" }, "peerDependencies": { - "preact": ">=10" + "preact": ">=10.13.0" } }, "node_modules/@babel/code-frame": { @@ -10805,9 +10805,9 @@ } }, "node_modules/preact": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.1.tgz", - "integrity": "sha512-1Wz5PCRm6Fg+6BTXWJHhX4wRK9MZbZBHuwBqfZlOdVm2NqPe8/rjYpufvYCwJSGb9layyzB2jTTXfpCTynLqFQ==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.1.tgz", + "integrity": "sha512-KyoXVDU5OqTpG9LXlB3+y639JAGzl8JSBXLn1J9HTSB3gbKcuInga7bZnXLlxmK94ntTs1EFeZp0lrja2AuBYQ==", "dev": true, "funding": { "type": "opencollective", @@ -22525,9 +22525,9 @@ "dev": true }, "preact": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.1.tgz", - "integrity": "sha512-1Wz5PCRm6Fg+6BTXWJHhX4wRK9MZbZBHuwBqfZlOdVm2NqPe8/rjYpufvYCwJSGb9layyzB2jTTXfpCTynLqFQ==", + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.1.tgz", + "integrity": "sha512-KyoXVDU5OqTpG9LXlB3+y639JAGzl8JSBXLn1J9HTSB3gbKcuInga7bZnXLlxmK94ntTs1EFeZp0lrja2AuBYQ==", "dev": true }, "preferred-pm": { diff --git a/package.json b/package.json index 8472c4a4..4605305f 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "microbundle": "^0.15.1", "mocha": "^8.2.1", "baseline-rts": "npm:preact-render-to-string@latest", - "preact": "^10.11.1", + "preact": "^10.13.0", "prettier": "^2.2.1", "sinon": "^9.2.2", "sinon-chai": "^3.5.0", diff --git a/src/index.js b/src/index.js index f8310617..1a516311 100644 --- a/src/index.js +++ b/src/index.js @@ -22,6 +22,7 @@ const assign = Object.assign; // Global state for the current render pass let beforeDiff, afterDiff, renderHook, ummountHook; +const parent = h(Fragment, null); /** * Render Preact JSX + Components to an HTML string. @@ -44,7 +45,6 @@ export default function renderToString(vnode, context) { renderHook = options[RENDER]; ummountHook = options.unmount; - const parent = h(Fragment, null); parent[CHILDREN] = [vnode]; try { @@ -145,15 +145,6 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { rendered = rendered + _renderToString(child, context, isSvgMode, selectValue, parent); - - if ( - typeof child === 'string' || - typeof child === 'number' || - typeof child === 'bigint' - ) { - // @ts-ignore manually constructing a Text vnode - vnode[i] = h(null, null, child); - } } return rendered; } From 0ab665b9283bd124dc8a2f227b16b02aaf589f6f Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sun, 19 Mar 2023 12:45:51 +0100 Subject: [PATCH 6/8] update ts for Preact --- package-lock.json | 37 ++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index de9a14f7..5d0d99de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,10 +31,10 @@ "prettier": "^2.2.1", "sinon": "^9.2.2", "sinon-chai": "^3.5.0", - "typescript": "^4.1.3" + "typescript": "^5.0.0" }, "peerDependencies": { - "preact": ">=10.13.0" + "preact": ">=10" } }, "node_modules/@babel/code-frame": { @@ -7176,6 +7176,19 @@ "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", "dev": true }, + "node_modules/microbundle/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -13099,16 +13112,16 @@ } }, "node_modules/typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/unbox-primitive": { @@ -19605,6 +19618,12 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true } } }, @@ -24350,9 +24369,9 @@ "dev": true }, "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index 4605305f..2c1e286b 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "prettier": "^2.2.1", "sinon": "^9.2.2", "sinon-chai": "^3.5.0", - "typescript": "^4.1.3" + "typescript": "^5.0.0" }, "dependencies": { "pretty-format": "^3.8.0" From fb3a5e99e627495f53a72f0edd687e89e467d197 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sun, 19 Mar 2023 12:47:30 +0100 Subject: [PATCH 7/8] update test --- test/render.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/render.test.js b/test/render.test.js index 17391c3a..7ab0bcf8 100644 --- a/test/render.test.js +++ b/test/render.test.js @@ -1313,7 +1313,7 @@ describe('render', () => { ); } - expect(render()).to.equal('

P481

P476951

'); + expect(render()).to.equal('

P0-0

P0-1

'); }); }); }); From e04c07d97e06787012dd89c17d42e856c6f291f7 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Mon, 20 Mar 2023 12:36:59 +0100 Subject: [PATCH 8/8] revert tiny c hange --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 1a516311..a9309ec2 100644 --- a/src/index.js +++ b/src/index.js @@ -22,7 +22,6 @@ const assign = Object.assign; // Global state for the current render pass let beforeDiff, afterDiff, renderHook, ummountHook; -const parent = h(Fragment, null); /** * Render Preact JSX + Components to an HTML string. @@ -45,6 +44,7 @@ export default function renderToString(vnode, context) { renderHook = options[RENDER]; ummountHook = options.unmount; + const parent = h(Fragment, null); parent[CHILDREN] = [vnode]; try {