express-page-registry
v0.1.1
Published
Bind Express routes to views and auto-register pages for nav & sitemap.
Downloads
109
Maintainers
Readme
express-page-registry
A tiny helper for Express that binds routes to views and automatically registers every page for easy navigation, sitemaps, or debugging.
✨ Features
- 🧩 Single function to bind a route and render a view.
- 🗂️ Keeps a central registry of all bound pages.
- 📜 Build dynamic nav menus or generate
sitemap.xml. - 🧠 Supports per-request locals via
getData(req, res). - 🧱 Framework-agnostic — works with any Express view engine (EJS, Pug, Handlebars, etc).
📦 Installation
npm i express-page-registry🚀 Quick Start
const path = require('path');
const express = require('express');
const { bind, registry } = require('express-page-registry');
const app = express();
const router = express.Router();
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// Example route
bind(router, {
route: '/',
view: 'home',
meta: { title: 'Home · MySite', description: 'Welcome to MySite!' },
nav: { label: 'Home', order: 1, visible: true },
getData: (req) => ({
user: req.user || null,
csrfToken: typeof req.csrfToken === 'function' ? req.csrfToken() : null,
message: 'Hello from express-page-registry!'
})
});
app.use(router);
// optional dev route to inspect registered pages
app.get('/_pages.json', (_req, res) => res.json(registry.all()));
app.listen(3000, () => console.log('🚀 http://localhost:3000'));🧠 API
bind(router, options)
Registers a page route and renders its view.
| Option | Type | Description |
|--------|------|-------------|
| route | string | The Express path (e.g. /about). |
| view | string | The template file name (e.g. home, about). |
| meta | object | Optional metadata (title, description, etc.). |
| nav | { label, order, visible } | Optional navigation info. |
| robots | { index: boolean } | Include in sitemap (default true). |
| getData(req, res) | function | Async or sync function returning per-request locals. |
| middleware | array | Optional Express middleware for this route. |
registry
The central store of all registered pages.
| Method | Description |
|--------|-------------|
| registry.all() | Returns all pages. |
| registry.publicPages() | Returns only pages with nav.visible = true. |
| registry.toSitemapXml(baseUrl) | Builds a simple XML sitemap string. |
| registry.reset() | Clears all pages (useful in tests). |
Example:
console.table(registry.all());💡 Example Directory
example/
├─ app.js
└─ views/
└─ home.ejsexample/app.js
const path = require('path');
const express = require('express');
const { bind } = require('express-page-registry');
const app = express();
const router = express.Router();
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
bind(router, {
route: '/',
view: 'home',
meta: { title: 'Home · Demo' },
getData: () => ({ message: 'Hello World!' })
});
app.use(router);
app.listen(3000, () => console.log('http://localhost:3000'));example/views/home.ejs
<!doctype html>
<html>
<head><title><%= title %></title></head>
<body>
<h1><%= message %></h1>
</body>
</html>🛠️ License
MIT © 2025 Michael Hulbert
https://github.com/CloseRange
