one
Version:
One is a new React Framework that makes Vite serve both native and web.
63 lines (55 loc) • 1.61 kB
text/typescript
import Path from 'node:path'
export function getPathnameFromFilePath(
inputPath: string,
params = {},
strict = false,
options: { preserveExtensions?: boolean, includeIndex?: boolean } = {}
) {
const path = inputPath.replace(/\+(spa|ssg|ssr|api)\.tsx?$/, '')
const dirname = Path.dirname(path).replace(/\([^\/]+\)/gi, '')
const file = Path.basename(path)
const fileName = options.preserveExtensions ? file : file.replace(/\.[a-z]+$/, '')
function paramsError(part: string) {
throw new Error(
`[one] Params doesn't fit route:
- path: ${path}
- part: ${part}
- fileName: ${fileName}
- params:
${JSON.stringify(params, null, 2)}`
)
}
const nameWithParams = (() => {
if (fileName === 'index' && !options.includeIndex) {
return '/'
}
if (fileName.startsWith('[...')) {
const part = fileName.replace('[...', '').replace(']', '')
if (!params[part]) {
if (strict) {
throw paramsError(part)
}
return `/*`
}
return `/${params[part]}`
}
return `/${fileName
.split('/')
.map((part) => {
if (part[0] === '[') {
const found = params[part.slice(1, part.length - 1)]
if (!found) {
if (strict) {
throw paramsError(part)
}
return ':' + part.replace('[', '').replace(']', '')
}
return found
}
return part
})
.join('/')}`
})()
// hono path will convert +not-found etc too
return `${dirname}${nameWithParams}`.replace(/\/\/+/gi, '/')
}