diff options
Diffstat (limited to 'packages/astro/src/frontend/render/utils.ts')
-rw-r--r-- | packages/astro/src/frontend/render/utils.ts | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/packages/astro/src/frontend/render/utils.ts b/packages/astro/src/frontend/render/utils.ts index 2dddf083e..29eaf64b5 100644 --- a/packages/astro/src/frontend/render/utils.ts +++ b/packages/astro/src/frontend/render/utils.ts @@ -3,12 +3,10 @@ import parse from 'rehype-parse'; import toH from 'hast-to-hyperscript'; import { ComponentRenderer } from '../../@types/renderer'; import moize from 'moize'; -// This prevents tree-shaking of render. -Function.prototype(toH); /** @internal */ -function childrenToTree(children: string[]) { - return children.map((child) => (unified().use(parse, { fragment: true }).parse(child) as any).children.pop()); +function childrenToTree(children: string[]): any[] { + return [].concat(...children.map((child) => (unified().use(parse, { fragment: true }).parse(child) as any).children)); } /** @@ -32,17 +30,20 @@ export const childrenToVnodes = moize.deep(function childrenToVnodes(h: any, chi */ export const childrenToH = moize.deep(function childrenToH(renderer: ComponentRenderer<any>, children: string[]): any { if (!renderer.jsxPragma) return; + const tree = childrenToTree(children); const innerH = (name: any, attrs: Record<string, any> | null = null, _children: string[] | null = null) => { const vnode = renderer.jsxPragma?.(name, attrs, _children); const childStr = _children ? `, [${_children.map((child) => serializeChild(child)).join(',')}]` : ''; - /* fix(react): avoid hard-coding keys into the serialized tree */ - if (attrs && attrs.key) attrs.key = undefined; + if (attrs && attrs.key) attrs.key = Math.random(); const __SERIALIZED = `${renderer.jsxPragmaName}("${name}", ${attrs ? JSON.stringify(attrs) : 'null'}${childStr})` as string; return { ...vnode, __SERIALIZED }; }; + + const simpleTypes = new Set(['number', 'boolean']); const serializeChild = (child: unknown) => { - if (['string', 'number', 'boolean'].includes(typeof child)) return JSON.stringify(child); + if (typeof child === 'string') return JSON.stringify(child).replace(/<\/script>/gmi, '</script" + ">'); + if (simpleTypes.has(typeof child)) return JSON.stringify(child); if (child === null) return `null`; if ((child as any).__SERIALIZED) return (child as any).__SERIALIZED; return innerH(child).__SERIALIZED; |