@elastic-suite/gally-admin-shared
Version:
Shared package for gally admin BO
57 lines (53 loc) • 1.7 kB
text/typescript
import { apiUrl } from '../constants'
import { Method } from '../types'
export function normalizeUrl(url = ''): string {
if (process.env.NEXT_PUBLIC_LOCAL) {
try {
const urlObj = new URL(url)
if (urlObj.origin === apiUrl) {
if (urlObj.pathname === '/') {
urlObj.pathname = '/index'
}
if (
urlObj.pathname &&
!urlObj.pathname.endsWith('.json') &&
!urlObj.pathname.endsWith('.jsonld')
) {
urlObj.pathname = `${urlObj.pathname}.json`
}
if (urlObj.pathname.endsWith('.jsonld')) {
urlObj.pathname = `${urlObj.pathname.slice(0, -7)}.json`
}
if (!urlObj.pathname.startsWith('/mocks')) {
urlObj.pathname = `/mocks${urlObj.pathname}`
}
url = urlObj.href
}
} catch (error) {
// in that case just silent and don't transform the URL
}
}
return url
}
export async function fetchJson<T extends object>(
url: string,
options: RequestInit = {}
): Promise<{ json: T; response: Response }> {
if (!options.method || options.method === Method.GET) {
url = normalizeUrl(url.toString())
}
const response = await fetch(url, options)
const json = response?.status !== 204 ? await response.json() : {}
return { json, response }
}
export async function fetchRaw(
url: string,
options: RequestInit = {}
): Promise<{ content: string; response: Response }> {
if (!options.method || options.method === Method.GET) {
url = normalizeUrl(url.toString())
}
const response = await fetch(url, options)
const content = response?.status !== 204 ? await response.text() : ''
return { content, response }
}