Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DO NOT LAND] Allow Previously Seen Client References to be Passed Back to a Reply #28609

Closed
wants to merge 2 commits into from

Conversation

sebmarkbage
Copy link
Collaborator

@sebmarkbage sebmarkbage commented Mar 21, 2024

This was a follow up #28564 but I now feel uncomfortable with this solution due to security implications. I'm only opening it for reference. Instead I propose locking it down further in #28610 and instead to allow existing code to work we land #28611.

This PR tracks Client References that came from the server and then allows them to be passed back as part of a reply - even without a temporary reference set. That way they work with $$FORM_ACTION.

Since now any kind of element could be serialize this also re-enables React Element serialization.

Security Implications

The realization is that this opens an uncomfortable security implication. When implementing Server Actions we recommend that you block cross-origin form POST by checking the Host (or even by doing your own CSRF token). At the very least you shouldn't let cookies be passed in those cases which is the default. If you don't implement the Host protection you can invoke a server action from another page by POSTing a regular form to it but at least you can't spoof a cookie.

Allowing elements to be passed into the action this way opens up a potentially scary implication because it allows a spoofed form hosted on a different origin to POST with an element that could contain XSS information and then potentially get the receiving side to render it. E.g.

function action(errors, payload) {
  try {
    ...
  } catch (x) {
    return [newError].concat(errors);
  }
}
const [errors, formAction] = useActionState(action);
return <div>{errors}</div>;

This wouldn't happen in a proper framework if you block the host/origin like Next.js does. However, it does seem concerning enough since it opens up a new category of risk in the case you mess this up so it's valuable to block this at a layer. It's also not really a legit use case other than for progressive enhancement case as noted in #28564.

So I lean towards just more intentionally blocking this instead.

This concept is kind of like a temporary reference but instead of referring
to in memory slots it passes  client reference metadata back to the server
if we got a function from the server in the places as a client reference.

This mode only kicks in if temporary references are not available such as
in progressive enhancement. However, it allows for passing all values back
to the server if they came from there in the first place.
@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Mar 21, 2024
@sebmarkbage sebmarkbage marked this pull request as draft March 21, 2024 20:11
@react-sizebot
Copy link

