From bfc9509cada5102e5f2b6527b2b5c2106bf84d6f Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Thu, 18 Aug 2022 13:12:52 +0200 Subject: [PATCH 1/9] Update index.js --- src/constants.js | 2 ++ src/index.js | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/constants.js b/src/constants.js index 655802b4..bedbc8ab 100644 --- a/src/constants.js +++ b/src/constants.js @@ -7,6 +7,8 @@ export const SKIP_EFFECTS = '__s'; // VNode properties export const COMPONENT = '__c'; +export const CHILDREN = '__k'; +export const PARENT = '__'; // Component properties export const VNODE = '__v'; diff --git a/src/index.js b/src/index.js index e9982df1..577e8f95 100644 --- a/src/index.js +++ b/src/index.js @@ -16,9 +16,11 @@ import { DIFFED, DIRTY, NEXT_STATE, + PARENT, RENDER, SKIP_EFFECTS, - VNODE + VNODE, + CHILDREN } from './constants'; /** @typedef {import('preact').VNode} VNode */ @@ -72,7 +74,9 @@ function renderToString(vnode, context, opts) { ) { res = _renderToStringPretty(vnode, context, opts); } else { - res = _renderToString(vnode, context, false, undefined); + res = _renderToString(vnode, context, false, undefined, { + [CHILDREN]: [vnode] + }); } // options._commit, we don't schedule any effects in this library right now, @@ -191,11 +195,17 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { if (typeof vnode !== 'object') { return encodeEntities(vnode); } + + vnode[PARENT] = parent; + if (options[DIFF]) options[DIFF](vnode); // Recurse into children / Arrays if (isArray(vnode)) { let rendered = ''; for (let i = 0; i < vnode.length; i++) { + if (typeof vnode[i] === 'object' && parent) { + parent[CHILDREN].push(vnode[i]); + } rendered = rendered + _renderToString(vnode[i], context, isSvgMode, selectValue); } @@ -330,6 +340,7 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { } } } else if (children != null && children !== false && children !== true) { + vnode[CHILDREN] = [children]; let childSvgMode = type === 'svg' || (type !== 'foreignObject' && isSvgMode); let ret = _renderToString(children, context, childSvgMode, selectValue); From 1095c088db49f55f276adc204455e90ba8f7cc77 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Thu, 18 Aug 2022 13:17:21 +0200 Subject: [PATCH 2/9] fix tests --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 577e8f95..2a9e908d 100644 --- a/src/index.js +++ b/src/index.js @@ -195,7 +195,7 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { if (typeof vnode !== 'object') { return encodeEntities(vnode); } - + vnode[PARENT] = parent; if (options[DIFF]) options[DIFF](vnode); From ce09d91761311472df5ba6c04598cff0077f154a Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Thu, 18 Aug 2022 18:33:05 -0400 Subject: [PATCH 3/9] Update young-cougars-protect.md --- .changeset/young-cougars-protect.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/young-cougars-protect.md diff --git a/.changeset/young-cougars-protect.md b/.changeset/young-cougars-protect.md new file mode 100644 index 00000000..24b30396 --- /dev/null +++ b/.changeset/young-cougars-protect.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': minor +--- + +Add tree links (children, parent) to VNodes during rendering. From c0402f1ea7d010e4bc6c6343c75acf0ddace52c8 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 9 Sep 2022 18:23:05 +0200 Subject: [PATCH 4/9] remove changeset --- .changeset/young-cougars-protect.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/young-cougars-protect.md diff --git a/.changeset/young-cougars-protect.md b/.changeset/young-cougars-protect.md deleted file mode 100644 index 24b30396..00000000 --- a/.changeset/young-cougars-protect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'preact-render-to-string': minor ---- - -Add tree links (children, parent) to VNodes during rendering. From 0eaba17509f6ea7feae92f0b5be60605d03fc56a Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 9 Sep 2022 18:23:49 +0200 Subject: [PATCH 5/9] fix --- src/index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 2a9e908d..07462ba2 100644 --- a/src/index.js +++ b/src/index.js @@ -196,9 +196,6 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { return encodeEntities(vnode); } - vnode[PARENT] = parent; - if (options[DIFF]) options[DIFF](vnode); - // Recurse into children / Arrays if (isArray(vnode)) { let rendered = ''; @@ -212,6 +209,7 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { return rendered; } + vnode[PARENT] = parent; if (options[DIFF]) options[DIFF](vnode); let type = vnode.type, From 894f6244acab1dcbff252fc8407b1b6af88d35c7 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 9 Sep 2022 18:35:52 +0200 Subject: [PATCH 6/9] fix tests --- src/index.js | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/index.js b/src/index.js index 07462ba2..fc213e86 100644 --- a/src/index.js +++ b/src/index.js @@ -185,7 +185,7 @@ const isArray = Array.isArray; const assign = Object.assign; /** The default export is an alias of `render()`. */ -function _renderToString(vnode, context, isSvgMode, selectValue) { +function _renderToString(vnode, context, isSvgMode, selectValue, parent) { // Ignore non-rendered VNodes/values if (vnode == null || vnode === true || vnode === false || vnode === '') { return ''; @@ -199,12 +199,12 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { // Recurse into children / Arrays if (isArray(vnode)) { let rendered = ''; + parent[CHILDREN] = []; for (let i = 0; i < vnode.length; i++) { - if (typeof vnode[i] === 'object' && parent) { - parent[CHILDREN].push(vnode[i]); - } + parent[CHILDREN].push(vnode[i]); rendered = - rendered + _renderToString(vnode[i], context, isSvgMode, selectValue); + rendered + + _renderToString(vnode[i], context, isSvgMode, selectValue, parent); } return rendered; } @@ -223,7 +223,8 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { vnode.props.children, context, isSvgMode, - selectValue + selectValue, + vnode ); } @@ -240,7 +241,13 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { } // Recurse into children before invoking the after-diff hook - const str = _renderToString(rendered, context, isSvgMode, selectValue); + const str = _renderToString( + rendered, + context, + isSvgMode, + selectValue, + vnode + ); if (options[DIFFED]) options[DIFFED](vnode); return str; } @@ -322,13 +329,20 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { pieces = pieces + encodeEntities(children); hasChildren = true; } else if (isArray(children)) { + vnode[CHILDREN] = []; for (let i = 0; i < children.length; i++) { let child = children[i]; - + vnode[CHILDREN].push(child); if (child != null && child !== false) { let childSvgMode = type === 'svg' || (type !== 'foreignObject' && isSvgMode); - let ret = _renderToString(child, context, childSvgMode, selectValue); + let ret = _renderToString( + child, + context, + childSvgMode, + selectValue, + vnode + ); // Skip if we received an empty string if (ret) { @@ -341,7 +355,13 @@ function _renderToString(vnode, context, isSvgMode, selectValue) { vnode[CHILDREN] = [children]; let childSvgMode = type === 'svg' || (type !== 'foreignObject' && isSvgMode); - let ret = _renderToString(children, context, childSvgMode, selectValue); + let ret = _renderToString( + children, + context, + childSvgMode, + selectValue, + vnode + ); // Skip if we received an empty string if (ret) { From f4bc18c8280506e32554e5e0fbd93a8d2e7cfc5d Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Sat, 10 Sep 2022 13:22:55 -0400 Subject: [PATCH 7/9] Use `props.children` as vnode._children instead of creating a new Array. --- src/index.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/index.js b/src/index.js index fc213e86..039afedd 100644 --- a/src/index.js +++ b/src/index.js @@ -7,7 +7,7 @@ import { XLINK, VOID_ELEMENTS } from './util'; -import { options, Fragment } from 'preact'; +import { options, h, Fragment } from 'preact'; import { _renderToStringPretty } from './pretty'; import { COMMIT, @@ -61,6 +61,9 @@ function renderToString(vnode, context, opts) { const previousSkipEffects = options[SKIP_EFFECTS]; options[SKIP_EFFECTS] = true; + const parent = h(Fragment, null); + parent[CHILDREN] = [vnode]; + let res; if ( opts && @@ -74,9 +77,7 @@ function renderToString(vnode, context, opts) { ) { res = _renderToStringPretty(vnode, context, opts); } else { - res = _renderToString(vnode, context, false, undefined, { - [CHILDREN]: [vnode] - }); + res = _renderToString(vnode, context, false, undefined, parent); } // options._commit, we don't schedule any effects in this library right now, @@ -199,9 +200,8 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { // Recurse into children / Arrays if (isArray(vnode)) { let rendered = ''; - parent[CHILDREN] = []; + parent[CHILDREN] = vnode; for (let i = 0; i < vnode.length; i++) { - parent[CHILDREN].push(vnode[i]); rendered = rendered + _renderToString(vnode[i], context, isSvgMode, selectValue, parent); @@ -329,10 +329,9 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { pieces = pieces + encodeEntities(children); hasChildren = true; } else if (isArray(children)) { - vnode[CHILDREN] = []; + vnode[CHILDREN] = children; for (let i = 0; i < children.length; i++) { let child = children[i]; - vnode[CHILDREN].push(child); if (child != null && child !== false) { let childSvgMode = type === 'svg' || (type !== 'foreignObject' && isSvgMode); From 52f1fddaf1b0bbf1ba7f6cf81b782410d4a82703 Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Sat, 10 Sep 2022 14:47:35 -0400 Subject: [PATCH 8/9] unset vnode parent properties after rendering. Also consolidate Fragment and component rendering codepaths. --- src/index.js | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/index.js b/src/index.js index 039afedd..cd941f56 100644 --- a/src/index.js +++ b/src/index.js @@ -218,26 +218,20 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { // Invoke rendering on Components const isComponent = typeof type === 'function'; if (isComponent) { - if (type === Fragment) { - return _renderToString( - vnode.props.children, - context, - isSvgMode, - selectValue, - vnode - ); - } - let rendered; - if (type.prototype && typeof type.prototype.render === 'function') { - rendered = renderClassComponent(vnode, context); + if (type === Fragment) { + rendered = props.children; } else { - rendered = renderFunctionComponent(vnode, context); - } + if (type.prototype && typeof type.prototype.render === 'function') { + rendered = renderClassComponent(vnode, context); + } else { + rendered = renderFunctionComponent(vnode, context); + } - let component = vnode[COMPONENT]; - if (component.getChildContext) { - context = assign({}, context, component.getChildContext()); + let component = vnode[COMPONENT]; + if (component.getChildContext) { + context = assign({}, context, component.getChildContext()); + } } // Recurse into children before invoking the after-diff hook @@ -249,6 +243,7 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { vnode ); if (options[DIFFED]) options[DIFFED](vnode); + vnode[PARENT] = undefined; return str; } @@ -370,6 +365,7 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) { } if (options[DIFFED]) options[DIFFED](vnode); + vnode[PARENT] = undefined; if (hasChildren) { s = s + pieces; From 6c898bce4013e8699eb485d9ceec6f9f66d75227 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sat, 10 Sep 2022 21:16:52 +0200 Subject: [PATCH 9/9] Create dull-baboons-kneel.md --- .changeset/dull-baboons-kneel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dull-baboons-kneel.md diff --git a/.changeset/dull-baboons-kneel.md b/.changeset/dull-baboons-kneel.md new file mode 100644 index 00000000..e1840ab3 --- /dev/null +++ b/.changeset/dull-baboons-kneel.md @@ -0,0 +1,5 @@ +--- +"preact-render-to-string": patch +--- + +add parent and children for useId