When we build a modern web app, it's common for us to end up with a lot of routes. Throughout our projects we implement links to those routes. When we need to change a route, however, updating each place in which we've created a link can be a frustrating process.
Path Manager aims to make this easier in your NextJS Apps using the App Router. That's right this does not work with the NextJS pages router. Path Manager will identify your app router directory and generate a central cache of all your route paths. These are stored in the following format:
{
label: string; // labels can be used as the display text for your links
path: (...args: (string | number)[]) => string; // returns the path to your route. Accepts arguments for dynamic routes, such as id references or slugs.
type: 'static' | 'dynamic'; // used internally to generate names and path generation
group?: string; // recognises group dirs like (auth) and ignores, but makes a record.
navs: string[]; // allows you to label paths according to nav lists you use. These nav lists can be generated via the API later.
}
To install the package, you can use npm or yarn:
npm i next-path-helper
or
yarn add next-path-helper
First, import the pathManager
:
// layout.tsx
import { pathManager } from "next-path-helper";
// Initial build of the path list
pathManager.buildPathList();
console.log("Paths:", pathManager.getPaths());
You may then choose to pass pathManager
to a context which wraps your project.
Adds a path to the path manager. You shouldn't need this.
pathManager.addPath(key: string, pathInfo: PathInfo): void
key
: The key for the path.pathInfo
: The information about the path.
Updates an existing path. If you're using watcher, this will be done automatically.
pathManager.updatePath(key: string, pathInfo: PathInfo): void
key
: The key for the path.pathInfo
: The information about the path.
Retrieves the path information for a given key. You can use this when adding a single link somewhere in your project.
pathManager.getPath(key: string): PathInfo | undefined
key
: The key of the path.
Retrieves all the paths managed by the path manager.
pathManager.getPaths(): Record<string, PathInfo>
Adds navigation links to a path.
pathManager.addNav(key: string, ...navs: string[]): void
key
: The key of the path.navs
: The navigation links to add.
pathManager.addPathsToNav(keys: string[], nav: string): void
keys
: An array of path keys.nav
: The navigation link to add.
This function finds each path by its key and adds the specified nav link to each path's navs
array. If a path key does not exist, an error message is logged.
Removes a navigation link from a path.
pathManager.removeNav(key: string, nav: string): void
key
: The key of the path.nav
: The navigation link to remove.
Retrieves a list of navigation links that match a keyword.
pathManager.getNavList(keyword: string): NavLink[]
keyword
: The keyword to match.
Creates a navigation list based on a specified order of keys.
pathManager.makeNavList(keys: string[]): NavLink[]
keys
: An array of path keys.
This function takes an array of path keys and returns an array of navigation links in the same order as the keys provided.
Builds the path list by locating the app directory and processing its subdirectories.
pathManager.buildPathList(): void
Here is an example usage of the PathManager
class:
import { pathManager } from "next-path-helper";
// Initial build of the path list
pathManager.buildPathList();
// Add navigation items to the path
pathManager.addNav("examplePath", "mainnav", "sidebar");
// Get specific path by key
const pathInfo = pathManager.getPath("examplePath");
console.log("Path Info:", pathInfo);
// Get all paths
const allPaths = pathManager.getPaths();
console.log("All Paths:", allPaths);
// Get paths with 'mainnav' in their navs array
const mainNavItems = pathManager.getNavList("mainnav");
console.log('Paths with "mainnav" in navs:', mainNavItems);
// Create a navigation list based on a specified order of keys
const customNavList = pathManager.makeNavList(["examplePath", "anotherPath"]);
console.log("Custom Navigation List:", customNavList);
// Remove navigation item from the path
pathManager.removeNav("examplePath", "sidebar");
console.log("Updated Path Info:", pathManager.getPath("examplePath"));
- Create a new file in the project root, along with your config files named
watch.js
. - Paste this code:
import { startPathWatcher } from "next-path-helper/dist/utils/watch.js";
if (process.env.NODE_ENV !== "production") {
startPathWatcher();
} else {
console.log("Watcher not started in production environment");
}
- Add a script into your package.json:
scripts {
"watch": "node watch.js",
}
- Open up a terminal and
npm run watch
My personal preference for using the package is to create a paths.ts
document in __lib
.
import { pathManager } from "next-path-helper";
export const {
addPath,
getPath,
getPaths,
getNavList,
makeNavList,
updatePath,
addNav,
addPathsToNav,
buildPathList,
} = pathManager;
addPathsToNav(["home", "about", "account"], "main");
export const navListOrdered = makeNavList(["home", "about", "account"]); // dictate the order of the links
export const navListUnordered = getNavList("main");
This project is licensed under the MIT License.