next-drupal
Version:
Helpers for Next.js + Drupal.
179 lines (171 loc) • 5.63 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/navigation.ts
var navigation_exports = {};
__export(navigation_exports, {
useMenu: () => useMenu
});
module.exports = __toCommonJS(navigation_exports);
// src/deprecated/use-menu.ts
var import_router = require("next/router");
var import_react = require("react");
// src/deprecated/utils.ts
var import_jsona = require("jsona");
var import_qs = require("qs");
// src/deprecated/get-cache.ts
var import_node_cache = __toESM(require("node-cache"), 1);
var cache = new import_node_cache.default();
// 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
var JSONAPI_PREFIX = process.env.DRUPAL_JSONAPI_PREFIX || "/jsonapi";
var dataFormatter = new import_jsona.Jsona();
function deserialize(body, options) {
if (!body) return null;
return dataFormatter.deserialize(body, options);
}
function buildUrl(path, params) {
const url = new URL(
path.charAt(0) === "/" ? `${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}${path}` : path
);
if (params) {
url.search = (0, import_qs.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;
}
// 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)
}))
} : {};
}
// src/deprecated/use-menu.ts
function useMenu(name) {
const router = (0, import_router.useRouter)();
const [data, setData] = (0, import_react.useState)(null);
const [error, setError] = (0, import_react.useState)(null);
const [isLoading, setIsLoading] = (0, import_react.useState)(false);
(0, import_react.useEffect)(() => {
const fetchMenuItems = async () => {
setIsLoading(true);
try {
const data2 = await getMenu(name, {
locale: router.locale,
defaultLocale: router.defaultLocale
});
setData(data2);
setIsLoading(false);
} catch (error2) {
setError(error2);
setIsLoading(false);
}
};
fetchMenuItems();
}, [router.locale]);
return { ...data, error, isLoading };
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
useMenu
});
//# sourceMappingURL=navigation.cjs.map