nuxt-kql
Version:
Kirby's Query Language API for Nuxt
51 lines (50 loc) • 1.59 kB
JavaScript
import { useNuxtApp, useRequestFetch, useRuntimeConfig } from "#imports";
import { hash } from "ohash";
import { createAuthHeader, getProxyPath, headersToObject } from "../utils.js";
export function $kql(query, opts = {}) {
const nuxt = useNuxtApp();
const promiseMap = nuxt._kirbyPromises ||= /* @__PURE__ */ new Map();
const { headers, language, cache = true, ...fetchOptions } = opts;
const kql = useRuntimeConfig().public.kql;
const key = `$kql${hash([query, 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),
...language && { "X-Language": language }
};
const _serverFetchOptions = {
method: "POST",
body: {
query,
cache,
headers: Object.keys(baseHeaders).length ? baseHeaders : void 0
}
};
const _clientFetchOptions = {
baseURL: kql.url,
method: "POST",
body: query,
headers: {
...baseHeaders,
...createAuthHeader(kql)
}
};
const request = useRequestFetch()(kql.client ? kql.prefix : 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;
}