@llui/router

@llui/router

Router for LLui. Structured path matching with history and hash mode support.

pnpm add @llui/router

Usage

import { route, param, rest, createRouter, connectRouter } from '@llui/router'
import { div, a } from '@llui/dom'

// Define routes
const home = route([])
const search = route(['search'], (b) => b, ['q', 'page'])
const detail = route(['item', param('id')])
const docs = route(['docs', rest('path')])

// Create router
const router = createRouter({ home, search, detail, docs }, { mode: 'history' })

// Connect to effects system
const routing = connectRouter(router)

API

Route Definition

Function Description
route(segments, builder?, queryKeys?) Define a route with path segments and optional query keys
param(name) Named path parameter (e.g. /item/:id)
rest(name) Rest parameter capturing remaining path

Router

Function Description
createRouter(routes, config) Create router instance (history or hash mode)
connectRouter(router) Connect router to LLui effects, returns routing helpers

Routing Helpers (from connectRouter)

Method / Effect Description
.link(send, route, attrs, children) Render a navigation link with client-side routing
.listener(send) Popstate listener -- call in view() to react to URL changes
.handleEffect Effect handler plugin for navigate/push/replace effects
.push(route) Push navigation effect
.replace(route) Replace navigation effect
.back() Navigate back effect
.forward() Navigate forward effect
.scroll() Scroll restoration effect

Guards

Router guards let you block or redirect navigation. Pass beforeEnter and/or beforeLeave to connectRouter:

const routing = connectRouter(router, {
  // Called before entering a new route
  beforeEnter(to, from) {
    // Return void   -> allow
    // Return false  -> block
    // Return Route  -> redirect
  },
  // Called before leaving the current route
  beforeLeave(from, to) {
    // Return true  -> allow
    // Return false -> block
  },
})

Guards run in the effect handler and the popstate listener, keeping update() pure.

Auth guard

const routing = connectRouter(router, {
  beforeEnter(to) {
    if (to.page === 'admin' && !isLoggedIn()) {
      return { page: 'login' }
    }
  },
})

Unsaved changes guard

const routing = connectRouter(router, {
  beforeLeave(from) {
    if (from.page === 'editor' && hasUnsavedChanges()) {
      return confirm('Discard unsaved changes?')
    }
    return true
  },
})

License

MIT