diff --git a/.changeset/cyan-students-unite.md b/.changeset/cyan-students-unite.md new file mode 100644 index 00000000..6f50e81b --- /dev/null +++ b/.changeset/cyan-students-unite.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': patch +--- + +Ensures `defaultChecked` is serialized as `checked` attribute diff --git a/src/index.js b/src/index.js index f5024e40..7a740a45 100644 --- a/src/index.js +++ b/src/index.js @@ -15,7 +15,8 @@ const SHALLOW = { shallow: true }; // components without names, kept as a hash for later comparison to return consistent UnnamedComponentXX names. const UNNAMED = []; -const VOID_ELEMENTS = /^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/; +const VOID_ELEMENTS = + /^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/; const UNSAFE_NAME = /[\s\n\\/='"\0<>]/; @@ -258,10 +259,14 @@ function _renderToString(vnode, context, opts, inner, isSvgMode, selectValue) { if (name === 'defaultValue') { name = 'value'; + } else if (name === 'defaultChecked') { + name = 'checked'; + } else if (name === 'defaultSelected') { + name = 'selected'; } else if (name === 'className') { if (typeof props.class !== 'undefined') continue; name = 'class'; - } else if (isSvgMode && name.match(/^xlink:?./)) { + } else if (isSvgMode && /^xlink:?./.test(name)) { name = name.toLowerCase().replace(/^xlink:?/, 'xlink:'); } diff --git a/test/render.test.js b/test/render.test.js index 4ef1ce41..fe3e9bf0 100644 --- a/test/render.test.js +++ b/test/render.test.js @@ -95,6 +95,20 @@ describe('render', () => { expect(rendered).to.equal(expected); }); + it('should serialize defaultChecked prop to the checked attribute', () => { + let rendered = render(), + expected = ``; + + expect(rendered).to.equal(expected); + }); + + it('should serialize defaultSelected prop to the selected attribute', () => { + let rendered = render(`; + + expect(rendered).to.equal(expected); + }); + it('should include boolean aria-* attributes', () => { let rendered = render(
), expected = ``;