From 99d8cb1d3665107c730e7133b5dea4adbcbb7ef2 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Thu, 14 Nov 2024 20:47:23 +0100 Subject: [PATCH 1/5] Extract constant for the Vite plugin --- vite.config.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/vite.config.js b/vite.config.js index f9b614b0816..3e7415a695a 100644 --- a/vite.config.js +++ b/vite.config.js @@ -9,6 +9,23 @@ import autoprefixer from 'autoprefixer'; import fs from 'fs'; import path from 'path'; +const hydeVitePlugin = () => ({ + name: 'hyde-vite', + configureServer(server) { + // Render the Vite index page when the root URL is requested + server.middlewares.use((req, res, next) => { + if (req.url === '/') { + res.end(fs.readFileSync( + path.resolve(__dirname, 'vendor/hyde/realtime-compiler/resources/vite-index-page.html'), + 'utf-8' + )); + } else { + next(); + } + }); + } +}); + export default defineConfig({ server: { port: 5173, @@ -18,23 +35,7 @@ export default defineConfig({ }, middlewareMode: false, }, - plugins: [ - { - name: 'hyde-vite-server', - configureServer(server) { - server.middlewares.use((req, res, next) => { - if (req.url === '/') { - res.end(fs.readFileSync( - path.resolve(__dirname, 'vendor/hyde/realtime-compiler/resources/vite-index-page.html'), - 'utf-8' - )); - } else { - next(); - } - }); - }, - }, - ], + plugins: [hydeVitePlugin()], css: { postcss: { plugins: [ From cb56508034aaf11b52211bb4b3b0832990773b71 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Thu, 14 Nov 2024 20:48:17 +0100 Subject: [PATCH 2/5] Add a "hot" file when the Vite server is running --- vite.config.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vite.config.js b/vite.config.js index 3e7415a695a..be2d06ed8d6 100644 --- a/vite.config.js +++ b/vite.config.js @@ -12,6 +12,14 @@ import path from 'path'; const hydeVitePlugin = () => ({ name: 'hyde-vite', configureServer(server) { + // Create hot file when Vite server starts + fs.writeFileSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot'), ''); + + // Remove hot file when Vite server closes + server.httpServer?.on('close', () => { + fs.unlinkSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot')); + }); + // Render the Vite index page when the root URL is requested server.middlewares.use((req, res, next) => { if (req.url === '/') { From b42adba8ab464c6a81fc895c17dc2ee48f6363d1 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Thu, 14 Nov 2024 20:51:26 +0100 Subject: [PATCH 3/5] Replace slow socket call with hot file check --- packages/framework/src/Facades/Vite.php | 15 ++------------- .../tests/Unit/Facades/ViteFacadeTest.php | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/packages/framework/src/Facades/Vite.php b/packages/framework/src/Facades/Vite.php index b778f928789..d93f60f742d 100644 --- a/packages/framework/src/Facades/Vite.php +++ b/packages/framework/src/Facades/Vite.php @@ -18,19 +18,8 @@ public static function running(): bool return true; } - // Check if Vite dev server is running by attempting to connect to it - // Todo: Improve performance on Windows (takes less than 1ms on macOS, but around 100ms on Windows) - set_error_handler(fn () => false); // Todo: This warning surpressor does not work on Windows - $server = fsockopen('localhost', 5173, $errno, $errstr, 0.1); - restore_error_handler(); - - if ($server) { - fclose($server); - - return true; - } - - return false; + // Check for Vite hot file + return Filesystem::exists('app/storage/framework/cache/vite.hot'); } public static function assets(array $paths): HtmlString diff --git a/packages/framework/tests/Unit/Facades/ViteFacadeTest.php b/packages/framework/tests/Unit/Facades/ViteFacadeTest.php index d056f0e3dc0..2219d319ceb 100644 --- a/packages/framework/tests/Unit/Facades/ViteFacadeTest.php +++ b/packages/framework/tests/Unit/Facades/ViteFacadeTest.php @@ -4,12 +4,22 @@ use Hyde\Testing\UnitTestCase; use Hyde\Facades\Vite; +use Hyde\Testing\CreatesTemporaryFiles; /** * @covers \Hyde\Facades\Vite */ class ViteFacadeTest extends UnitTestCase { + use CreatesTemporaryFiles; + + protected static bool $needsKernel = true; + + protected function tearDown(): void + { + $this->cleanUpFilesystem(); + } + public function testRunningReturnsTrueWhenEnvironmentVariableIsSet() { putenv('HYDE_SERVER_VITE=enabled'); @@ -19,17 +29,14 @@ public function testRunningReturnsTrueWhenEnvironmentVariableIsSet() putenv('HYDE_SERVER_VITE'); } - public function testRunningReturnsTrueWhenViteServerIsAccessible() + public function testRunningReturnsTrueWhenViteHotFileExists() { - // Create a mock server to simulate Vite - $server = stream_socket_server('tcp://localhost:5173'); + $this->file('app/storage/framework/cache/vite.hot'); $this->assertTrue(Vite::running()); - - stream_socket_shutdown($server, STREAM_SHUT_RDWR); } - public function testRunningReturnsFalseWhenViteServerIsNotAccessible() + public function testRunningReturnsFalseWhenViteHotFileDoesNotExist() { $this->assertFalse(Vite::running()); } From 301a8a981fdc1c40dba2888c51a68a5177362eca Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Thu, 14 Nov 2024 20:59:43 +0100 Subject: [PATCH 4/5] Remove hot file on Node signal interrupt --- vite.config.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vite.config.js b/vite.config.js index be2d06ed8d6..207f00860e6 100644 --- a/vite.config.js +++ b/vite.config.js @@ -16,8 +16,9 @@ const hydeVitePlugin = () => ({ fs.writeFileSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot'), ''); // Remove hot file when Vite server closes - server.httpServer?.on('close', () => { - fs.unlinkSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot')); + process.on('SIGINT', () => { + fs.rmSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot')); + process.exit(); }); // Render the Vite index page when the root URL is requested From 18ccd6b0f33d476f41f587db972d9cb770493ec6 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Thu, 14 Nov 2024 21:15:35 +0100 Subject: [PATCH 5/5] Listen for signal termination as well --- vite.config.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/vite.config.js b/vite.config.js index 207f00860e6..7e70d1dcae5 100644 --- a/vite.config.js +++ b/vite.config.js @@ -16,9 +16,11 @@ const hydeVitePlugin = () => ({ fs.writeFileSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot'), ''); // Remove hot file when Vite server closes - process.on('SIGINT', () => { - fs.rmSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot')); - process.exit(); + ['SIGINT', 'SIGTERM'].forEach(signal => { + process.on(signal, () => { + fs.rmSync(path.resolve(process.cwd(), 'app/storage/framework/cache/vite.hot')); + process.exit(); + }); }); // Render the Vite index page when the root URL is requested