@budarin/use-route 1.1.0 → 1.1.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 +29 -0
- package/README.md +1 -1
- package/demo/package.json +1 -1
- package/demo/src/App.tsx +18 -16
- package/demo/src/pages/BaseDemo.tsx +4 -4
- package/demo/src/pages/Home.tsx +1 -1
- package/package.json +1 -1
- package/.github/workflows/ci.yml +0 -45
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# История изменений
|
|
2
|
+
|
|
3
|
+
Все значимые изменения в проекте описываются в этом файле.
|
|
4
|
+
|
|
5
|
+
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
|
|
6
|
+
версионирование — [Semantic Versioning](https://semver.org/lang/ru/).
|
|
7
|
+
|
|
8
|
+
## [1.1.1] - 2025-01-30
|
|
9
|
+
|
|
10
|
+
### Добавлено
|
|
11
|
+
|
|
12
|
+
- **section** в `UseRouteOptions`: путь подраздела под глобальным base (например `/dashboard`). `pathname` возвращается без этого префикса; `navigate(to)` добавляет глобальный base + section. Комбинируется с `configureRouter.base`, не заменяет его.
|
|
13
|
+
- **section** и **base** в `NavigateOptions`: переопределение section или полного base для одного перехода (например `navigate('/', { section: '' })` — в корень приложения, `navigate('/login', { base: '' })` — путь вне приложения).
|
|
14
|
+
- Демо-приложение в `demo/` (Vite + React): примеры section, base, push/replace, свой matcher.
|
|
15
|
+
- CI (GitHub Actions): проверка форматирования, типов, тесты и сборка при push в `master`.
|
|
16
|
+
|
|
17
|
+
### Изменено
|
|
18
|
+
|
|
19
|
+
- Эффективный base для маршрута при `useRoute({ section })` теперь `combineBases(globalBase, section)`; глобальный base больше не отбрасывается при заданном section.
|
|
20
|
+
- Формулировки в README и демо: единый термин **section** (убраны «префикс» и «локальный base» в тексте для пользователя).
|
|
21
|
+
|
|
22
|
+
## [1.0.0] - 2024-12-01
|
|
23
|
+
|
|
24
|
+
### Добавлено
|
|
25
|
+
|
|
26
|
+
- Первый релиз.
|
|
27
|
+
- Хук `useRoute(options?)`: `pathname`, `searchParams`, `navigate`, `replace`, `back`, `forward`, `canGoBack`, `canGoForward`, `state`, опционально `pattern` и параметры URL.
|
|
28
|
+
- `configureRouter(options)`: глобальные `base`, `logger`, `initialLocation` (SSR).
|
|
29
|
+
- Интеграция с Navigation API; запасной вариант для старых окружений.
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
[](https://bundlephobia.com/result?p=@budarin/use-route)
|
|
22
22
|
[](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)
|
package/demo/package.json
CHANGED
package/demo/src/App.tsx
CHANGED
|
@@ -11,7 +11,7 @@ import { BaseDemo } from './pages/BaseDemo';
|
|
|
11
11
|
|
|
12
12
|
function Nav() {
|
|
13
13
|
const { pathname, searchParams, back, forward, canGoBack, canGoForward } = useRoute();
|
|
14
|
-
const
|
|
14
|
+
const section = pathname.startsWith('/base-demo') ? '/base-demo' : '';
|
|
15
15
|
const urlPath = pathname + (searchParams.toString() ? '?' + searchParams.toString() : '');
|
|
16
16
|
|
|
17
17
|
return (
|
|
@@ -33,54 +33,56 @@ function Nav() {
|
|
|
33
33
|
</button>
|
|
34
34
|
<span style={{ width: '0.5rem' }} />
|
|
35
35
|
<Link
|
|
36
|
-
to={
|
|
37
|
-
className={pathname === (
|
|
36
|
+
to={section || '/'}
|
|
37
|
+
className={pathname === (section || '/') ? 'active' : ''}
|
|
38
38
|
title="Главная страница демо"
|
|
39
39
|
>
|
|
40
40
|
Главная
|
|
41
41
|
</Link>
|
|
42
42
|
<Link
|
|
43
|
-
to={(
|
|
44
|
-
className={pathname === (
|
|
43
|
+
to={(section || '') + '/users'}
|
|
44
|
+
className={pathname === (section || '') + '/users' ? 'active' : ''}
|
|
45
45
|
title="Параметры в URL: /users/123"
|
|
46
46
|
>
|
|
47
47
|
Пользователи
|
|
48
48
|
</Link>
|
|
49
49
|
<Link
|
|
50
|
-
to={(
|
|
51
|
-
className={pathname.startsWith((
|
|
50
|
+
to={(section || '') + '/posts'}
|
|
51
|
+
className={pathname.startsWith((section || '') + '/posts') ? 'active' : ''}
|
|
52
52
|
title="Параметры в строке запроса: ?page=2"
|
|
53
53
|
>
|
|
54
54
|
Посты
|
|
55
55
|
</Link>
|
|
56
56
|
<Link
|
|
57
|
-
to={(
|
|
58
|
-
className={pathname === (
|
|
57
|
+
to={(section || '') + '/history'}
|
|
58
|
+
className={pathname === (section || '') + '/history' ? 'active' : ''}
|
|
59
59
|
title="Назад / Вперёд по истории"
|
|
60
60
|
>
|
|
61
61
|
История
|
|
62
62
|
</Link>
|
|
63
63
|
<Link
|
|
64
|
-
to={(
|
|
65
|
-
className={
|
|
64
|
+
to={(section || '') + '/push-replace'}
|
|
65
|
+
className={
|
|
66
|
+
pathname.startsWith((section || '') + '/push-replace') ? 'active' : ''
|
|
67
|
+
}
|
|
66
68
|
title="Добавить или заменить запись в истории"
|
|
67
69
|
>
|
|
68
70
|
Push/Replace
|
|
69
71
|
</Link>
|
|
70
72
|
<Link
|
|
71
|
-
to={(
|
|
72
|
-
className={pathname.startsWith((
|
|
73
|
+
to={(section || '') + '/products/books/1'}
|
|
74
|
+
className={pathname.startsWith((section || '') + '/products') ? 'active' : ''}
|
|
73
75
|
title="Свой разбор пути (PathMatcher)"
|
|
74
76
|
>
|
|
75
77
|
Товары
|
|
76
78
|
</Link>
|
|
77
|
-
{!
|
|
79
|
+
{!section ? (
|
|
78
80
|
<Link
|
|
79
81
|
to="/base-demo"
|
|
80
82
|
className={pathname.startsWith('/base-demo') ? 'active' : ''}
|
|
81
|
-
title="Раздел
|
|
83
|
+
title="Раздел (section) в URL"
|
|
82
84
|
>
|
|
83
|
-
Раздел (
|
|
85
|
+
Раздел (section)
|
|
84
86
|
</Link>
|
|
85
87
|
) : (
|
|
86
88
|
<Link to="/">Выйти из раздела</Link>
|
|
@@ -8,18 +8,18 @@ export function BaseDemo() {
|
|
|
8
8
|
|
|
9
9
|
return (
|
|
10
10
|
<div className="demo-content">
|
|
11
|
-
<h1>Раздел
|
|
11
|
+
<h1>Раздел (section)</h1>
|
|
12
12
|
<p className="demo-lead">
|
|
13
13
|
Когда приложение живёт не в корне сайта, а в подпапке (например <code>/app/</code>),
|
|
14
14
|
можно задать <code>section: '/base-demo'</code>. Тогда внутри раздела{' '}
|
|
15
15
|
<code>pathname</code>
|
|
16
|
-
приходит без
|
|
16
|
+
приходит без пути раздела (section), а <code>navigate('/page1')</code> ведёт на{' '}
|
|
17
17
|
<code>/base-demo/page1</code>. Так удобно писать пути «относительно раздела». Ниже —
|
|
18
18
|
кнопки перехода внутри раздела и выход на главную.
|
|
19
19
|
</p>
|
|
20
20
|
<p>
|
|
21
21
|
Сейчас pathname внутри раздела: <code>{pathname || '/'}</code> (в полном адресе к
|
|
22
|
-
нему добавлен
|
|
22
|
+
нему добавлен section <code>/base-demo</code>).
|
|
23
23
|
</p>
|
|
24
24
|
<h2>Действия</h2>
|
|
25
25
|
<div className="demo-buttons">
|
|
@@ -37,7 +37,7 @@ export function BaseDemo() {
|
|
|
37
37
|
Вне приложения → /login (base: '')
|
|
38
38
|
</button>
|
|
39
39
|
<button type="button" onClick={() => navigate('/profile', { base: '/base-demo' })}>
|
|
40
|
-
С
|
|
40
|
+
С опцией base → /base-demo/profile (base: '/base-demo')
|
|
41
41
|
</button>
|
|
42
42
|
</div>
|
|
43
43
|
</div>
|
package/demo/src/pages/Home.tsx
CHANGED
|
@@ -31,7 +31,7 @@ export function Home() {
|
|
|
31
31
|
Push и Replace — как добавлять или заменять запись в истории
|
|
32
32
|
</button>
|
|
33
33
|
<Link to="/products/books/1">Товары — свой разбор пути (PathMatcher)</Link>
|
|
34
|
-
<Link to="/base-demo">Раздел
|
|
34
|
+
<Link to="/base-demo">Раздел (section)</Link>
|
|
35
35
|
</div>
|
|
36
36
|
</div>
|
|
37
37
|
);
|
package/package.json
CHANGED
package/.github/workflows/ci.yml
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [master]
|
|
6
|
-
paths:
|
|
7
|
-
- 'src/**'
|
|
8
|
-
- 'tests/**'
|
|
9
|
-
- 'package.json'
|
|
10
|
-
- 'pnpm-lock.yaml'
|
|
11
|
-
- 'tsconfig.json'
|
|
12
|
-
- 'vitest.config.ts'
|
|
13
|
-
- '.prettierrc'
|
|
14
|
-
- '.prettierignore'
|
|
15
|
-
- '.github/workflows/**'
|
|
16
|
-
|
|
17
|
-
jobs:
|
|
18
|
-
check:
|
|
19
|
-
runs-on: ubuntu-latest
|
|
20
|
-
steps:
|
|
21
|
-
- uses: actions/checkout@v4
|
|
22
|
-
|
|
23
|
-
- uses: pnpm/action-setup@v4
|
|
24
|
-
with:
|
|
25
|
-
version: 9
|
|
26
|
-
|
|
27
|
-
- uses: actions/setup-node@v4
|
|
28
|
-
with:
|
|
29
|
-
node-version: '20'
|
|
30
|
-
cache: 'pnpm'
|
|
31
|
-
|
|
32
|
-
- name: Установка зависимостей
|
|
33
|
-
run: pnpm install --frozen-lockfile
|
|
34
|
-
|
|
35
|
-
- name: Lint
|
|
36
|
-
run: pnpm lint
|
|
37
|
-
|
|
38
|
-
- name: Type-check
|
|
39
|
-
run: pnpm type-check
|
|
40
|
-
|
|
41
|
-
- name: Тесты
|
|
42
|
-
run: pnpm test:run
|
|
43
|
-
|
|
44
|
-
- name: Сборка
|
|
45
|
-
run: pnpm build
|