UNPKG

expo-router

Version:

Expo Router is a file-based router for React Native and web applications.

50 lines 2.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSitemap = useSitemap; const react_1 = require("react"); const Route_1 = require("../Route"); const router_store_1 = require("../global-state/router-store"); const matchers_1 = require("../matchers"); const routeSegments = (route, parents) => [ ...parents, ...route.route.split('/'), ]; const routeHref = (route, parents) => '/' + routeSegments(route, parents) .map((segment) => { // add an extra layer of entropy to the url for deep dynamic routes if ((0, matchers_1.matchDynamicName)(segment)?.deep) { return segment + '/' + Date.now(); } // index must be erased but groups can be preserved. return segment === 'index' ? '' : segment; }) .filter(Boolean) .join('/'); const routeFilename = (route) => { const segments = route.contextKey.split('/'); // join last two segments for layout routes if (route.contextKey.match(/_layout\.[jt]sx?$/)) { return segments[segments.length - 2] + '/' + segments[segments.length - 1]; } const routeSegmentsCount = route.route.split('/').length; // Join the segment count in reverse order // This presents files without layout routes as children with all relevant segments. return segments.slice(-routeSegmentsCount).join('/'); }; const mapForRoute = (route, parents) => ({ contextKey: route.contextKey, filename: routeFilename(route), href: routeHref(route, parents), isInitial: route.initialRouteName === route.route, isInternal: route.internal ?? false, isGenerated: route.generated ?? false, children: [...route.children] .sort(Route_1.sortRoutes) .map((child) => mapForRoute(child, routeSegments(route, parents))), }); function useSitemap() { const sitemap = (0, react_1.useMemo)(() => (router_store_1.store.routeNode ? mapForRoute(router_store_1.store.routeNode, []) : null), [router_store_1.store.routeNode]); return sitemap; } //# sourceMappingURL=useSitemap.js.map