feat: add url utils
This commit is contained in:
parent
f6343c7db4
commit
b99bfabc23
156
src/url_utils.ts
Normal file
156
src/url_utils.ts
Normal file
|
@ -0,0 +1,156 @@
|
|||
import { COHABIT_GIT_URL, PORTFOLIO_BASE_URL } from '../config.ts'
|
||||
import { User } from './user_utils.ts'
|
||||
|
||||
/**
|
||||
* Get raw files repository base url.
|
||||
*
|
||||
* @param user Login of the owner user.
|
||||
* @returns Repository url for raw files.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getRepoUrl } from './url_utils.ts'
|
||||
*
|
||||
* const repoUrl = getRepoUrl('john.doe')
|
||||
* console.assert(repoUrl.href === 'https://git.cohabit.fr/john.doe/.portfolio/raw/branch/main/')
|
||||
* ```
|
||||
*/
|
||||
export function getRepoUrl(user: User): URL {
|
||||
const userRepoUrl = new URL(`./${user}/`, COHABIT_GIT_URL)
|
||||
return new URL(PORTFOLIO_BASE_URL, userRepoUrl)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get portfolio index URL depending of the presence of `/dist/index.html`.
|
||||
*
|
||||
* @param baseUrl Repository base url.
|
||||
* @returns Index url, `./dist/index.html` is available else './README.md'.
|
||||
*
|
||||
* @example Basic WYSIWYG index
|
||||
* ```ts
|
||||
* import { getRepoUrl, getIndexUrl } from './url_utils.ts'
|
||||
*
|
||||
* const repoUrl = getRepoUrl('john.doe')
|
||||
* const index = getIndexUrl(repoUrl)
|
||||
*
|
||||
* console.assert(index.href === new URL('./README.md', repoUrl).href)
|
||||
* ```
|
||||
*
|
||||
* @example Generated index
|
||||
* ```ts
|
||||
* import { getRepoUrl, getIndexUrl } from './url_utils.ts'
|
||||
*
|
||||
* const repoUrl = getRepoUrl('john.doe')
|
||||
* const baseUrl = new URL('./dist/', repoUrl)
|
||||
* const index = getIndexUrl(baseUrl)
|
||||
*
|
||||
* console.assert(index.href === new URL('./dist/index.html', repoUrl).href)
|
||||
* ```
|
||||
*/
|
||||
export function getIndexUrl(baseUrl: URL): URL {
|
||||
if (baseUrl.pathname.endsWith('./dist/')) {
|
||||
return new URL('./index.html', baseUrl)
|
||||
}
|
||||
return new URL('./README.md', baseUrl)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get portfolio source URL from request URL.
|
||||
*
|
||||
* @param filePath request pathname of the file.
|
||||
* @param baseUrl Repository base url.
|
||||
* @returns URL of the source file.
|
||||
*
|
||||
* @example Basic WYSIWYG index
|
||||
* ```ts
|
||||
* import { getRepoUrl, getSourceUrl } from './url_utils.ts'
|
||||
*
|
||||
* const repoUrl = getRepoUrl('john.doe')
|
||||
* const index = getSourceUrl('/', repoUrl)
|
||||
* const file = getSourceUrl('/dir/path/file.any', repoUrl)
|
||||
*
|
||||
* console.assert(index.href === new URL('./README.md', repoUrl).href)
|
||||
* console.assert(file.href === new URL('./dir/path/file.any', repoUrl).href)
|
||||
* ```
|
||||
*
|
||||
* @example Generated index
|
||||
* ```ts
|
||||
* import { getRepoUrl, getSourceUrl } from './url_utils.ts'
|
||||
*
|
||||
* const repoUrl = getRepoUrl('john.doe')
|
||||
* const baseUrl = new URL('./dist/', repoUrl)
|
||||
* const index = getSourceUrl('/', baseUrl)
|
||||
* const file = getSourceUrl('/dir/path/file.any', baseUrl)
|
||||
*
|
||||
* console.assert(index.href === new URL('./dist/index.html', repoUrl).href)
|
||||
* console.assert(file.href === new URL('./dist/dir/path/file.any', repoUrl).href)
|
||||
* ```
|
||||
*/
|
||||
export function getSourceUrl(filePath: string, baseUrl: URL): URL {
|
||||
if (filePath === '/') {
|
||||
return getIndexUrl(baseUrl)
|
||||
}
|
||||
|
||||
return new URL(filePath, baseUrl)
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine portfolio base URL from the repository structure.
|
||||
* Check the presence of `./dist/index.html` to return either `./dist/` either `./` as base path.
|
||||
*
|
||||
* @param user User login of owner of the portfolio.
|
||||
* @returns Portfolio base URL.
|
||||
*
|
||||
* @example Basic WYSIWYG index
|
||||
*
|
||||
* # Portfolio structure
|
||||
*
|
||||
* ```
|
||||
* /
|
||||
* ├── README.md
|
||||
* └── *
|
||||
* ```
|
||||
*
|
||||
* # Resolved pathname
|
||||
*
|
||||
* ```ts
|
||||
* import { getBaseUrl } from './url_utils.ts'
|
||||
*
|
||||
* const baseUrl = await getBaseUrl('john.doe')
|
||||
*
|
||||
* console.assert(baseUrl.pathname === '/')
|
||||
* ```
|
||||
*
|
||||
* @example Generated index
|
||||
*
|
||||
* # Portfolio structure
|
||||
*
|
||||
* ```
|
||||
* /
|
||||
* ├── dist
|
||||
* │ ├── index.html
|
||||
* │ └── *
|
||||
* └── *
|
||||
* ```
|
||||
*
|
||||
* # Resolved pathname
|
||||
*
|
||||
* ```ts
|
||||
* import { getBaseUrl } from './url_utils.ts'
|
||||
*
|
||||
* const baseUrl = await getBaseUrl('john.doe')
|
||||
*
|
||||
* console.assert(baseUrl.pathname === '/dist/')
|
||||
* ```
|
||||
*/
|
||||
export async function getBaseUrl(user: User): Promise<URL> {
|
||||
//TODO check network errors before last return
|
||||
const repoUrl = getRepoUrl(user)
|
||||
const response = await fetch(new URL('./dist/index.html', repoUrl))
|
||||
|
||||
if (response.ok) {
|
||||
return new URL('./dist/', repoUrl)
|
||||
}
|
||||
|
||||
return repoUrl
|
||||
}
|
Loading…
Reference in a new issue