enhancement/rework of DOM shim (using parse5) to allow for element properties in the future#178
Conversation
There was a problem hiding this comment.
Will try and give this a more thorough testing soon, but just a couple quick observations:
- Since there are no dependency changes, package-lock.json should probably not be changing
- It looks like the tests failed only because of coverage thresholds, and so I'm fine bumping down that as needed (in this case to 85% would be ok)
Ah, my bad. I must have had it accidentally checked on Sourcetree, just reset the branch and pushed just the relevant files
Yes, I believe on my initial commit I was at around 91+% on function coverage but it looks like it dipped to 89.28% with some of the additional changes. Yes, if we can temporarily drop the threshold to 85% that would be great |
…ntent - other relevant changes as well
There was a problem hiding this comment.
OK, coming out of our chats in #177, here's the state of things
- We will land #171 first
- rebase this branch against master
- preserve
getHTMLin the DOM shim and make sure no other APIs are being removed (and we should probably add some test cases here, which I can help with) - I am OK to let the mode fix come in as part of this PR, but let's make sure by adding a test case - #65
- Looks like this PR would also help resolve or invalidate #16 ?
- Sanity test in Greenwood (I will help with this once this gets rebased after #171 lands)
Added test for create-document-fragment Other minor tweaks
# Conflicts: # src/dom-shim.js # src/wcc.js
I think we should be good here but let me know.
This seems to be the last step here on my end. Will have this done soon.
Yes, I believe so. |
thescientist13
left a comment
There was a problem hiding this comment.
Looking good!
Just left a few comment / questions, but let me go ahead and start doing some downstream testing of this in Greenwood in the meantime.
|
|
||
| before(async function () { | ||
| const { html } = await renderToString(new URL('./src/index.js', import.meta.url)); | ||
| console.log('hello', html); |
| * Run wcc against two custom elements, one with an open shadow root and one with a closed shadow root | ||
| * | ||
| * User Result | ||
| * Should return the expected HTML output based on the shadow root mode of each component |
There was a problem hiding this comment.
Minor suggestion here to maybe get a little more technical / specific on the result here
Should return the expected attribute value for shadowrootmode on the template tag based on the shadow root mode of each component
| @@ -0,0 +1,61 @@ | |||
| /* | |||
| * Use Case | |||
| * Run wcc against a custom element which creates a document fragment | |||
There was a problem hiding this comment.
Sorry, I might have the lost recollection on this, but was there a particular need to test for document fragment specifically? Not sure if the case / result maybe just need to cover a little bit more of the why, maybe that would help jog my recollection?
| } | ||
|
|
||
| define(tagName, BaseClass) { | ||
| // TODO Should we throw an error here when a tagName is already defined? |
There was a problem hiding this comment.
do we need this comment? Seems its similar as the comment below?
|
|
||
| import { parseFragment, serialize } from 'parse5'; | ||
|
|
||
| // TODO Should go into utils file? |
There was a problem hiding this comment.
re: utils file, if its not needed in other files, it's probably fine to leave. I think there are cases for a util file between wcc and jsx-loader I think, but I think for now we can probably just move the TODO comment, but certainly open to a PR that proposes some code structuring / organization.
| } | ||
|
|
||
| // Deep clone for cloneNode(deep) - TODO should this go into a utils file? | ||
| // structuredClone doesn't work with functions. TODO This works with |
There was a problem hiding this comment.
Are you suggesting a library would / could handle functions? If we think that feature would be helpful, I would prefer we just extend this to support our needs if so. (would prefer to keep dependencies in this project as slim as possible and already watch to try and better de-couple the JSX ones).
So yeah, if we want to keep iterating on this, I am happy to have an issue / PR to do, and we can clean up the TODO comment.
| } | ||
|
|
||
| // Creates an empty parse5 element without the parse5 overhead. Results in 2-10x better performance. | ||
| // TODO Should this go into a utils files? |
There was a problem hiding this comment.
same: re utils file comment
thescientist13
left a comment
There was a problem hiding this comment.
So did some downstream testing in Greenwood and I see one regression related to how WCC is handling <html>, <head> and <body> tags it seems, in that it looks like they are being stripped out by WCC now.
For example, this "app layout" component
https://github.com/ProjectEvergreen/greenwood/blob/master/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/layouts/app.js
export default class AppLayout extends HTMLElement {
async connectedCallback() {
const year = new Date().getFullYear();
this.innerHTML = `
<!DOCTYPE html>
<html>
<head>
<title>App Layout</title>
</head>
<body>
<h1>App Layout</h1>
<page-outlet></page-outlet>
<footer>${year}</footer>
</body>
</html>
`;
}
}when run through WCC, doesn't seem to be returning all the content (notice the <title> tag is not wrapped by a <head> tag anymore)
{
result: {
layout: null,
body: '\n' +
' \n' +
' \n' +
' \n' +
' <title>App Layout</title>\n' +
' \n' +
'\n' +
' \n' +
' <h1>App Layout</h1>\n' +
' <page-outlet></page-outlet>\n' +
' <footer>2025</footer>\n' +
' \n' +
' \n' +
' ',
frontmatter: null,
html: null,
prerender: false,
isolation: undefined
}
}My hunch is that in DOM shim, now that we are pulling in parse5, we are only using parseFragment
https://github.com/ProjectEvergreen/wcc/pull/178/files#diff-d043dc2785231f2ef65d347d7810dae3ca0224e06f777e6d3d66ccc18c5132eeR3
but like in wcc.js we should probably be detecting and using parse or parseFragment
https://github.com/ProjectEvergreen/wcc/blob/master/src/wcc.js#L31
This may be an oversight in the WCC test case, so let's add a new one specifically testing for full document support and I bet it will fail, then we can add the parsing detection, then I bet it will work. 🎯
|
|
||
| getTemplate() { | ||
| return ` | ||
| return `<!DOCTYPE html> |
There was a problem hiding this comment.
since we have dedicated test cases for the wrapping tags now, maybe we can leave this test case as is?
thescientist13
left a comment
There was a problem hiding this comment.
Awesome, just sanity checked the latest changes against Greenwood's test suite (and website repo) and everything looks to be working great!
ProjectEvergreen/greenwood@1be1553
Only last thing I commented on was re: this test case, otherwise I think this is looking good to go. 💯
thescientist13
left a comment
There was a problem hiding this comment.
Heck yeah, awesome work @briangrider ! 🙇
Happy to help! |
Related Issue
First step to resolving issue 170
Summary of Changes
dom-shim.js:
wcc.js