next-drupal
Version:
Helpers for Next.js + Drupal.
154 lines (150 loc) • 4.33 kB
JavaScript
// src/deprecated/get-cache.ts
import NodeCache from "node-cache";
var cache = new NodeCache();
// src/deprecated/get-access-token.ts
var CACHE_KEY = "NEXT_DRUPAL_ACCESS_TOKEN";
async function getAccessToken() {
if (!process.env.DRUPAL_CLIENT_ID || !process.env.DRUPAL_CLIENT_SECRET) {
return null;
}
const cached = cache.get(CACHE_KEY);
if (cached?.access_token) {
return cached;
}
const basic = Buffer.from(
`${process.env.DRUPAL_CLIENT_ID}:${process.env.DRUPAL_CLIENT_SECRET}`
).toString("base64");
const response = await fetch(
`${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}/oauth/token`,
{
method: "POST",
headers: {
Authorization: `Basic ${basic}`,
"Content-Type": "application/x-www-form-urlencoded"
},
body: `grant_type=client_credentials`
}
);
if (!response.ok) {
throw new Error(response.statusText);
}
const result = await response.json();
cache.set(CACHE_KEY, result, result.expires_in);
return result;
}
// src/deprecated/utils.ts
import { Jsona } from "jsona";
import { stringify } from "qs";
var JSONAPI_PREFIX = process.env.DRUPAL_JSONAPI_PREFIX || "/jsonapi";
var dataFormatter = new Jsona();
function deserialize(body, options) {
if (!body) return null;
return dataFormatter.deserialize(body, options);
}
async function getJsonApiPathForResourceType(type, locale) {
const index = await getJsonApiIndex(locale);
return index?.links[type]?.href;
}
async function getJsonApiIndex(locale, options) {
const url = buildUrl(
locale ? `/${locale}${JSONAPI_PREFIX}` : `${JSONAPI_PREFIX}`
);
const response = await fetch(url.toString(), {
headers: locale || options ? await buildHeaders(options) : {
"Content-Type": "application/json"
}
});
if (!response.ok) {
throw new Error(response.statusText);
}
return await response.json();
}
function buildUrl(path, params) {
const url = new URL(
path.charAt(0) === "/" ? `${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}${path}` : path
);
if (params) {
url.search = stringify(params);
}
return url;
}
async function buildHeaders({
accessToken,
headers = {
"Content-Type": "application/json"
}
} = {}) {
if (process.env.UNSTABLE_DRUPAL_ACCESS_TOKEN) {
headers["Authorization"] = `Bearer ${process.env.UNSTABLE_DRUPAL_ACCESS_TOKEN}`;
return headers;
}
const token = accessToken || await getAccessToken();
if (token) {
headers["Authorization"] = `Bearer ${token.access_token}`;
}
return headers;
}
function getPathFromContext(context, prefix = "") {
let { slug } = context.params;
slug = Array.isArray(slug) ? slug.map((s) => encodeURIComponent(s)).join("/") : slug;
if (context.locale && context.locale !== context.defaultLocale) {
slug = `/${context.locale}/${slug}`;
}
return !slug ? process.env.DRUPAL_FRONT_PAGE : prefix ? `${prefix}/${slug}` : slug;
}
function syncDrupalPreviewRoutes(path) {
if (window && window.top !== window.self) {
window.parent.postMessage(
{ type: "NEXT_DRUPAL_ROUTE_SYNC", path },
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL
);
}
}
// src/deprecated/get-menu.ts
async function getMenu(name, options) {
options = {
deserialize: true,
...options
};
const localePrefix = options?.locale && options.locale !== options.defaultLocale ? `/${options.locale}` : "";
const url = buildUrl(`${localePrefix}/jsonapi/menu_items/${name}`);
const response = await fetch(url.toString(), {
headers: await buildHeaders(options)
});
if (!response.ok) {
throw new Error(response.statusText);
}
const data = await response.json();
const items = options.deserialize ? deserialize(data) : data;
const { items: tree } = buildMenuTree(items);
return {
items,
tree
};
}
function buildMenuTree(links, parent = "") {
if (!links?.length) {
return {
items: []
};
}
const children = links.filter((link) => link.parent === parent);
return children.length ? {
items: children.map((link) => ({
...link,
...buildMenuTree(links, link.id)
}))
} : {};
}
export {
getAccessToken,
deserialize,
getJsonApiPathForResourceType,
getJsonApiIndex,
buildUrl,
buildHeaders,
getPathFromContext,
syncDrupalPreviewRoutes,
getMenu
};
//# sourceMappingURL=chunk-EWSX567N.js.map