pathic
v0.1.4
Published
TypeScript library for URI path matching
Downloads
403
Maintainers
Readme
pathic
TypeScript library for URI path matching. Focused on a blend of efficiency and simplicity.
Features:
InferParams
type for deriving an object type from a path pattern.PathTemplate
type for creating a template literal type from a path pattern.compilePaths
for compiling an array of paths into a function that efficiently matches a path to an index in the array. Paths are sorted by specificity and parameters are parsed.buildPath
for turning a path pattern and an object of parameters into a string.parsePathParams
for returning an array of parameter names in the path.
Path patterns
Fixed routes
/foo
Only matches/foo
and takes precedence over all other patterns.Named parameters
/foo/:bar
Matches/foo/123
but not/foo/123/456
.Catch-all parameters
/foo/*bar
Matches any path starting with/foo/
but not/foo
.Unnamed catch-all parameters
/foo/*
Matches any path starting with/foo/
but the tail isn't included in the parsed parameter values. Only one unnamed catch-all parameter is allowed.
API
parsePathParams
Returns an array of parameter names in the path.
parsePathParams('/foo/:bar/*baz') // => ['bar', 'baz']
compilePaths
Compiles an array of paths into a function that matches a path to an index in the array. This function is order-independent, since it internally sorts the paths by specificity.
If your callback returns anything other than undefined
, matching stops and the result is returned. Otherwise, the next matching path is tried.
const routes = [
['/foo', () => 1],
['/foo/:bar', ({ bar }) => [2, bar]],
['/foo/*bar', ({ bar }) => [3, bar]],
['/foo/*bar/baz', ({ bar }) => [4, bar]],
]
const match = compilePaths(routes.map(([path]) => path))
const handle = (index: number, params: Record<string, string>) => {
const [, handler] = routes[index]
return handler(params)
}
match('/foo', handle) // => 1
match('/foo/bar', handle) // => [2, 'bar']
match('/foo/bar/baz', handle) // => [4, 'bar']
match('/foo/bar/bie', handle) // => [3, 'bar/bie']
match('/404', handle) // => undefined
buildPath
Turns a path and a params object into a string. If a parameter is an array, it is joined with slashes. If a parameter is missing, an error is thrown. Otherwise, the parameter is stringified.
buildPath('/foo/:bar', { bar: 'baz' }) // => '/foo/baz'
buildPath('/foo/:bar', { bar: ['bar', 'bie'] }) // => '/foo/bar/bie'
buildPath('/foo/:bar', { bar: undefined }) // => throws Error
Types
InferParams
Derive an object type from a path pattern.
InferParamsArray
Derive a tuple type, containing parameter values from a path pattern.
InferParamNames
Derive a tuple type, containing parameter names from a path pattern.
PathTemplate
Create a template literal type from a path pattern.