Skip to content

Commit 645f3cb

Browse files
authored
fix: Serialize defaultChecked & defaultSelected (#224)
* fix: Serialize defaultChecked as checked attr * docs: Adding changeset * fix: Serialize defaultSelected as selected attr
1 parent 31ac323 commit 645f3cb

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

.changeset/cyan-students-unite.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'preact-render-to-string': patch
3+
---
4+
5+
Ensures `defaultChecked` is serialized as `checked` attribute

src/index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const SHALLOW = { shallow: true };
1515
// components without names, kept as a hash for later comparison to return consistent UnnamedComponentXX names.
1616
const UNNAMED = [];
1717

18-
const VOID_ELEMENTS = /^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/;
18+
const VOID_ELEMENTS =
19+
/^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/;
1920

2021
const UNSAFE_NAME = /[\s\n\\/='"\0<>]/;
2122

@@ -258,10 +259,14 @@ function _renderToString(vnode, context, opts, inner, isSvgMode, selectValue) {
258259

259260
if (name === 'defaultValue') {
260261
name = 'value';
262+
} else if (name === 'defaultChecked') {
263+
name = 'checked';
264+
} else if (name === 'defaultSelected') {
265+
name = 'selected';
261266
} else if (name === 'className') {
262267
if (typeof props.class !== 'undefined') continue;
263268
name = 'class';
264-
} else if (isSvgMode && name.match(/^xlink:?./)) {
269+
} else if (isSvgMode && /^xlink:?./.test(name)) {
265270
name = name.toLowerCase().replace(/^xlink:?/, 'xlink:');
266271
}
267272

test/render.test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,20 @@ describe('render', () => {
9595
expect(rendered).to.equal(expected);
9696
});
9797

98+
it('should serialize defaultChecked prop to the checked attribute', () => {
99+
let rendered = render(<input type="checkbox" defaultChecked />),
100+
expected = `<input type="checkbox" checked />`;
101+
102+
expect(rendered).to.equal(expected);
103+
});
104+
105+
it('should serialize defaultSelected prop to the selected attribute', () => {
106+
let rendered = render(<option defaultSelected />),
107+
expected = `<option selected></option>`;
108+
109+
expect(rendered).to.equal(expected);
110+
});
111+
98112
it('should include boolean aria-* attributes', () => {
99113
let rendered = render(<div aria-hidden aria-whatever={false} />),
100114
expected = `<div aria-hidden="true" aria-whatever="false"></div>`;

0 commit comments

Comments
 (0)