From a83b9af8f8f8395d2ba30b44c2dbef6537a55169 Mon Sep 17 00:00:00 2001 From: Owen Buckley Date: Sun, 5 Jun 2022 13:01:50 -0400 Subject: [PATCH 1/2] innerHTML / light DOM support --- src/wcc.js | 16 +++- test/cases/light-dom/light-dom.spec.js | 79 +++++++++++++++++++ test/cases/light-dom/src/components/header.js | 37 +++++++++ .../light-dom/src/components/navigation.js | 23 ++++++ test/cases/light-dom/src/pages/index.js | 16 ++++ 5 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 test/cases/light-dom/light-dom.spec.js create mode 100644 test/cases/light-dom/src/components/header.js create mode 100644 test/cases/light-dom/src/components/navigation.js create mode 100644 test/cases/light-dom/src/pages/index.js diff --git a/src/wcc.js b/src/wcc.js index cbed750e..d05ac419 100644 --- a/src/wcc.js +++ b/src/wcc.js @@ -30,10 +30,16 @@ async function renderComponentRoots(tree, includeShadowRoots = true) { const { moduleURL } = definitions[tagName]; const elementInstance = await initializeCustomElement(moduleURL, tagName, node.attrs); - const shadowRootHtml = elementInstance.getInnerHTML({ includeShadowRoots }); - const shadowRootTree = parseFragment(shadowRootHtml); + if (elementInstance.shadowRoot) { + const shadowRootHtml = elementInstance.getInnerHTML({ includeShadowRoots }); + const shadowRootTree = parseFragment(shadowRootHtml); - node.childNodes = node.childNodes.length === 0 ? shadowRootTree.childNodes : [...shadowRootTree.childNodes, ...node.childNodes]; + node.childNodes = node.childNodes.length === 0 ? shadowRootTree.childNodes : [...shadowRootTree.childNodes, ...node.childNodes]; + } else { + const domTree = parseFragment(elementInstance.innerHTML); + + node.childNodes = node.childNodes.length === 0 ? domTree.childNodes : [...domTree.childNodes, ...node.childNodes]; + } } if (node.childNodes && node.childNodes.length > 0) { @@ -130,7 +136,9 @@ async function renderToString(elementURL, options = {}) { const elementTagName = await getTagName(elementURL); const elementInstance = await initializeCustomElement(elementURL); - const elementHtml = elementInstance.getInnerHTML({ includeShadowRoots }); + const elementHtml = elementInstance.shadowRoot + ? elementInstance.getInnerHTML({ includeShadowRoots }) + : elementInstance.innerHTML; const elementTree = getParse(elementHtml)(elementHtml); const finalTree = await renderComponentRoots(elementTree, includeShadowRoots); const html = !lightMode && elementTagName ? ` diff --git a/test/cases/light-dom/light-dom.spec.js b/test/cases/light-dom/light-dom.spec.js new file mode 100644 index 00000000..7f0a9cfd --- /dev/null +++ b/test/cases/light-dom/light-dom.spec.js @@ -0,0 +1,79 @@ +/* + * Use Case + * Run wcc against nested custom elements using just innerHTML to intentionally NOT render Shadow DOM. + * + * User Result + * Should return the expected HTML with no template tags or Shadow Roots. + * + * User Workspace + * src/ + * components/ + * navigation.js + * header.js + * pages/ + * index.js + */ +import chai from 'chai'; +import { JSDOM } from 'jsdom'; +import { renderToString } from '../../../src/wcc.js'; + +const expect = chai.expect; + +describe('Run WCC For ', function() { + const LABEL = 'Nested Custom Element using only innerHTML (no Shadow DOM)'; + let dom; + + before(async function() { + const { html } = await renderToString(new URL('./src/pages/index.js', import.meta.url)); + + dom = new JSDOM(html); + }); + + describe(LABEL, function() { + it('should not have any