From 1a9b6851c01ef17c3129a4432db96f67724ab966 Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Mon, 11 Nov 2024 17:46:25 +0900 Subject: [PATCH] feat(dev-server): exclude files in `public` dir (#191) * feat(dev-server): exclude files in `public` dir * add changeset --- .changeset/unlucky-spoons-poke.md | 5 +++++ packages/dev-server/e2e/e2e.test.ts | 5 +++++ packages/dev-server/e2e/public/hono-logo.png | Bin 0 -> 8485 bytes packages/dev-server/src/dev-server.ts | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/unlucky-spoons-poke.md create mode 100644 packages/dev-server/e2e/public/hono-logo.png diff --git a/.changeset/unlucky-spoons-poke.md b/.changeset/unlucky-spoons-poke.md new file mode 100644 index 0000000..e847bf4 --- /dev/null +++ b/.changeset/unlucky-spoons-poke.md @@ -0,0 +1,5 @@ +--- +'@hono/vite-dev-server': minor +--- + +feat: exlude files in `public` dir diff --git a/packages/dev-server/e2e/e2e.test.ts b/packages/dev-server/e2e/e2e.test.ts index 59d36bd..2ead110 100644 --- a/packages/dev-server/e2e/e2e.test.ts +++ b/packages/dev-server/e2e/e2e.test.ts @@ -101,3 +101,8 @@ test('Should set `cf` properties', async ({ page }) => { expect(res?.ok()).toBe(true) expect(await res?.json()).toEqual({ cf: true }) }) + +test('Should return files in the public directory', async ({ page }) => { + const res = await page.goto('/hono-logo.png') + expect(res?.status()).toBe(200) +}) diff --git a/packages/dev-server/e2e/public/hono-logo.png b/packages/dev-server/e2e/public/hono-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..562a3b50076883af00864a85f4cc8c69e2a83b95 GIT binary patch literal 8485 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˭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 yMc?nbuktA$E1 { async function createMiddleware(server: ViteDevServer): Promise { return async function ( @@ -71,8 +77,18 @@ export function devServer(options?: DevServerOptions): VitePlugin { res: http.ServerResponse, next: Connect.NextFunction ): Promise { - const exclude = options?.exclude ?? defaultOptions.exclude + if (req.url) { + const filePath = path.join(publicDirPath, req.url) + try { + if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) { + return next() + } + } catch { + // do nothing + } + } + const exclude = options?.exclude ?? defaultOptions.exclude for (const pattern of exclude) { if (req.url) { if (pattern instanceof RegExp) {