/** * Route Middleware * * Provides route-level middleware for cross-cutting concerns. */ import { Logger } from '../../core/logger.js'; /** * RouteMiddleware - Route middleware */ export class RouteMiddleware { constructor(name, middlewareFn) { this.name = name; this.middlewareFn = middlewareFn; } /** * Create a new RouteMiddleware */ static create(name, middlewareFn) { return new RouteMiddleware(name, middlewareFn); } /** * Execute middleware */ async execute(to, from, next, context = {}) { try { await this.middlewareFn(to, from, next, context); } catch (error) { Logger.error(`[RouteMiddleware] Middleware "${this.name}" error:`, error); next(false); // Block navigation } } } /** * Built-in middleware */ export const BuiltInMiddleware = { /** * Analytics middleware */ analytics: RouteMiddleware.create('analytics', async (to, from, next) => { // Track page view if (typeof window !== 'undefined' && window.analytics) { window.analytics.track('page_view', { path: to.path, title: to.title }); } next(); }), /** * Loading middleware */ loading: RouteMiddleware.create('loading', async (to, from, next) => { // Show loading indicator document.body.classList.add('route-loading'); next(); // Hide loading indicator after navigation setTimeout(() => { document.body.classList.remove('route-loading'); }, 100); }), /** * Scroll to top middleware */ scrollToTop: RouteMiddleware.create('scroll-to-top', async (to, from, next) => { next(); window.scrollTo({ top: 0, behavior: 'smooth' }); }) };