Comparing: a493901...1d26103

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.min.js = 176.84 kB 176.84 kB = 54.92 kB 54.91 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 173.27 kB 173.27 kB = 54.04 kB 54.04 kB
facebook-www/ReactDOM-prod.classic.js = 594.30 kB 594.30 kB = 104.45 kB 104.45 kB
facebook-www/ReactDOM-prod.modern.js = 577.56 kB 577.56 kB = 101.48 kB 101.48 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js +4.85% 45.31 kB 47.51 kB +4.24% 11.07 kB 11.54 kB
oss-stable/react-client/cjs/react-client-flight.production.js +4.85% 45.31 kB 47.51 kB +4.24% 11.07 kB 11.54 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +4.58% 45.10 kB 47.16 kB +4.00% 10.71 kB 11.14 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +4.58% 45.10 kB 47.16 kB +4.00% 10.71 kB 11.14 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +4.57% 45.25 kB 47.32 kB +3.98% 10.74 kB 11.16 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +4.57% 45.25 kB 47.32 kB +3.98% 10.74 kB 11.16 kB
oss-experimental/react-client/cjs/react-client-flight.production.js +4.37% 50.30 kB 52.50 kB +3.95% 12.05 kB 12.53 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +4.26% 48.51 kB 50.57 kB +3.64% 11.67 kB 12.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +4.26% 48.51 kB 50.57 kB +3.64% 11.67 kB 12.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +4.21% 49.03 kB 51.09 kB +3.60% 11.84 kB 12.27 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +4.21% 49.03 kB 51.09 kB +3.60% 11.84 kB 12.27 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +4.12% 50.19 kB 52.25 kB +3.69% 11.71 kB 12.14 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +4.10% 50.34 kB 52.41 kB +3.66% 11.74 kB 12.17 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +3.95% 52.33 kB 54.40 kB +3.61% 12.52 kB 12.97 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +3.95% 52.33 kB 54.40 kB +3.61% 12.52 kB 12.97 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +3.85% 53.60 kB 55.66 kB +3.38% 12.67 kB 13.10 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +3.82% 54.12 kB 56.18 kB +3.36% 12.83 kB 13.27 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +3.82% 54.12 kB 56.19 kB +3.50% 13.08 kB 13.54 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +3.82% 54.12 kB 56.19 kB +3.50% 13.08 kB 13.54 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +3.82% 54.15 kB 56.22 kB +3.50% 13.10 kB 13.56 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +3.82% 54.15 kB 56.22 kB +3.50% 13.10 kB 13.56 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +3.72% 55.56 kB 57.62 kB +3.40% 13.45 kB 13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +3.72% 55.56 kB 57.62 kB +3.40% 13.45 kB 13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +3.72% 55.58 kB 57.65 kB +3.38% 13.49 kB 13.95 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +3.72% 55.58 kB 57.65 kB +3.38% 13.49 kB 13.95 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +3.65% 56.67 kB 58.73 kB +3.38% 13.66 kB 14.13 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +3.65% 56.67 kB 58.73 kB +3.38% 13.66 kB 14.13 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +3.64% 56.69 kB 58.76 kB +3.36% 13.71 kB 14.17 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +3.64% 56.69 kB 58.76 kB +3.36% 13.71 kB 14.17 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +3.60% 57.42 kB 59.49 kB +3.48% 13.53 kB 14.00 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +3.49% 59.21 kB 61.28 kB +3.39% 14.09 kB 14.56 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +3.49% 59.24 kB 61.31 kB +3.40% 14.11 kB 14.59 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +3.41% 60.65 kB 62.71 kB +3.30% 14.45 kB 14.93 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +3.41% 60.67 kB 62.74 kB +3.28% 14.50 kB 14.97 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +3.35% 61.76 kB 63.82 kB +3.27% 14.66 kB 15.14 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +3.34% 61.78 kB 63.85 kB +3.25% 14.71 kB 15.19 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +3.29% 61.45 kB 63.48 kB +2.90% 14.75 kB 15.18 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +3.29% 61.45 kB 63.48 kB +2.90% 14.75 kB 15.18 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +3.28% 61.69 kB 63.72 kB +2.89% 14.82 kB 15.25 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +3.28% 61.69 kB 63.72 kB +2.89% 14.82 kB 15.25 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +3.28% 61.77 kB 63.80 kB +3.07% 15.06 kB 15.52 kB
oss-stable/react-client/cjs/react-client-flight.development.js +3.28% 61.77 kB 63.80 kB +3.07% 15.06 kB 15.52 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +3.12% 64.94 kB 66.97 kB +2.81% 15.78 kB 16.23 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +3.12% 64.94 kB 66.97 kB +2.81% 15.78 kB 16.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +3.09% 65.45 kB 67.48 kB +2.77% 15.96 kB 16.40 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +3.09% 65.45 kB 67.48 kB +2.77% 15.96 kB 16.40 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +3.05% 68.91 kB 71.02 kB +2.84% 16.02 kB 16.48 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +3.05% 68.91 kB 71.02 kB +2.84% 16.02 kB 16.48 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +3.04% 66.54 kB 68.56 kB +2.72% 15.76 kB 16.18 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +3.03% 66.78 kB 68.80 kB +2.72% 15.82 kB 16.25 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +3.03% 69.46 kB 71.56 kB +2.74% 16.21 kB 16.65 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +3.03% 69.46 kB 71.56 kB +2.74% 16.21 kB 16.65 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +3.03% 66.86 kB 68.88 kB +2.84% 16.06 kB 16.52 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.92% 69.40 kB 71.42 kB +2.72% 16.82 kB 17.28 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.92% 69.40 kB 71.42 kB +2.72% 16.82 kB 17.28 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +2.89% 70.03 kB 72.05 kB +2.64% 16.79 kB 17.23 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.87% 70.54 kB 72.56 kB +2.61% 16.96 kB 17.40 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +2.84% 71.18 kB 73.20 kB +2.64% 17.40 kB 17.86 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +2.84% 71.18 kB 73.20 kB +2.64% 17.40 kB 17.86 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.84% 71.21 kB 73.24 kB +2.64% 17.42 kB 17.88 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.84% 71.21 kB 73.24 kB +2.64% 17.42 kB 17.88 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +2.83% 74.32 kB 76.42 kB +2.74% 17.05 kB 17.52 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.81% 74.86 kB 76.96 kB +2.66% 17.23 kB 17.69 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.79% 72.61 kB 74.64 kB +2.66% 17.76 kB 18.23 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.79% 72.61 kB 74.64 kB +2.66% 17.76 kB 18.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.79% 72.64 kB 74.66 kB +2.67% 17.80 kB 18.28 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.79% 72.64 kB 74.66 kB +2.67% 17.80 kB 18.28 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +2.75% 73.68 kB 75.71 kB +2.65% 17.97 kB 18.45 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +2.75% 73.68 kB 75.71 kB +2.65% 17.97 kB 18.45 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +2.75% 73.71 kB 75.73 kB +2.63% 18.02 kB 18.49 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +2.75% 73.71 kB 75.73 kB +2.63% 18.02 kB 18.49 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.72% 74.48 kB 76.51 kB +2.55% 17.83 kB 18.28 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +2.65% 76.26 kB 78.29 kB +2.49% 18.41 kB 18.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.65% 76.30 kB 78.32 kB +2.47% 18.43 kB 18.89 kB
facebook-www/ReactFlightDOMClient-prod.modern.js +2.61% 19.74 kB 20.25 kB +1.95% 4.73 kB 4.82 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.60% 77.70 kB 79.72 kB +2.52% 18.76 kB 19.24 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.60% 77.73 kB 79.75 kB +2.49% 18.81 kB 19.28 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +2.57% 78.77 kB 80.79 kB +2.48% 18.98 kB 19.45 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +2.57% 78.80 kB 80.82 kB +2.50% 19.02 kB 19.50 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +2.25% 26.94 kB 27.55 kB +0.63% 9.30 kB 9.35 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +2.25% 26.94 kB 27.55 kB +0.63% 9.30 kB 9.35 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.17 kB 28.78 kB +0.67% 9.25 kB 9.31 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.17 kB 28.78 kB +0.67% 9.25 kB 9.31 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.28 kB 28.89 kB +0.63% 9.36 kB 9.42 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.28 kB 28.89 kB +0.63% 9.36 kB 9.42 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.min.js +2.11% 11.28 kB 11.52 kB +1.43% 4.19 kB 4.25 kB
oss-stable/react-client/cjs/react-client-flight.production.min.js +2.11% 11.28 kB 11.52 kB +1.43% 4.19 kB 4.25 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +2.11% 28.69 kB 29.29 kB +0.78% 9.42 kB 9.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +2.11% 28.69 kB 29.29 kB +0.78% 9.42 kB 9.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.70 kB 29.30 kB +0.78% 9.38 kB 9.45 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.70 kB 29.30 kB +0.78% 9.38 kB 9.45 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.80 kB 29.40 kB +0.64% 9.49 kB 9.55 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.80 kB 29.40 kB +0.64% 9.49 kB 9.55 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +2.08% 29.10 kB 29.70 kB +0.77% 9.52 kB 9.59 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +2.08% 29.10 kB 29.70 kB +0.77% 9.52 kB 9.59 kB
facebook-www/ReactFlightDOMClient-dev.modern.js +2.06% 40.98 kB 41.83 kB +1.90% 9.53 kB 9.71 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +2.06% 29.48 kB 30.09 kB +0.82% 9.71 kB 9.79 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +2.06% 29.48 kB 30.09 kB +0.82% 9.71 kB 9.79 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +2.05% 29.45 kB 30.05 kB +0.62% 9.96 kB 10.02 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +2.02% 29.98 kB 30.58 kB +0.78% 9.86 kB 9.94 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +2.02% 29.98 kB 30.58 kB +0.78% 9.86 kB 9.94 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +2.02% 30.05 kB 30.66 kB +0.80% 9.85 kB 9.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +2.02% 30.05 kB 30.66 kB +0.80% 9.85 kB 9.93 kB
test_utils/ReactAllWarnings.js Deleted 66.48 kB 0.00 kB Deleted 16.26 kB 0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable-semver/react-client/cjs/react-client-flight.production.js +4.85% 45.31 kB 47.51 kB +4.24% 11.07 kB 11.54 kB
oss-stable/react-client/cjs/react-client-flight.production.js +4.85% 45.31 kB 47.51 kB +4.24% 11.07 kB 11.54 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +4.58% 45.10 kB 47.16 kB +4.00% 10.71 kB 11.14 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +4.58% 45.10 kB 47.16 kB +4.00% 10.71 kB 11.14 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +4.57% 45.25 kB 47.32 kB +3.98% 10.74 kB 11.16 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +4.57% 45.25 kB 47.32 kB +3.98% 10.74 kB 11.16 kB
oss-experimental/react-client/cjs/react-client-flight.production.js +4.37% 50.30 kB 52.50 kB +3.95% 12.05 kB 12.53 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +4.26% 48.51 kB 50.57 kB +3.64% 11.67 kB 12.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +4.26% 48.51 kB 50.57 kB +3.64% 11.67 kB 12.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +4.21% 49.03 kB 51.09 kB +3.60% 11.84 kB 12.27 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +4.21% 49.03 kB 51.09 kB +3.60% 11.84 kB 12.27 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +4.12% 50.19 kB 52.25 kB +3.69% 11.71 kB 12.14 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +4.10% 50.34 kB 52.41 kB +3.66% 11.74 kB 12.17 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +3.95% 52.33 kB 54.40 kB +3.61% 12.52 kB 12.97 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +3.95% 52.33 kB 54.40 kB +3.61% 12.52 kB 12.97 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +3.85% 53.60 kB 55.66 kB +3.38% 12.67 kB 13.10 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +3.82% 54.12 kB 56.18 kB +3.36% 12.83 kB 13.27 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +3.82% 54.12 kB 56.19 kB +3.50% 13.08 kB 13.54 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +3.82% 54.12 kB 56.19 kB +3.50% 13.08 kB 13.54 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +3.82% 54.15 kB 56.22 kB +3.50% 13.10 kB 13.56 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +3.82% 54.15 kB 56.22 kB +3.50% 13.10 kB 13.56 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +3.72% 55.56 kB 57.62 kB +3.40% 13.45 kB 13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +3.72% 55.56 kB 57.62 kB +3.40% 13.45 kB 13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +3.72% 55.58 kB 57.65 kB +3.38% 13.49 kB 13.95 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +3.72% 55.58 kB 57.65 kB +3.38% 13.49 kB 13.95 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +3.65% 56.67 kB 58.73 kB +3.38% 13.66 kB 14.13 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +3.65% 56.67 kB 58.73 kB +3.38% 13.66 kB 14.13 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +3.64% 56.69 kB 58.76 kB +3.36% 13.71 kB 14.17 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +3.64% 56.69 kB 58.76 kB +3.36% 13.71 kB 14.17 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +3.60% 57.42 kB 59.49 kB +3.48% 13.53 kB 14.00 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +3.49% 59.21 kB 61.28 kB +3.39% 14.09 kB 14.56 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +3.49% 59.24 kB 61.31 kB +3.40% 14.11 kB 14.59 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +3.41% 60.65 kB 62.71 kB +3.30% 14.45 kB 14.93 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +3.41% 60.67 kB 62.74 kB +3.28% 14.50 kB 14.97 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +3.35% 61.76 kB 63.82 kB +3.27% 14.66 kB 15.14 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +3.34% 61.78 kB 63.85 kB +3.25% 14.71 kB 15.19 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +3.29% 61.45 kB 63.48 kB +2.90% 14.75 kB 15.18 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +3.29% 61.45 kB 63.48 kB +2.90% 14.75 kB 15.18 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +3.28% 61.69 kB 63.72 kB +2.89% 14.82 kB 15.25 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +3.28% 61.69 kB 63.72 kB +2.89% 14.82 kB 15.25 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +3.28% 61.77 kB 63.80 kB +3.07% 15.06 kB 15.52 kB
oss-stable/react-client/cjs/react-client-flight.development.js +3.28% 61.77 kB 63.80 kB +3.07% 15.06 kB 15.52 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +3.12% 64.94 kB 66.97 kB +2.81% 15.78 kB 16.23 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +3.12% 64.94 kB 66.97 kB +2.81% 15.78 kB 16.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +3.09% 65.45 kB 67.48 kB +2.77% 15.96 kB 16.40 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +3.09% 65.45 kB 67.48 kB +2.77% 15.96 kB 16.40 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +3.05% 68.91 kB 71.02 kB +2.84% 16.02 kB 16.48 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +3.05% 68.91 kB 71.02 kB +2.84% 16.02 kB 16.48 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +3.04% 66.54 kB 68.56 kB +2.72% 15.76 kB 16.18 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +3.03% 66.78 kB 68.80 kB +2.72% 15.82 kB 16.25 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +3.03% 69.46 kB 71.56 kB +2.74% 16.21 kB 16.65 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +3.03% 69.46 kB 71.56 kB +2.74% 16.21 kB 16.65 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +3.03% 66.86 kB 68.88 kB +2.84% 16.06 kB 16.52 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.92% 69.40 kB 71.42 kB +2.72% 16.82 kB 17.28 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.92% 69.40 kB 71.42 kB +2.72% 16.82 kB 17.28 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +2.89% 70.03 kB 72.05 kB +2.64% 16.79 kB 17.23 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.87% 70.54 kB 72.56 kB +2.61% 16.96 kB 17.40 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +2.84% 71.18 kB 73.20 kB +2.64% 17.40 kB 17.86 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +2.84% 71.18 kB 73.20 kB +2.64% 17.40 kB 17.86 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.84% 71.21 kB 73.24 kB +2.64% 17.42 kB 17.88 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.84% 71.21 kB 73.24 kB +2.64% 17.42 kB 17.88 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +2.83% 74.32 kB 76.42 kB +2.74% 17.05 kB 17.52 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.81% 74.86 kB 76.96 kB +2.66% 17.23 kB 17.69 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.79% 72.61 kB 74.64 kB +2.66% 17.76 kB 18.23 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.79% 72.61 kB 74.64 kB +2.66% 17.76 kB 18.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.79% 72.64 kB 74.66 kB +2.67% 17.80 kB 18.28 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.79% 72.64 kB 74.66 kB +2.67% 17.80 kB 18.28 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +2.75% 73.68 kB 75.71 kB +2.65% 17.97 kB 18.45 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +2.75% 73.68 kB 75.71 kB +2.65% 17.97 kB 18.45 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +2.75% 73.71 kB 75.73 kB +2.63% 18.02 kB 18.49 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +2.75% 73.71 kB 75.73 kB +2.63% 18.02 kB 18.49 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.72% 74.48 kB 76.51 kB +2.55% 17.83 kB 18.28 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +2.65% 76.26 kB 78.29 kB +2.49% 18.41 kB 18.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.65% 76.30 kB 78.32 kB +2.47% 18.43 kB 18.89 kB
facebook-www/ReactFlightDOMClient-prod.modern.js +2.61% 19.74 kB 20.25 kB +1.95% 4.73 kB 4.82 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.60% 77.70 kB 79.72 kB +2.52% 18.76 kB 19.24 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.60% 77.73 kB 79.75 kB +2.49% 18.81 kB 19.28 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +2.57% 78.77 kB 80.79 kB +2.48% 18.98 kB 19.45 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +2.57% 78.80 kB 80.82 kB +2.50% 19.02 kB 19.50 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +2.25% 26.94 kB 27.55 kB +0.63% 9.30 kB 9.35 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +2.25% 26.94 kB 27.55 kB +0.63% 9.30 kB 9.35 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.17 kB 28.78 kB +0.67% 9.25 kB 9.31 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.17 kB 28.78 kB +0.67% 9.25 kB 9.31 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.28 kB 28.89 kB +0.63% 9.36 kB 9.42 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +2.14% 28.28 kB 28.89 kB +0.63% 9.36 kB 9.42 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.min.js +2.11% 11.28 kB 11.52 kB +1.43% 4.19 kB 4.25 kB
oss-stable/react-client/cjs/react-client-flight.production.min.js +2.11% 11.28 kB 11.52 kB +1.43% 4.19 kB 4.25 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +2.11% 28.69 kB 29.29 kB +0.78% 9.42 kB 9.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +2.11% 28.69 kB 29.29 kB +0.78% 9.42 kB 9.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.70 kB 29.30 kB +0.78% 9.38 kB 9.45 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.70 kB 29.30 kB +0.78% 9.38 kB 9.45 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.80 kB 29.40 kB +0.64% 9.49 kB 9.55 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +2.10% 28.80 kB 29.40 kB +0.64% 9.49 kB 9.55 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +2.08% 29.10 kB 29.70 kB +0.77% 9.52 kB 9.59 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +2.08% 29.10 kB 29.70 kB +0.77% 9.52 kB 9.59 kB
facebook-www/ReactFlightDOMClient-dev.modern.js +2.06% 40.98 kB 41.83 kB +1.90% 9.53 kB 9.71 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +2.06% 29.48 kB 30.09 kB +0.82% 9.71 kB 9.79 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +2.06% 29.48 kB 30.09 kB +0.82% 9.71 kB 9.79 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +2.05% 29.45 kB 30.05 kB +0.62% 9.96 kB 10.02 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +2.02% 29.98 kB 30.58 kB +0.78% 9.86 kB 9.94 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +2.02% 29.98 kB 30.58 kB +0.78% 9.86 kB 9.94 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +2.02% 30.05 kB 30.66 kB +0.80% 9.85 kB 9.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +2.02% 30.05 kB 30.66 kB +0.80% 9.85 kB 9.93 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +1.98% 30.56 kB 31.16 kB +0.78% 10.01 kB 10.09 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +1.98% 30.56 kB 31.16 kB +0.78% 10.01 kB 10.09 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +1.97% 30.73 kB 31.34 kB +0.64% 9.94 kB 10.00 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +1.95% 30.85 kB 31.45 kB +0.74% 10.03 kB 10.10 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +1.93% 31.26 kB 31.86 kB +0.67% 10.06 kB 10.13 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +1.93% 31.27 kB 31.88 kB +0.63% 10.10 kB 10.17 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +1.92% 31.36 kB 31.96 kB +0.83% 10.17 kB 10.26 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +1.91% 12.48 kB 12.71 kB +1.33% 4.53 kB 4.59 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +1.91% 31.68 kB 32.28 kB +0.64% 10.21 kB 10.27 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +1.89% 31.99 kB 32.60 kB +1.02% 10.38 kB 10.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +1.87% 32.48 kB 33.09 kB +0.97% 10.53 kB 10.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +1.86% 32.56 kB 33.17 kB +1.03% 10.53 kB 10.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +1.83% 33.07 kB 33.67 kB +0.69% 10.71 kB 10.79 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1.83% 95.92 kB 97.67 kB +0.82% 22.65 kB 22.84 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1.83% 95.92 kB 97.67 kB +0.82% 22.65 kB 22.84 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +1.78% 98.60 kB 100.35 kB +0.84% 23.24 kB 23.43 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +1.78% 98.60 kB 100.35 kB +0.84% 23.24 kB 23.43 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +1.76% 99.44 kB 101.20 kB +0.80% 23.46 kB 23.65 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +1.76% 99.44 kB 101.20 kB +0.80% 23.46 kB 23.65 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +1.74% 100.85 kB 102.60 kB +0.83% 23.84 kB 24.03 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +1.74% 100.85 kB 102.60 kB +0.83% 23.84 kB 24.03 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +1.73% 101.17 kB 102.92 kB +0.79% 23.90 kB 24.09 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +1.73% 101.17 kB 102.92 kB +0.79% 23.90 kB 24.09 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +1.72% 102.07 kB 103.82 kB +0.82% 23.64 kB 23.83 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +1.72% 102.07 kB 103.82 kB +0.82% 23.64 kB 23.83 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +1.68% 104.15 kB 105.90 kB +0.85% 24.13 kB 24.33 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +1.68% 104.15 kB 105.90 kB +0.85% 24.13 kB 24.33 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +1.67% 104.73 kB 106.49 kB +0.81% 24.47 kB 24.67 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +1.67% 104.73 kB 106.49 kB +0.81% 24.47 kB 24.67 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1.65% 106.08 kB 107.83 kB +0.69% 24.82 kB 24.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +1.64% 106.80 kB 108.56 kB +0.82% 25.02 kB 25.22 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +1.64% 106.80 kB 108.56 kB +0.82% 25.02 kB 25.22 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +1.61% 109.21 kB 110.96 kB +0.75% 25.58 kB 25.77 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1.60% 109.22 kB 110.97 kB +0.78% 25.50 kB 25.70 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1.60% 109.22 kB 110.97 kB +0.78% 25.50 kB 25.70 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +1.59% 110.05 kB 111.80 kB +0.71% 25.82 kB 26.01 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +1.57% 111.46 kB 113.21 kB +0.73% 26.19 kB 26.38 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +1.57% 111.78 kB 113.53 kB +0.71% 26.26 kB 26.45 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +1.56% 112.23 kB 113.98 kB +0.70% 25.83 kB 26.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +1.56% 112.13 kB 113.88 kB +0.83% 26.08 kB 26.30 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +1.56% 112.13 kB 113.88 kB +0.83% 26.08 kB 26.30 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +1.55% 113.02 kB 114.77 kB +0.79% 26.31 kB 26.52 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +1.55% 113.02 kB 114.77 kB +0.79% 26.31 kB 26.52 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +1.54% 118.37 kB 120.19 kB +0.84% 26.41 kB 26.63 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +1.54% 118.37 kB 120.19 kB +0.84% 26.41 kB 26.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +1.53% 114.30 kB 116.06 kB +0.69% 26.32 kB 26.50 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.53% 114.58 kB 116.33 kB +0.77% 26.76 kB 26.96 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.53% 114.58 kB 116.33 kB +0.77% 26.76 kB 26.96 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +1.53% 114.89 kB 116.64 kB +0.70% 26.66 kB 26.85 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.52% 114.95 kB 116.70 kB +0.77% 26.82 kB 27.02 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.52% 114.95 kB 116.70 kB +0.77% 26.82 kB 27.02 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +1.52% 115.38 kB 117.13 kB +0.84% 26.47 kB 26.69 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +1.52% 115.38 kB 117.13 kB +0.84% 26.47 kB 26.69 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.51% 120.94 kB 122.76 kB +0.82% 27.09 kB 27.31 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.51% 120.94 kB 122.76 kB +0.82% 27.09 kB 27.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +1.50% 116.96 kB 118.72 kB +0.66% 27.22 kB 27.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +1.49% 117.67 kB 119.42 kB +0.80% 27.04 kB 27.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +1.49% 117.67 kB 119.42 kB +0.80% 27.04 kB 27.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +1.48% 118.02 kB 119.77 kB +0.82% 27.30 kB 27.53 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +1.48% 118.02 kB 119.77 kB +0.82% 27.30 kB 27.53 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +1.45% 120.31 kB 122.05 kB +0.77% 27.92 kB 28.13 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +1.45% 120.31 kB 122.05 kB +0.77% 27.92 kB 28.13 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1.42% 130.91 kB 132.76 kB +0.77% 29.72 kB 29.95 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.js +1.41% 59.30 kB 60.13 kB +0.82% 14.46 kB 14.58 kB
oss-stable/react-server/cjs/react-server-flight.production.js +1.41% 59.30 kB 60.13 kB +0.82% 14.46 kB 14.58 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +1.39% 133.62 kB 135.47 kB +0.82% 30.26 kB 30.51 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +1.38% 140.87 kB 142.81 kB +0.74% 30.70 kB 30.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +1.37% 135.18 kB 137.04 kB +0.69% 30.76 kB 30.98 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.36% 136.06 kB 137.92 kB +0.74% 30.95 kB 31.18 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +1.35% 137.07 kB 138.92 kB +0.67% 30.79 kB 31.00 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.35% 137.11 kB 138.97 kB +0.70% 31.27 kB 31.49 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.35% 143.44 kB 145.38 kB +0.69% 31.39 kB 31.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +1.33% 139.36 kB 141.21 kB +0.67% 31.38 kB 31.59 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +1.33% 139.71 kB 141.57 kB +0.63% 31.60 kB 31.80 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +1.31% 141.99 kB 143.85 kB +0.62% 32.22 kB 32.42 kB
oss-experimental/react-server/cjs/react-server-flight.production.js +1.21% 69.23 kB 70.07 kB +0.74% 16.55 kB 16.67 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js +1.15% 72.35 kB 73.19 kB +0.74% 17.23 kB 17.36 kB
oss-stable/react-server/cjs/react-server-flight.development.js +1.15% 72.35 kB 73.19 kB +0.74% 17.23 kB 17.36 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.min.js +1.08% 16.34 kB 16.52 kB +0.48% 6.06 kB 6.08 kB
oss-stable/react-server/cjs/react-server-flight.production.min.js +1.08% 16.34 kB 16.52 kB +0.48% 6.06 kB 6.08 kB
facebook-www/ReactFlightDOMServer-dev.modern.js +1.05% 101.90 kB 102.97 kB +0.65% 21.16 kB 21.30 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +1.01% 93.16 kB 94.10 kB +0.72% 21.15 kB 21.30 kB
oss-experimental/react-server/cjs/react-server-flight.production.min.js +0.94% 18.80 kB 18.97 kB +0.45% 6.72 kB 6.75 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +0.80% 12.07 kB 12.17 kB +0.94% 4.48 kB 4.52 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +0.80% 12.07 kB 12.17 kB +0.94% 4.48 kB 4.52 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +0.76% 13.05 kB 13.15 kB +0.78% 4.87 kB 4.91 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +0.76% 13.05 kB 13.15 kB +0.78% 4.87 kB 4.91 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.production.min.js +0.76% 12.92 kB 13.02 kB +0.72% 4.84 kB 4.87 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.production.min.js +0.76% 12.92 kB 13.02 kB +0.72% 4.84 kB 4.87 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.min.js +0.75% 12.74 kB 12.84 kB +0.78% 4.75 kB 4.79 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.min.js +0.75% 12.74 kB 12.84 kB +0.78% 4.75 kB 4.79 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +0.75% 12.86 kB 12.96 kB +0.65% 4.79 kB 4.82 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +0.75% 12.86 kB 12.96 kB +0.65% 4.79 kB 4.82 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +0.72% 13.38 kB 13.48 kB +0.93% 4.84 kB 4.88 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +0.70% 14.36 kB 14.46 kB +0.75% 5.23 kB 5.27 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.min.js +0.69% 14.05 kB 14.15 kB +0.78% 5.11 kB 5.15 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.production.min.js +0.69% 14.24 kB 14.33 kB +0.81% 5.19 kB 5.24 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +0.68% 14.17 kB 14.27 kB +0.70% 5.15 kB 5.18 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +0.68% 14.18 kB 14.27 kB +0.62% 5.17 kB 5.21 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +0.68% 14.18 kB 14.27 kB +0.62% 5.17 kB 5.21 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +0.67% 14.57 kB 14.67 kB +0.54% 5.35 kB 5.38 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +0.67% 14.57 kB 14.67 kB +0.54% 5.35 kB 5.38 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.min.js +0.67% 14.58 kB 14.67 kB +0.54% 5.35 kB 5.38 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.min.js +0.67% 14.58 kB 14.67 kB +0.54% 5.35 kB 5.38 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.min.js +0.65% 14.89 kB 14.98 kB +0.42% 5.46 kB 5.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.min.js +0.65% 14.89 kB 14.98 kB +0.42% 5.46 kB 5.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +0.65% 14.89 kB 14.99 kB +0.40% 5.48 kB 5.50 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +0.65% 14.89 kB 14.99 kB +0.40% 5.48 kB 5.50 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.min.js +0.64% 15.34 kB 15.44 kB +0.50% 5.59 kB 5.61 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.min.js +0.64% 15.34 kB 15.44 kB +0.50% 5.59 kB 5.61 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +0.64% 15.35 kB 15.44 kB +0.50% 5.60 kB 5.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +0.64% 15.35 kB 15.44 kB +0.50% 5.60 kB 5.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +0.63% 15.50 kB 15.60 kB +0.60% 5.53 kB 5.56 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +0.61% 15.90 kB 16.00 kB +0.44% 5.71 kB 5.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.min.js +0.61% 15.90 kB 16.00 kB +0.44% 5.71 kB 5.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.min.js +0.60% 16.21 kB 16.31 kB +0.43% 5.82 kB 5.84 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +0.60% 16.22 kB 16.32 kB +0.43% 5.83 kB 5.86 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.min.js +0.59% 16.65 kB 16.75 kB +0.52% 5.94 kB 5.97 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +0.59% 16.66 kB 16.76 kB +0.55% 5.95 kB 5.99 kB
facebook-www/ReactFlightDOMServer-prod.modern.js +0.29% 39.51 kB 39.62 kB +0.19% 8.98 kB 9.00 kB
test_utils/ReactAllWarnings.js Deleted 66.48 kB 0.00 kB Deleted 16.26 kB 0.00 kB

