compare-path
Version:
An easy-to-use package to detect if two URLs match each other by comparing their abstract paths
92 lines (74 loc) โข 2.48 kB
Markdown
An easy-to-use TypeScript utility to determine if two URL paths match based on a route shape pattern. Supports route parameters like :id and wildcards (**) for flexible path matching.
## โจ Features
๐ Match dynamic segments like /user/:id
๐ Support for wildcard segments with ** (e.g., /docs/**/edit)
๐งผ Automatic path normalization (//foo//bar/ โ foo/bar)
๐ก Type-safe route parameter extraction using TypeScript
๐ฆ Tiny and framework-agnostic
# ๐ฆ Installation
With **npm**
```sh
npm install compare-path
```
Or with **yarn**:
```sh
yarn add compare-path
```
Or with **pnpm**:
```sh
pnpm add compare-path
```
Or with **bun**
```sh
bun add compare-path
```
# ๐ง Usage
```ts
import { comparePath } from 'compare-path'
const [matched, params] = comparePath('/user/:id', '/user/42')
if (matched) {
console.log('Matched!', params) // { id: '42' }
} else {
console.log('Not matched.')
}
```
```ts
const [matched, params] = comparePath('/docs/**/edit', '/docs/api/v1/intro/edit')
if (matched) {
console.log(params.rest) // ['api', 'v1', 'intro']
}
```
Paths are automatically cleaned:
```ts
cleanPath('///foo//bar///') // โ 'foo/bar'
```
# ๐งฉ Type Safety
Leverages TypeScript to infer expected route parameters from the shape:
```ts
const [matched, params] = comparePath('/post/:postId/comment/:commentId', '/post/123/comment/456')
// params: { postId: string; commentId: string }
```
Returns:
- `[true, ExtractRouteParams<T>]` // if matched
- [false, null] // if not matched
Cleans a path by:
- Trimming whitespace.
- Removing leading/trailing slashes.
- Collapsing multiple slashes.
Infers the expected parameter names and types from a given shape string at compile time.
| Shape | Path | Params Result |
| ------------- | ----------------------- | ---------------------------------------- |
| /user/:id | /user/42 | { id: '42' } |
| /docs/**/edit | /docs/api/v1/intro/edit | { rest: ['api', 'v1', 'intro'] } |
| /a/:x/**/b/:y | /a/1/foo/bar/b/2 | { x: '1', y: '2', rest: ['foo', 'bar'] } |
MIT โ feel free to use, contribute, and share.