@maxlkatze/cms
Version:
A git based Nuxt Module CMS - zero effort, zero cost
67 lines (66 loc) • 1.97 kB
JavaScript
import { ref } from "vue";
import { useRouter } from "vue-router";
export const useRouteFinder = () => {
const router = useRouter();
const routes = ref([]);
const isLoading = ref(false);
const loadRoutes = () => {
try {
const routerRoutes = router.options.routes;
const filteredRouterRoutes = routerRoutes.filter((route) => {
const routeName = route.name?.toString() || "";
return !routeName.startsWith("katze-cms");
});
routes.value = filteredRouterRoutes.map((route) => ({
name: route.name?.toString() || route.path,
path: route.path,
slug: route.path.split("/").filter(Boolean).pop() || (route.name?.toString() || "").toLowerCase(),
component: route.component
}));
} catch (err) {
console.error("Failed to load routes:", err);
} finally {
isLoading.value = false;
}
return routes.value;
};
const findRouteBySlug = (slug) => {
if (routes.value.length === 0) {
loadRoutes();
}
return routes.value.find((route) => route.slug === slug);
};
const findRouteByPath = (path) => {
if (routes.value.length === 0) {
loadRoutes();
}
return routes.value.find((route) => route.path === path);
};
const getRoute = (pathOrSlug) => {
if (routes.value.length === 0) {
loadRoutes();
}
let route = routes.value.find((route2) => route2.path === pathOrSlug);
if (!route) {
route = routes.value.find((route2) => route2.slug === pathOrSlug);
}
return route;
};
const searchRoutes = (query) => {
if (!query) return routes.value;
const searchQuery = query.toLowerCase();
return routes.value.filter(
(route) => route.name.toLowerCase().includes(searchQuery) || route.path.toLowerCase().includes(searchQuery)
);
};
loadRoutes();
return {
routes,
isLoading,
loadRoutes,
findRouteBySlug,
findRouteByPath,
getRoute,
searchRoutes
};
};