feat(SW-2863): Move contentstack router to trpc package * Add exports to packages and lint rule to prevent relative imports * Add env to trpc package * Add eslint to trpc package * Apply lint rules * Use direct imports from trpc package * Add lint-staged config to trpc * Move lang enum to common * Restructure trpc package folder structure * WIP first step * update internal imports in trpc * Fix most errors in scandic-web Just 100 left... * Move Props type out of trpc * Fix CategorizedFilters types * Move more schemas in hotel router * Fix deps * fix getNonContentstackUrls * Fix import error * Fix entry error handling * Fix generateMetadata metrics * Fix alertType enum * Fix duplicated types * lint:fix * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package * Fix broken imports * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package Approved-by: Linus Flood
124 lines
3.0 KiB
TypeScript
124 lines
3.0 KiB
TypeScript
import merge from "deepmerge"
|
|
import fetchRetry from "fetch-retry"
|
|
|
|
import { env } from "../../env/server"
|
|
|
|
import type { Endpoint } from "./endpoints"
|
|
|
|
export { endpoints } from "./endpoints"
|
|
|
|
interface RequestOptionsWithJSONBody
|
|
extends Omit<RequestInit, "body" | "method"> {
|
|
body?: Record<string, unknown>
|
|
}
|
|
|
|
interface RequestOptionsWithOutBody
|
|
extends Omit<RequestInit, "body" | "method"> {}
|
|
|
|
const defaultOptions: RequestInit = {
|
|
cache: "no-store",
|
|
headers: {
|
|
Accept: "application/json",
|
|
"Content-Type": "application/json",
|
|
},
|
|
mode: "cors",
|
|
}
|
|
|
|
const wrappedFetch = fetchRetry(fetch, {
|
|
retries: 2,
|
|
retryDelay: function (attempt) {
|
|
return Math.pow(2, attempt) * 150 // 150, 300, 600
|
|
},
|
|
})
|
|
|
|
export async function get(
|
|
endpoint: Endpoint,
|
|
options: RequestOptionsWithOutBody,
|
|
params = {}
|
|
) {
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
|
|
return wrappedFetch(url, {
|
|
...merge.all([defaultOptions, { method: "GET" }, options]),
|
|
signal: AbortSignal.timeout(15_000),
|
|
})
|
|
}
|
|
|
|
export async function patch(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(url, {
|
|
...merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "PATCH" },
|
|
requestOptions,
|
|
]),
|
|
signal: AbortSignal.timeout(30_000),
|
|
})
|
|
}
|
|
|
|
export async function post(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(url, {
|
|
...merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "POST" },
|
|
requestOptions,
|
|
]),
|
|
signal: AbortSignal.timeout(30_000),
|
|
})
|
|
}
|
|
|
|
export async function put(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(url, {
|
|
...merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "PUT" },
|
|
requestOptions,
|
|
]),
|
|
signal: AbortSignal.timeout(30_000),
|
|
})
|
|
}
|
|
|
|
export async function remove(
|
|
endpoint: Endpoint | `${Endpoint}/${string}`,
|
|
options: RequestOptionsWithJSONBody,
|
|
params = {}
|
|
) {
|
|
const { body, ...requestOptions } = options
|
|
const url = new URL(env.API_BASEURL)
|
|
url.pathname = endpoint
|
|
url.search = new URLSearchParams(params).toString()
|
|
return wrappedFetch(url, {
|
|
...merge.all([
|
|
defaultOptions,
|
|
{ body: JSON.stringify(body), method: "DELETE" },
|
|
requestOptions,
|
|
]),
|
|
signal: AbortSignal.timeout(30_000),
|
|
})
|
|
}
|