2022-07-02 14:20:09 +00:00
|
|
|
type FilePathOptions = {
|
|
|
|
filename: string
|
|
|
|
root?: string
|
|
|
|
defaultDocument?: string
|
|
|
|
}
|
|
|
|
|
2023-07-26 23:37:20 +00:00
|
|
|
export const getFilePath = (options: FilePathOptions): string | undefined => {
|
2022-07-02 14:20:09 +00:00
|
|
|
let filename = options.filename
|
2023-11-03 21:56:14 +00:00
|
|
|
if (/(?:^|[\/\\])\.\.(?:$|[\/\\])/.test(filename)) return
|
2023-07-26 23:37:20 +00:00
|
|
|
|
2022-07-02 14:20:09 +00:00
|
|
|
let root = options.root || ''
|
|
|
|
const defaultDocument = options.defaultDocument || 'index.html'
|
|
|
|
|
|
|
|
if (filename.endsWith('/')) {
|
|
|
|
// /top/ => /top/index.html
|
|
|
|
filename = filename.concat(defaultDocument)
|
|
|
|
} else if (!filename.match(/\.[a-zA-Z0-9]+$/)) {
|
|
|
|
// /top => /top/index.html
|
|
|
|
filename = filename.concat('/' + defaultDocument)
|
|
|
|
}
|
|
|
|
|
|
|
|
// /foo.html => foo.html
|
2023-11-03 21:56:14 +00:00
|
|
|
filename = filename.replace(/^\.?[\/\\]/, '')
|
|
|
|
|
|
|
|
// foo\bar.txt => foo/bar.txt
|
|
|
|
filename = filename.replace(/\\/, '/')
|
2022-07-02 14:20:09 +00:00
|
|
|
|
|
|
|
// assets/ => assets
|
|
|
|
root = root.replace(/\/$/, '')
|
|
|
|
|
|
|
|
// ./assets/foo.html => assets/foo.html
|
|
|
|
let path = root ? root + '/' + filename : filename
|
|
|
|
path = path.replace(/^\.?\//, '')
|
|
|
|
|
|
|
|
return path
|
|
|
|
}
|