@@ -6,7 +6,7 @@ import { tmpdir } from 'node:os'
66import { join } from 'node:path'
77import { H3 , toNodeHandler } from 'h3'
88import { afterEach , describe , expect , it } from 'vitest'
9- import { serveStaticHandler , serveStaticNodeMiddleware } from './serve-static'
9+ import { mountStaticHandler , serveStaticHandler , serveStaticNodeMiddleware } from './serve-static'
1010
1111interface Fixture {
1212 dir : string
@@ -167,6 +167,55 @@ describe('serveStaticHandler', () => {
167167 } )
168168} )
169169
170+ describe ( 'mountStaticHandler' , ( ) => {
171+ it ( 'serves files when mounted at the root' , async ( ) => {
172+ const dir = makeTmp ( 'devframe-serve-root-' )
173+ writeFileSync ( join ( dir , 'index.html' ) , 'root-index' , 'utf-8' )
174+ writeFileSync ( join ( dir , 'app.js' ) , 'root-app' , 'utf-8' )
175+
176+ const app = new H3 ( )
177+ mountStaticHandler ( app , '/' , dir )
178+
179+ const indexResponse = await app . request ( '/' )
180+ const assetResponse = await app . request ( '/app.js' )
181+ const missingResponse = await app . request ( '/missing.js' )
182+
183+ expect ( indexResponse . status ) . toBe ( 200 )
184+ expect ( await indexResponse . text ( ) ) . toBe ( 'root-index' )
185+ expect ( assetResponse . status ) . toBe ( 200 )
186+ expect ( await assetResponse . text ( ) ) . toBe ( 'root-app' )
187+ expect ( missingResponse . status ) . toBe ( 404 )
188+ } )
189+
190+ it ( 'keeps static bases with overlapping prefixes isolated' , async ( ) => {
191+ const viteDir = makeTmp ( 'devframe-serve-vite-' )
192+ const vitestDir = makeTmp ( 'devframe-serve-vitest-' )
193+ writeFileSync ( join ( viteDir , 'index.html' ) , 'vite-index' , 'utf-8' )
194+ writeFileSync ( join ( viteDir , 'favicon.svg' ) , 'vite' , 'utf-8' )
195+ writeFileSync ( join ( vitestDir , 'favicon.svg' ) , 'vitest' , 'utf-8' )
196+
197+ const app = new H3 ( )
198+ mountStaticHandler ( app , '/__devtools-vite/' , viteDir )
199+ mountStaticHandler ( app , '/__devtools-vitest/' , vitestDir )
200+
201+ const viteBaseResponse = await app . request ( '/__devtools-vite' )
202+ const viteBaseSlashResponse = await app . request ( '/__devtools-vite/' )
203+ const viteResponse = await app . request ( '/__devtools-vite/favicon.svg' )
204+ const vitestResponse = await app . request ( '/__devtools-vitest/favicon.svg' )
205+ const adjacentResponse = await app . request ( '/__devtools-vite-extra/favicon.svg' )
206+
207+ expect ( viteBaseResponse . status ) . toBe ( 200 )
208+ expect ( await viteBaseResponse . text ( ) ) . toBe ( 'vite-index' )
209+ expect ( viteBaseSlashResponse . status ) . toBe ( 200 )
210+ expect ( await viteBaseSlashResponse . text ( ) ) . toBe ( 'vite-index' )
211+ expect ( viteResponse . status ) . toBe ( 200 )
212+ expect ( await viteResponse . text ( ) ) . toBe ( 'vite' )
213+ expect ( vitestResponse . status ) . toBe ( 200 )
214+ expect ( await vitestResponse . text ( ) ) . toBe ( 'vitest' )
215+ expect ( adjacentResponse . status ) . toBe ( 404 )
216+ } )
217+ } )
218+
170219describe ( 'serveStaticNodeMiddleware' , ( ) => {
171220 let fx : Fixture | undefined
172221
0 commit comments