nuxt-kql
Version:
Kirby's Query Language API for Nuxt
69 lines (68 loc) • 1.74 kB
JavaScript
import { useNuxtApp, useRequestFetch, useRuntimeConfig } from "#imports";
import { hash } from "ohash";
import { joinURL } from "ufo";
import { createAuthHeader, getProxyPath, headersToObject } from "../utils.js";
export function $kirby(path, opts = {}) {
const nuxt = useNuxtApp();
const promiseMap = nuxt._pendingRequests ||= /* @__PURE__ */ new Map();
const {
query,
headers,
method,
body,
language,
cache = true,
...fetchOptions
} = opts;
const kql = useRuntimeConfig().public.kql;
if (language)
path = joinURL(language, path);
const key = `$kirby${hash([
path,
query,
method,
body,
language
])}`;
if ((nuxt.isHydrating || cache) && nuxt.payload.data[key])
return Promise.resolve(nuxt.payload.data[key]);
if (promiseMap.has(key))
return promiseMap.get(key);
const baseHeaders = headersToObject(headers);
const _serverFetchOptions = {
method: "POST",
body: {
path,
query,
headers: Object.keys(baseHeaders).length ? baseHeaders : void 0,
method,
body,
cache
}
};
const _clientFetchOptions = {
baseURL: kql.url,
query,
headers: {
...baseHeaders,
...createAuthHeader(kql)
},
method,
body
};
const request = useRequestFetch()(kql.client ? path : getProxyPath(key), {
...fetchOptions,
...kql.client ? _clientFetchOptions : _serverFetchOptions
}).then((response) => {
if (import.meta.server || cache)
nuxt.payload.data[key] = response;
promiseMap.delete(key);
return response;
}).catch((error) => {
nuxt.payload.data[key] = void 0;
promiseMap.delete(key);
throw error;
});
promiseMap.set(key, request);
return request;
}