From beb84318c353d65f436779fce134420a4639feac Mon Sep 17 00:00:00 2001 From: gabriel miranda Date: Fri, 20 Feb 2026 17:14:42 -0300 Subject: [PATCH 1/3] manually setting the ESBUILD_BINARY_PATH to avoid resolution problems --- .../src/utils/preview/start-dev-server.ts | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/packages/react-email/src/utils/preview/start-dev-server.ts b/packages/react-email/src/utils/preview/start-dev-server.ts index 49d4c160ad..e7f523c2a9 100644 --- a/packages/react-email/src/utils/preview/start-dev-server.ts +++ b/packages/react-email/src/utils/preview/start-dev-server.ts @@ -1,4 +1,6 @@ +import { promises as fs, existsSync } from 'node:fs'; import http from 'node:http'; +import os from 'node:os'; import path from 'node:path'; import url from 'node:url'; import { createJiti } from 'jiti'; @@ -135,6 +137,37 @@ export const startDevServer = async ( conf.get('resendApiKey'), ), }; + if (!process.env.ESBUILD_BINARY_PATH) { + try { + const esbuildPkgJsonPath = await fs.realpath( + previewServer.esmResolve('esbuild/package.json'), + ); + const esbuildDir = path.dirname(esbuildPkgJsonPath); + const nodeModulesDir = path.dirname(esbuildDir); + const esbuildVersion = JSON.parse( + await fs.readFile(esbuildPkgJsonPath, 'utf8'), + ).version; + + const platformPkg = `@esbuild/${process.platform}-${os.arch()}`; + const subpath = + process.platform === 'win32' ? 'esbuild.exe' : 'bin/esbuild'; + const candidateBinPath = path.join(nodeModulesDir, platformPkg, subpath); + const candidatePkgJson = path.join( + nodeModulesDir, + platformPkg, + 'package.json', + ); + + if (existsSync(candidateBinPath) && existsSync(candidatePkgJson)) { + const candidateVersion = JSON.parse( + await fs.readFile(candidatePkgJson, 'utf8'), + ).version; + if (candidateVersion === esbuildVersion) { + process.env.ESBUILD_BINARY_PATH = await fs.realpath(candidateBinPath); + } + } + } catch { } + } const next = await previewServer.import( 'next', @@ -194,21 +227,21 @@ const makeExitHandler = | { shouldKillProcess: false } | { shouldKillProcess: true; killWithErrorCode: boolean }, ) => - (codeSignalOrError: number | NodeJS.Signals | Error) => { - if (typeof devServer !== 'undefined') { - console.log('\nshutting down dev server'); - devServer.close(); - devServer = undefined; - } + (codeSignalOrError: number | NodeJS.Signals | Error) => { + if (typeof devServer !== 'undefined') { + console.log('\nshutting down dev server'); + devServer.close(); + devServer = undefined; + } - if (codeSignalOrError instanceof Error) { - console.error(codeSignalOrError); - } + if (codeSignalOrError instanceof Error) { + console.error(codeSignalOrError); + } - if (options?.shouldKillProcess) { - process.exit(options.killWithErrorCode ? 1 : 0); - } - }; + if (options?.shouldKillProcess) { + process.exit(options.killWithErrorCode ? 1 : 0); + } + }; // do something when app is closing process.on('exit', makeExitHandler()); From 22c6c8df50271c7d049b72c85bd8d0ac53f6d836 Mon Sep 17 00:00:00 2001 From: gabriel miranda Date: Fri, 20 Feb 2026 17:15:47 -0300 Subject: [PATCH 2/3] lint --- .../src/utils/preview/start-dev-server.ts | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/react-email/src/utils/preview/start-dev-server.ts b/packages/react-email/src/utils/preview/start-dev-server.ts index e7f523c2a9..3c0a5cca77 100644 --- a/packages/react-email/src/utils/preview/start-dev-server.ts +++ b/packages/react-email/src/utils/preview/start-dev-server.ts @@ -1,4 +1,4 @@ -import { promises as fs, existsSync } from 'node:fs'; +import { existsSync, promises as fs } from 'node:fs'; import http from 'node:http'; import os from 'node:os'; import path from 'node:path'; @@ -166,7 +166,7 @@ export const startDevServer = async ( process.env.ESBUILD_BINARY_PATH = await fs.realpath(candidateBinPath); } } - } catch { } + } catch {} } const next = await previewServer.import( @@ -227,21 +227,21 @@ const makeExitHandler = | { shouldKillProcess: false } | { shouldKillProcess: true; killWithErrorCode: boolean }, ) => - (codeSignalOrError: number | NodeJS.Signals | Error) => { - if (typeof devServer !== 'undefined') { - console.log('\nshutting down dev server'); - devServer.close(); - devServer = undefined; - } + (codeSignalOrError: number | NodeJS.Signals | Error) => { + if (typeof devServer !== 'undefined') { + console.log('\nshutting down dev server'); + devServer.close(); + devServer = undefined; + } - if (codeSignalOrError instanceof Error) { - console.error(codeSignalOrError); - } + if (codeSignalOrError instanceof Error) { + console.error(codeSignalOrError); + } - if (options?.shouldKillProcess) { - process.exit(options.killWithErrorCode ? 1 : 0); - } - }; + if (options?.shouldKillProcess) { + process.exit(options.killWithErrorCode ? 1 : 0); + } + }; // do something when app is closing process.on('exit', makeExitHandler()); From 0f5843b14e79d8c8cc935d98fefb9a57a11e9334 Mon Sep 17 00:00:00 2001 From: gabriel miranda Date: Mon, 23 Feb 2026 09:18:12 -0300 Subject: [PATCH 3/3] wip --- .../src/utils/preview/start-dev-server.ts | 61 ++++++++----------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/packages/react-email/src/utils/preview/start-dev-server.ts b/packages/react-email/src/utils/preview/start-dev-server.ts index 3c0a5cca77..7768654fd3 100644 --- a/packages/react-email/src/utils/preview/start-dev-server.ts +++ b/packages/react-email/src/utils/preview/start-dev-server.ts @@ -139,34 +139,21 @@ export const startDevServer = async ( }; if (!process.env.ESBUILD_BINARY_PATH) { try { - const esbuildPkgJsonPath = await fs.realpath( - previewServer.esmResolve('esbuild/package.json'), - ); - const esbuildDir = path.dirname(esbuildPkgJsonPath); - const nodeModulesDir = path.dirname(esbuildDir); - const esbuildVersion = JSON.parse( - await fs.readFile(esbuildPkgJsonPath, 'utf8'), - ).version; - - const platformPkg = `@esbuild/${process.platform}-${os.arch()}`; + const esbuild = createJiti(previewServer.esmResolve('esbuild')); + const platformPackage = `@esbuild/${process.platform}-${os.arch()}`; const subpath = process.platform === 'win32' ? 'esbuild.exe' : 'bin/esbuild'; - const candidateBinPath = path.join(nodeModulesDir, platformPkg, subpath); - const candidatePkgJson = path.join( - nodeModulesDir, - platformPkg, - 'package.json', + const candidateBinaryPath = path.join( + await fs.realpath(esbuild.esmResolve(platformPackage)), + subpath, ); - - if (existsSync(candidateBinPath) && existsSync(candidatePkgJson)) { - const candidateVersion = JSON.parse( - await fs.readFile(candidatePkgJson, 'utf8'), - ).version; - if (candidateVersion === esbuildVersion) { - process.env.ESBUILD_BINARY_PATH = await fs.realpath(candidateBinPath); - } + if (existsSync(candidateBinaryPath)) { + process.env.ESBUILD_BINARY_PATH = + await fs.realpath(candidateBinaryPath); } - } catch {} + } catch (exception) { + console.error(exception); + } } const next = await previewServer.import( @@ -227,21 +214,21 @@ const makeExitHandler = | { shouldKillProcess: false } | { shouldKillProcess: true; killWithErrorCode: boolean }, ) => - (codeSignalOrError: number | NodeJS.Signals | Error) => { - if (typeof devServer !== 'undefined') { - console.log('\nshutting down dev server'); - devServer.close(); - devServer = undefined; - } + (codeSignalOrError: number | NodeJS.Signals | Error) => { + if (typeof devServer !== 'undefined') { + console.log('\nshutting down dev server'); + devServer.close(); + devServer = undefined; + } - if (codeSignalOrError instanceof Error) { - console.error(codeSignalOrError); - } + if (codeSignalOrError instanceof Error) { + console.error(codeSignalOrError); + } - if (options?.shouldKillProcess) { - process.exit(options.killWithErrorCode ? 1 : 0); - } - }; + if (options?.shouldKillProcess) { + process.exit(options.killWithErrorCode ? 1 : 0); + } + }; // do something when app is closing process.on('exit', makeExitHandler());