UNPKG

nuxt-kql

Version:

Kirby's Query Language API for Nuxt

51 lines (50 loc) 1.59 kB
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; }