one
Version:
One is a new React Framework that makes Vite serve both native and web.
55 lines (45 loc) • 1.74 kB
text/typescript
import {
CSS_PRELOAD_JS_POSTFIX,
isNative,
LOADER_JS_POSTFIX,
LOADER_JS_POSTFIX_REGEX,
PRELOAD_JS_POSTFIX,
} from '../constants'
import { getURL } from '../getURL'
import { removeSearch } from './removeSearch'
function cleanUrl(path: string) {
return removeSearch(path)
.replace(/\/$/, '') // remove trailing slash before encoding
.replaceAll('_', '__') // escape existing underscores
.replaceAll('/', '_') // use underscore as path separator
}
const isClient = typeof window !== 'undefined'
const clientSideURL = isClient ? getURL() : ''
export function getPreloadPath(currentPath: string) {
return `${clientSideURL}/assets/${cleanUrl(currentPath.slice(1))}${PRELOAD_JS_POSTFIX}`
}
export function getPreloadCSSPath(currentPath: string) {
return `${clientSideURL}/assets/${cleanUrl(currentPath.slice(1))}${CSS_PRELOAD_JS_POSTFIX}`
}
export function getLoaderPath(
currentPath: string,
includeUrl = isNative,
cacheBust?: string
) {
const baseURL = includeUrl ? getURL() : ''
const devPath = process.env.NODE_ENV === 'development' ? '/_one' : ''
const currentPathUrl = new URL(currentPath, 'http://example.com')
const cleanedUrl = cleanUrl(currentPathUrl.pathname.slice(1))
const cacheBustSegment = cacheBust ? `_refetch_${cacheBust}_` : ''
return `${baseURL}${devPath}/assets/${cleanedUrl}${cacheBustSegment}${LOADER_JS_POSTFIX}`
}
export function getPathFromLoaderPath(loaderPath: string) {
return (
loaderPath
.replace(LOADER_JS_POSTFIX_REGEX, '')
.replace(/^(\/_one)?\/assets/, '')
.replace(/_refetch_\d+_?/, '')
// decode: __ → _ (escaped underscore), _ → / (path separator)
.replace(/__|_/g, (match) => (match === '__' ? '_' : '/'))
)
}