Pin transitive tailwindcss dep in email rendering to stop sanity-test mismatches

The js-execution sanity test compares rendered email output from Freestyle
and Vercel Sandbox byte-for-byte. Both engines install nodeModules
independently, and @react-email/tailwind declares tailwindcss with a caret
range, so each new tailwindcss release created a window where the two
engines rendered byte-different HTML (4.3.3 emits "margin:0px" where
4.3.2 emitted "margin:0"). Verified against both live engines that
pinning tailwindcss makes their outputs byte-identical.
This commit is contained in:
Bilal Godil 2026-07-17 11:56:28 -07:00
parent 970c01998c
commit c440ff072e

View File

@ -56,6 +56,15 @@ const nodeModules = {
"react": "19.1.1",
"@react-email/components": "1.0.6",
"arktype": "2.1.20",
// tailwindcss is a transitive dep (@react-email/tailwind wants "^4.1.18") that must be pinned
// exactly: executeJavascript runs this bundle on two engines (Freestyle and Vercel Sandbox) that
// install node_modules independently, so when a new matching tailwindcss version was published, one
// engine picked it up before the other and the rendered HTML differed byte-wise (4.3.3 emits
// "margin:0px" where 4.3.2 emitted "margin:0"), tripping the js-execution sanity test on
// essentially every run. Pinning it here dedupes the transitive dep onto one exact version on both
// engines. Other transitive deps still float via caret ranges; if the sanity test starts firing
// again with byte-different HTML, find the drifted package and pin it here the same way.
"tailwindcss": "4.3.3",
};
const entryJs = deindent`