From 62c87e4204e16e615c04377e254e7ead5a93e3a2 Mon Sep 17 00:00:00 2001 From: Nathan Sarang-Walters Date: Tue, 30 Sep 2025 10:30:58 -0700 Subject: [PATCH 1/2] Preserve whitespace for pre/textarea when pretty-printing --- .changeset/rude-apes-taste.md | 5 +++++ package-lock.json | 36 +++-------------------------------- src/pretty.js | 21 ++++++++++++++------ test/pretty.test.jsx | 19 ++++++++++++++++++ test/render.test.jsx | 7 +++++++ 5 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 .changeset/rude-apes-taste.md diff --git a/.changeset/rude-apes-taste.md b/.changeset/rude-apes-taste.md new file mode 100644 index 00000000..40e00c07 --- /dev/null +++ b/.changeset/rude-apes-taste.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': patch +--- + +Preserve whitespace in `
`/`, {
+			jsx: false
+		});
+
+		expect(rendered).to.equal(``);
+	});
+
 	describe('Attribute casing', () => {
 		it('should have correct SVG casing', () => {
 			for (let name in svgAttributes) {
diff --git a/test/render.test.jsx b/test/render.test.jsx
index c189a39e..19dea6b0 100644
--- a/test/render.test.jsx
+++ b/test/render.test.jsx
@@ -243,6 +243,13 @@ describe('render', () => {
 			expect(rendered).to.equal(expected);
 		});
 
+		it('should serialize textarea value with leading/trailing whitespace', () => {
+			let rendered = render(`;
+
+			expect(rendered).to.equal(expected);
+		});
+
 		it('should escape textarea value', () => {
 			let rendered = render(`;

From 96dfd13462f2fb9a63c66198d69d70ed0eecde74 Mon Sep 17 00:00:00 2001
From: Nathan Sarang-Walters 
Date: Tue, 30 Sep 2025 14:11:26 -0700
Subject: [PATCH 2/2] Update lockfile

---
 package-lock.json | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/package-lock.json b/package-lock.json
index db843953..31da0044 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13378,6 +13378,21 @@
 				}
 			}
 		},
+		"node_modules/vite-node/node_modules/yaml": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+			"dev": true,
+			"license": "ISC",
+			"optional": true,
+			"peer": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
+			"engines": {
+				"node": ">= 14.6"
+			}
+		},
 		"node_modules/vitest": {
 			"version": "3.2.4",
 			"resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
@@ -13658,6 +13673,21 @@
 				}
 			}
 		},
+		"node_modules/vitest/node_modules/yaml": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+			"dev": true,
+			"license": "ISC",
+			"optional": true,
+			"peer": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
+			"engines": {
+				"node": ">= 14.6"
+			}
+		},
 		"node_modules/wcwidth": {
 			"version": "1.0.1",
 			"dev": true,