0
0
mirror of https://github.com/honojs/hono.git synced 2024-11-21 10:08:58 +01:00

support Windows path when using option.root

This commit is contained in:
Yusuke Wada 2024-10-01 17:17:17 +09:00
parent 5b8d81a892
commit 1e66b38b7c

View File

@ -29,6 +29,17 @@ const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS) as (keyof typeof ENCODINGS
const DEFAULT_DOCUMENT = 'index.html'
const defaultPathResolve = (path: string) => path
const isAbsolutePath = (path: string) => {
const isUnixAbsolutePath = path.startsWith('/')
const hasDriveLetter = /^[a-zA-Z]:\\/.test(path)
const isUncPath = /^\\\\[^\\]+\\[^\\]+/.test(path)
return isUnixAbsolutePath || hasDriveLetter || isUncPath
}
const windowsPathToUnixPath = (path: string) => {
return path.replace(/^[a-zA-Z]:/, '').replace(/\\/g, '/')
}
/**
* This middleware is not directly used by the user. Create a wrapper specifying `getContent()` by the environment such as Deno or Bun.
*/
@ -43,9 +54,10 @@ export const serveStatic = <E extends Env = Env>(
let root: string
if (options.root) {
if (options.root.startsWith('/')) {
if (isAbsolutePath(options.root)) {
isAbsoluteRoot = true
root = new URL(`file://${options.root}`).pathname
root = windowsPathToUnixPath(options.root)
root = new URL(`file://${root}`).pathname
} else {
root = options.root
}