UNPKG

nuxt-kql

Version:

Kirby's Query Language API for Nuxt

69 lines (68 loc) 1.74 kB
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; }