@budarin/use-route 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@
5
5
  Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
6
6
  версионирование — [Semantic Versioning](https://semver.org/lang/ru/).
7
7
 
8
+ ## [1.3.1] - 2025-01-30
9
+
10
+ ### Документация
11
+
12
+ Внесены не значимые правки в документацию.
13
+
8
14
  ## [1.3.0] - 2025-01-30
9
15
 
10
16
  ### Изменено
package/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  **Минимум кода. Максимум SPA-навигации.**
4
4
 
5
- Инфраструктурный хук для React. **Требует Navigation API и URLPattern** — работает только в браузерах и средах, где они есть (см. таблицу версий). Для same-document навигации (без перезагрузки) используется перехват события `navigate` и вызов `event.intercept()`. Без провайдеров, без контекста, без бизнес-логики.
5
+ Инфраструктурный хук для React. **Требует Navigation API и URLPattern** — работает только в браузерах и средах, где они есть (см. таблицу версий). Без провайдеров, без контекста, без бизнес-логики.
6
6
 
7
7
  **Сферы применения:**
8
8
 
9
- - **Чистая архитектура** — загрузка данных в use cases и сервисах, не в роутере; хук даёт только состояние маршрута и навигацию, без loaders и встроенной загрузки данных.
9
+ - **Чистая архитектура** — загрузка данных в use cases и сервисах, не в роутере; хук даёт только состояние маршрута и навигацию, без loaders и встроенной загрузки данных, без бизнес-логики.
10
10
  - **Динамическое дерево компонентов** — что рендерить определяется в рантайме по URL (`pathname`, `params`, `matched`), а не статичным деревом маршрутов. Подходит, когда маршруты зависят от ролей, фич-флагов, CMS или конфига с бэка.
11
11
  - **Иерархия URL без вложенных роутов** — плоская, графовая или условная структура путей; один паттерн (или PathMatcher) и проверка по `params` вместо вложенных `<Route>`.
12
12
  - **SPA по подпути** — приложение располагается не в корне домена, а по подпути (например `/app/`); глобальный `base` в конфиге и опция `base` в `navigate`/`replace` для переходов «вне» этого пути.
@@ -21,7 +21,7 @@
21
21
  [![bundle](https://img.shields.io/bundlephobia/minzip/@budarin/use-route)](https://bundlephobia.com/result?p=@budarin/use-route)
22
22
  [![GitHub](https://img.shields.io/github/license/budarin/use-route)](https://github.com/budarin/use-route)
23
23
 
24
- **Живое демо:** запуск в браузере без установки;.
24
+ **Живое демо:** запуск в браузере без установки.
25
25
 
26
26
  - [Open in StackBlitz](https://stackblitz.com/github/budarin/use-route/tree/master/demo)
27
27
  - [Open in CodeSandbox](https://codesandbox.io/p/sandbox/github/budarin/use-route/tree/master/demo)
@@ -30,13 +30,12 @@
30
30
 
31
31
  - ✅ **Динамическое дерево** — маршрутизация в рантайме по pathname/params, без статичного route tree
32
32
  - ✅ **Динамическая история** — при каждом `navigate`/`replace` выбирается `push` или `replace`
33
- - ✅ **Navigation API** — `navigation.navigate()`, `back()`, `forward()`, `traverseTo()`; для same-document (без перезагрузки) — перехват события `navigate` и вызов `event.intercept()`
34
- - ✅ **URLPattern** для парсинга `:params` (только актуальные браузеры и Node.js)
33
+ - ✅ **Navigation API** — `navigation.navigate()`, `back()`, `forward()`, `traverseTo()`
34
+ - ✅ **URLPattern** для парсинга `:params`
35
35
  - ✅ `useSyncExternalStore` — concurrent-safe, SSR-ready
36
36
  - ✅ `canGoBack(n)`, `canGoForward(n)` — точная проверка по истории
37
37
  - ✅ **LRU кэш URL** с настраиваемым лимитом (по умолчанию 50)
38
38
  - ✅ **O(1) поиск** `historyIndex` через Map
39
- - ✅ **Только актуальные браузеры и Node.js** (Navigation API + URLPattern), без fallback
40
39
  - ✅ **0 провайдеров** — просто `useRoute()`
41
40
  - ✅ **~4 kB** gzipped (исходный код; с минификацией в бандле меньше)
42
41
 
@@ -47,7 +46,7 @@
47
46
  - **Нужно декларативное дерево маршрутов** — хук не предоставляет `<Route>` / `<Routes>`; что рендерить, вы решаете в коде по `pathname`/`params`. Если важна именно декларативная вложенная структура маршрутов — используйте один из перечисленных роутеров.
48
47
  - **Нужны встроенные guards, redirects, lazy-роуты** — этого в пакете нет; реализуется в приложении поверх хука.
49
48
 
50
- В остальных случаях (современные браузеры, чистая архитектура, динамические маршруты, без loaders в роутере) пакет подходит.
49
+ В остальных случаях (современные браузеры, чистая архитектура, динамические маршруты) пакет подходит.
51
50
 
52
51
  ## 🚀 Быстрый старт
53
52
 
@@ -100,7 +99,9 @@ function App() {
100
99
  **Параметры:**
101
100
 
102
101
  - **`pattern`** (опционально) — строка-паттерн (URLPattern) или PathMatcher для парсинга `params` и `matched`.
103
- - **`options`** (опционально) — **`section`**: путь раздела под глобальным base (например `/dashboard`). `pathname` возвращается без префикса (глобальный base + section), `navigate(to)` по умолчанию добавляет к путям полный префикс (base + section). Комбинируется с глобальным `base` из `configureRouter`, не заменяет его. В компонентах раздела вызывайте `useRoute({ section: '/dashboard' })` и работайте с путями относительно раздела.
102
+ - **`options`** (опционально)
103
+
104
+ **`section`**: путь раздела под глобальным base (например `/dashboard`). `navigate(to)` по умолчанию добавляет к путям полный префикс (base + section). Комбинируется с глобальным `base` из `configureRouter`, не заменяет его. В компонентах раздела вызывайте `useRoute({ section: '/dashboard' })` и работайте с путями относительно раздела.
104
105
 
105
106
  **Возвращает:**
106
107
 
@@ -180,7 +181,7 @@ configureRouter({
180
181
 
181
182
  **`initialLocation`** — при SSR (нет `window`) хук не знает URL запроса. Задайте `initialLocation: request.url` (или полный URL страницы) один раз перед рендером запроса — тогда `pathname` и `searchParams` будут соответствовать запросу. На клиенте не используется. **По умолчанию задавать не нужно:** если на SSR `initialLocation` не задан, используется `'/'` (pathname и searchParams для корня).
182
183
 
183
- **Логгер:** тип `Logger` — объект с методами `trace`, `debug`, `info`, `warn`, `error` (как у `console`). Уровни: `LoggerLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error'`. Если не передан — используется `console`.
184
+ **`logger`** тип `Logger` — объект с методами `trace`, `debug`, `info`, `warn`, `error` (как у `console`). Уровни: `LoggerLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error'`. Если не передан — используется `console`.
184
185
 
185
186
  **`pattern` (опционально):** строка-шаблон пути (нативный **URLPattern**) или функция **PathMatcher**. См. ниже.
186
187
 
@@ -403,7 +404,7 @@ function UserPostsExample() {
403
404
 
404
405
  ### 8. Глобальный base (приложение по подпути, не в корне домена)
405
406
 
406
- Когда приложение располагается **не в корне домена**, а по подпути (например `https://example.com/app/` — все маршруты под `/app`), задайте в конфиге `base: '/app'`. Тогда `pathname` возвращается без префикса, а `navigate(to)` добавляет base к относительным путям. Для одноразового перехода «вне» этого пути (например на `/login`) используйте опцию `base` в `navigate` или `replace`: `navigate('/login', { base: '' })`.
407
+ Когда приложение располагается **не в корне домена**, а по подпути (например `https://example.com/app/` — все маршруты под `/app`), задайте в конфиге `base: '/app'`. Тогда `navigate(to)` добавляет base к относительным путям. Для одноразового перехода «вне» этого пути (например на `/login`) используйте опцию `base` в `navigate` или `replace`: `navigate('/login', { base: '' })`.
407
408
 
408
409
  ```tsx
409
410
  import { useRoute, configureRouter } from '@budarin/use-route';
@@ -434,7 +435,9 @@ function AppUnderBase() {
434
435
 
435
436
  ### 9. Section в хуке (options.section)
436
437
 
437
- Когда у приложения несколько разделов по своим подпутям (`/dashboard`, `/admin`, `/auth`), в компонентах раздела задайте **section**: вызовите `useRoute({ section: '/dashboard' })`. Тогда `pathname` возвращается без префикса раздела (срезаются глобальный base и section), а `navigate(to)` по умолчанию добавляет полный префикс (base + section). Переход в корень приложения (без секции): `navigate('/', { section: '' })`. Переход «вне» приложения: `navigate('/login', { base: '' })`.
438
+ Когда у приложения несколько разделов по своим подпутям (`/dashboard`, `/admin`, `/auth`), в компонентах раздела задайте **section**: вызовите `useRoute({ section: '/dashboard' })`. Тогда `navigate(to)` по умолчанию добавляет полный префикс (base + section). <br />
439
+ Переход в корень приложения (без секции): `navigate('/', { section: '' })`. <br />
440
+ Переход «вне» приложения: `navigate('/login', { base: '' })`.
438
441
 
439
442
  ```tsx
440
443
  import { useRoute } from '@budarin/use-route';
@@ -577,11 +580,10 @@ import 'urlpattern-polyfill';
577
580
  | Navigation API | 102+ | 109+ | 16.4+ | — |
578
581
  | URLPattern | 110+ | 115+ | 16.4+ | 23.8+ |
579
582
 
580
- Для same-document навигации (без перезагрузки) хук перехватывает событие `navigate` и вызывает `event.intercept()`. Fallback на среды без Navigation API или URLPattern нет.
581
583
 
582
584
  ## 🎛 Под капотом
583
585
 
584
- - **Navigation API:** подписка на события `navigate`, `currententrychange`; для same-origin навигации — перехват `navigate` и вызов `event.intercept()` (same-document без перезагрузки)
586
+ - **Navigation API:** подписка на события `navigate`, `currententrychange`; для same-origin навигации — перехват `navigate` и вызов `event.intercept()`
585
587
  - `useSyncExternalStore` на navigation события
586
588
  - LRU кэш parsed URL (настраиваемый лимит)
587
589
  - Map для O(1) поиска `historyIndex`
package/demo/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "@budarin/use-route": "^1.2.0",
12
+ "@budarin/use-route": "^1.3.0",
13
13
  "react": "^19.0.0",
14
14
  "react-dom": "^19.0.0"
15
15
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@budarin/use-route",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",