Awesome
🌳 radix3
Lightweight and fast router for JavaScript based on Radix Tree.
This fork of unjs/radix3
adds functional matching ::function
to the base library.
Usage
Install package:
# npm
npm i @immobiliarelabs/radix3
# yarn
yarn add @immobiliarelabs/radix3
# pnpm
pnpm i @immobiliarelabs/radix3
Import:
// ESM
import { createRouter } from '@immobiliarelabs/radix3'
// CJS
const { createRouter } = require('@immobiliarelabs/radix3')
Create a router instance and insert routes:
const router = createRouter(/* options */)
router.insert('/path', { payload: 'this path' })
router.insert('/path/:name', { payload: 'named route' })
router.insert('/path/foo/**', { payload: 'wildcard route' })
router.insert('/path/foo/**:name', { payload: 'named wildcard route' })
*Match route to access matched data:
// { payload: 'this path' }
router.lookup('/path')
// { payload: 'named route', params: { name: 'fooval' } }
router.lookup('/path/fooval')
// { payload: 'wildcard route' }
router.lookup('/path/foo/bar/baz')
// null (no route matched for/)
router.lookup('/')
Methods
router.insert(path, data)
path
can be static or using :placeholder
s and **
for wildcard paths or else using ::functionName
for functional match.
The data
object will be returned on matching params. It should be an object like { handler }
and not containing reserved keyword params
.
router.lookup(path)
Returns matched data for path
with optional params
key if mached route using placeholders.
router.remove(path)
Remove route matching path
.
Options
You can initialize router instance with options:
const router = createRouter({
strictTrailingSlash: true,
routes: {
'/foo': {},
'/::len': {} // Matches all routes /<two length string>/
},
funcs: {
len: (str) => str.length === 2,
}
})
routes
: An object specifying initial routes to addstrictTrailingSlash
: By default router ignored trailing slash for matching and adding routes. When set totrue
, matching with trailing slash is different.funcs
: An object containing the functions used in the routesparseParameters
: By default this variable is set totrue
. When set tofalse
, theparams
attribute will not be present in the lookup function output object. Putting this parameter tofalse
increases the lookup performance by 3x for dynamic routes.
Route Matcher
Experimental feature: Behavior might change in a semver-minor release.
Creates a multi matcher from router tree that can match all routes matching path:
import { createRouter, toRouteMatcher } from 'radix3'
const router = createRouter({
routes: {
'/foo': { m: 'foo' }, // Matches /foo only
'/foo/**': { m: 'foo/**' }, // Matches /foo/<any>
'/foo/bar': { m: 'foo/bar' }, // Matches /foo/bar only
'/foo/bar/baz': { m: 'foo/bar/baz' }, // Matches /foo/bar/baz only
'/foo/*/baz': { m: 'foo/*/baz' } // Matches /foo/<any>/baz
},
funcs: {
len: (str) => str.length === 2,
}
})
const matcher = toRouteMatcher(router)
const matches = matcher.matchAll('/foo/bar/baz')
// [
// {
// "m": "foo/**",
// },
// {
// "m": "foo/*/baz",
// },
// {
// "m": "foo/bar/baz",
// },
// ]
Performance
See benchmark.
Powered Apps
@immobiliarelabs/radix3
is a fork of radix3 and @immobiliarelabs/radix3
was created by the amazing Node.js team at ImmobiliareLabs, the Tech dept of Immobiliare.it, the #1 real estate company in Italy.
We are currently using radix3 in our products as well as our internal toolings.
If you are using radix3 in production drop us a message.
Support & Contribute
Made with ❤️ by ImmobiliareLabs & Contributors
We'd love for you to contribute to radix3! If you have any questions on how to use radix3, bugs and enhancement please feel free to reach out by opening a GitHub Issue.
License
Based on original work of charlieduong94/radix-router
by Charlie Duong (MIT) and unjs/radix3
LICENSE
MIT - Made with ❤️
<!-- Badges -->