diff --git a/.changeset/mean-dragons-ring.md b/.changeset/mean-dragons-ring.md new file mode 100644 index 0000000..bae3a0c --- /dev/null +++ b/.changeset/mean-dragons-ring.md @@ -0,0 +1,5 @@ +--- +'preact-render-to-string': patch +--- + +Fix support for signals, we need to detect and unwrap the signal diff --git a/package-lock.json b/package-lock.json index 0c80c54..abb825f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@babel/register": "^7.12.10", "@changesets/changelog-github": "^0.4.1", "@changesets/cli": "^2.18.0", + "@preact/signals-core": "^1.11.0", "baseline-rts": "npm:preact-render-to-string@latest", "benchmarkjs-pretty": "^2.0.1", "check-export-map": "^1.3.1", @@ -2132,6 +2133,16 @@ "win32" ] }, + "node_modules/@preact/signals-core": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.11.0.tgz", + "integrity": "sha512-jglbibeWHuFRzEWVFY/TT7wB1PppJxmcSfUHcK+2J9vBRtiooMfw6tAPttojNYrrpdGViqAYCbPpmWYlMm+eMQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.44.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", @@ -10613,9 +10624,10 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.24.0", + "version": "10.27.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.0.tgz", + "integrity": "sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==", "dev": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" diff --git a/package.json b/package.json index 550e52b..a18c551 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ "@babel/register": "^7.12.10", "@changesets/changelog-github": "^0.4.1", "@changesets/cli": "^2.18.0", + "@preact/signals-core": "^1.11.0", "baseline-rts": "npm:preact-render-to-string@latest", "benchmarkjs-pretty": "^2.0.1", "check-export-map": "^1.3.1", diff --git a/src/index.js b/src/index.js index e3e099b..ccfdbe5 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,7 @@ import { SVG_CAMEL_CASE, createComponent } from './lib/util.js'; +import { Signal } from '@preact/signals-core'; import { options, h, Fragment } from 'preact'; import { CHILDREN, @@ -559,6 +560,7 @@ function _renderToString( for (let name in props) { let v = props[name]; + v = isSignal(v) ? v.value : v; if (typeof v == 'function' && name !== 'class' && name !== 'className') { continue; @@ -740,3 +742,12 @@ const SELF_CLOSING = new Set([ export default renderToString; export const render = renderToString; export const renderToStaticMarkup = renderToString; + +function isSignal(x) { + return ( + x !== null && + typeof x === 'object' && + typeof x.peek === 'function' && + 'value' in x + ); +} diff --git a/test/render.test.jsx b/test/render.test.jsx index cf105a0..8b59fa1 100644 --- a/test/render.test.jsx +++ b/test/render.test.jsx @@ -143,6 +143,13 @@ describe('render', () => { expect(rendered).to.equal(expected); }); + it('should include boolean disabled attribute', () => { + let rendered = render(), + expected = ``; + + expect(rendered).to.equal(expected); + }); + it('should support false aria-* attributes', () => { let rendered = render(
); expect(rendered).to.equal(``); diff --git a/test/signals/render.test.jsx b/test/signals/render.test.jsx new file mode 100644 index 0000000..72ef14d --- /dev/null +++ b/test/signals/render.test.jsx @@ -0,0 +1,16 @@ +import render from '../../src/index.js'; +import { signal } from '@preact/signals-core'; +import { h } from 'preact'; +import { expect, describe, it } from 'vitest'; + +/** @jsx h */ + +describe('signals', () => { + it('should render signals', () => { + const disabled = signal(false); + + const vdom = ; + + expect(render(vdom)).to.equal(''); + }); +});