Generated by 🚫 dangerJS against 1d26103

sebmarkbage added a commit that referenced this pull request Mar 21, 2024
As mentioned in #28609 there's a potential security risk if you allow a
passed value to the server to spoof Elements because it allows a hacker
to POST cross origin. This is only an issue if your framework allows
this which it shouldn't but it seems like we should provide an extra
layer of security here.

```js
function action(errors, payload) {
  try {
    ...
  } catch (x) {
    return [newError].concat(errors);
  }
}
```
```js
const [errors, formAction] = useActionState(action);
return <div>{errors}</div>;
```
This would allow you to construct a payload where the previous "errors"
set includes something like `<script src="danger.js" />`.

We could block only elements from being received but it could
potentially be a risk with creating other React types like Context too.
We use symbols as a way to securely brand these.

Most JS don't use this kind of branding with symbols like we do. They're
generally properties which we don't support anyway. However in theory
someone else could be using them like we do. So in an abundance of
carefulness I just ban all symbols from being passed (except by
temporary reference) - not just ours.

This means that the format isn't fully symmetric even beyond just React
Nodes.

#28611 allows code that includes symbols/elements to continue working
but may have to bail out to replaying instead of no JS sometimes.
However, you still can't access the symbols inside the server - they're
by reference only.
sebmarkbage added a commit that referenced this pull request Mar 21, 2024
…eration (#28611)

This a follow up to #28564. It's alternative to #28609 which takes
#28610 into account.

It used to be possible to return JSX from an action with
`useActionState`.

```js
async function action(errors, payload) {
  "use server";
  try {
    ...
  } catch (x) {
    return <div>Error message</div>;
  }
}
```

```js
const [errors, formAction] = useActionState(action);
return <div>{errors}</div>;
```

Returning JSX from an action is itself not anything problematic. It's
that it also has to return the previous state to the action reducer
again that's the problem. When this happens we accidentally could
serialize an Element back to the server.

I fixed this in #28564 so it's now blocked if you don't have a temporary
reference set.

However, you can't have that for the progressive enhancement case. The
reply is eagerly encoded as part of the SSR render. Typically you
wouldn't have these in the initial state so the common case is that they
show up after the first POST back that yields an error and it's only in
the no-JS case where this happens so it's hard to discover.

As noted in #28609 there's a security implication with allowing elements
to be sent across this kind of payload, so we can't just make it work.

When an error happens during SSR our general policy is to try to recover
on the client instead. After all, SSR is mainly a perf optimization in
React terms and it's not primarily intended for a no JS solution.

This PR takes the approach that if we fail to generate the progressive
enhancement payload. I.e. if the serialization of previous state /
closures throw. Then we fallback to the replaying semantics just client
actions instead which will succeed.

The effect of this is that this pattern mostly just works:

- First render in the typical case doesn't have any JSX in it so it just
renders a progressive enhanced form.
- If JS fails to hydrate or you click early we do a form POST. If that
hits an error and it tries to render it using JSX, then the new page
will render successfully - however this time with a Replaying form
instead.
- If you try to submit the form again it'll have to be using JS.

Meaning if you use JSX as the error return value of form state and you
make a first attempt that fails, then no JS won't work because either
the first or second attempt has to hydrate.

We have ideas for potentially optimizing away serializing unused
arguments like if you don't actually use previous state which would also
solve it but it wouldn't cover all cases such as if it was deeply nested
in complex state.

Another approach that I considered was to poison the prev state if you
passed an element back but let it through to the action but if you try
to render the poisoned value, it wouldn't work. The downside of this is
when to error. Because in the progressive enhancement case it wouldn't
error early but when you actually try to invoke it at which point it
would be too late to fallback to client replaying. It would probably
have to always error even on the client which is unfortunate since this
mostly just works as long as it hydrates.
github-actions bot pushed a commit that referenced this pull request Mar 21, 2024
…eration (#28611)

This a follow up to #28564. It's alternative to #28609 which takes
#28610 into account.

It used to be possible to return JSX from an action with
`useActionState`.

```js
async function action(errors, payload) {
  "use server";
  try {
    ...
  } catch (x) {
    return <div>Error message</div>;
  }
}
```

```js
const [errors, formAction] = useActionState(action);
return <div>{errors}</div>;
```

Returning JSX from an action is itself not anything problematic. It's
that it also has to return the previous state to the action reducer
again that's the problem. When this happens we accidentally could
serialize an Element back to the server.

I fixed this in #28564 so it's now blocked if you don't have a temporary
reference set.

However, you can't have that for the progressive enhancement case. The
reply is eagerly encoded as part of the SSR render. Typically you
wouldn't have these in the initial state so the common case is that they
show up after the first POST back that yields an error and it's only in
the no-JS case where this happens so it's hard to discover.

As noted in #28609 there's a security implication with allowing elements
to be sent across this kind of payload, so we can't just make it work.

When an error happens during SSR our general policy is to try to recover
on the client instead. After all, SSR is mainly a perf optimization in
React terms and it's not primarily intended for a no JS solution.

This PR takes the approach that if we fail to generate the progressive
enhancement payload. I.e. if the serialization of previous state /
closures throw. Then we fallback to the replaying semantics just client
actions instead which will succeed.

The effect of this is that this pattern mostly just works:

- First render in the typical case doesn't have any JSX in it so it just
renders a progressive enhanced form.
- If JS fails to hydrate or you click early we do a form POST. If that
hits an error and it tries to render it using JSX, then the new page
will render successfully - however this time with a Replaying form
instead.
- If you try to submit the form again it'll have to be using JS.

Meaning if you use JSX as the error return value of form state and you
make a first attempt that fails, then no JS won't work because either
the first or second attempt has to hydrate.

We have ideas for potentially optimizing away serializing unused
arguments like if you don't actually use previous state which would also
solve it but it wouldn't cover all cases such as if it was deeply nested
in complex state.

Another approach that I considered was to poison the prev state if you
passed an element back but let it through to the action but if you try
to render the poisoned value, it wouldn't work. The downside of this is
when to error. Because in the progressive enhancement case it wouldn't
error early but when you actually try to invoke it at which point it
would be too late to fallback to client replaying. It would probably
have to always error even on the client which is unfortunate since this
mostly just works as long as it hydrates.

DiffTrain build for [fee786a](fee786a)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…28610)

As mentioned in facebook#28609 there's a potential security risk if you allow a
passed value to the server to spoof Elements because it allows a hacker
to POST cross origin. This is only an issue if your framework allows
this which it shouldn't but it seems like we should provide an extra
layer of security here.

```js
function action(errors, payload) {
  try {
    ...
  } catch (x) {
    return [newError].concat(errors);
  }
}
```
```js
const [errors, formAction] = useActionState(action);
return <div>{errors}</div>;
```
This would allow you to construct a payload where the previous "errors"
set includes something like `<script src="danger.js" />`.

We could block only elements from being received but it could
potentially be a risk with creating other React types like Context too.
We use symbols as a way to securely brand these.

Most JS don't use this kind of branding with symbols like we do. They're
generally properties which we don't support anyway. However in theory
someone else could be using them like we do. So in an abundance of
carefulness I just ban all symbols from being passed (except by
temporary reference) - not just ours.

This means that the format isn't fully symmetric even beyond just React
Nodes.

facebook#28611 allows code that includes symbols/elements to continue working
but may have to bail out to replaying instead of no JS sometimes.
However, you still can't access the symbols inside the server - they're
by reference only.
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eration (facebook#28611)

This a follow up to facebook#28564. It's alternative to facebook#28609 which takes
facebook#28610 into account.

It used to be possible to return JSX from an action with
`useActionState`.

```js
async function action(errors, payload) {
  "use server";
  try {
    ...
  } catch (x) {
    return <div>Error message</div>;
  }
}
```

```js
const [errors, formAction] = useActionState(action);
return <div>{errors}</div>;
```

Returning JSX from an action is itself not anything problematic. It's
that it also has to return the previous state to the action reducer
again that's the problem. When this happens we accidentally could
serialize an Element back to the server.

I fixed this in facebook#28564 so it's now blocked if you don't have a temporary
reference set.

However, you can't have that for the progressive enhancement case. The
reply is eagerly encoded as part of the SSR render. Typically you
wouldn't have these in the initial state so the common case is that they
show up after the first POST back that yields an error and it's only in
the no-JS case where this happens so it's hard to discover.

As noted in facebook#28609 there's a security implication with allowing elements
to be sent across this kind of payload, so we can't just make it work.

When an error happens during SSR our general policy is to try to recover
on the client instead. After all, SSR is mainly a perf optimization in
React terms and it's not primarily intended for a no JS solution.

This PR takes the approach that if we fail to generate the progressive
enhancement payload. I.e. if the serialization of previous state /
closures throw. Then we fallback to the replaying semantics just client
actions instead which will succeed.

The effect of this is that this pattern mostly just works:

- First render in the typical case doesn't have any JSX in it so it just
renders a progressive enhanced form.
- If JS fails to hydrate or you click early we do a form POST. If that
hits an error and it tries to render it using JSX, then the new page
will render successfully - however this time with a Replaying form
instead.
- If you try to submit the form again it'll have to be using JS.

Meaning if you use JSX as the error return value of form state and you
make a first attempt that fails, then no JS won't work because either
the first or second attempt has to hydrate.

We have ideas for potentially optimizing away serializing unused
arguments like if you don't actually use previous state which would also
solve it but it wouldn't cover all cases such as if it was deeply nested
in complex state.

Another approach that I considered was to poison the prev state if you
passed an element back but let it through to the action but if you try
to render the poisoned value, it wouldn't work. The downside of this is
when to error. Because in the progressive enhancement case it wouldn't
error early but when you actually try to invoke it at which point it
would be too late to fallback to client replaying. It would probably
have to always error even on the client which is unfortunate since this
mostly just works as long as it hydrates.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed React Core Team Opened by a member of the React Core Team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants