@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 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
  [![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
- **Живое демо:** запуск в браузере без установки; исходники в папке [demo/](https://github.com/budarin/use-route/tree/master/demo).
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
@@ -9,7 +9,7 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "@budarin/use-route": "workspace:*",
12
+ "@budarin/use-route": "^1.1.0",
13
13
  "react": "^19.0.0",
14
14
  "react-dom": "^19.0.0"
15
15
  },
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 base = pathname.startsWith('/base-demo') ? '/base-demo' : '';
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={base || '/'}
37
- className={pathname === (base || '/') ? 'active' : ''}
36
+ to={section || '/'}
37
+ className={pathname === (section || '/') ? 'active' : ''}
38
38
  title="Главная страница демо"
39
39
  >
40
40
  Главная
41
41
  </Link>
42
42
  <Link
43
- to={(base || '') + '/users'}
44
- className={pathname === (base || '') + '/users' ? 'active' : ''}
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={(base || '') + '/posts'}
51
- className={pathname.startsWith((base || '') + '/posts') ? 'active' : ''}
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={(base || '') + '/history'}
58
- className={pathname === (base || '') + '/history' ? 'active' : ''}
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={(base || '') + '/push-replace'}
65
- className={pathname.startsWith((base || '') + '/push-replace') ? 'active' : ''}
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={(base || '') + '/products/books/1'}
72
- className={pathname.startsWith((base || '') + '/products') ? 'active' : ''}
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
- {!base ? (
79
+ {!section ? (
78
80
  <Link
79
81
  to="/base-demo"
80
82
  className={pathname.startsWith('/base-demo') ? 'active' : ''}
81
- title="Раздел с префиксом в URL"
83
+ title="Раздел (section) в URL"
82
84
  >
83
- Раздел (base)
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>Раздел с префиксом (локальный base)</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
- приходит без префикса, а <code>navigate('/page1')</code> ведёт на{' '}
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
- нему добавлен префикс <code>/base-demo</code>).
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
- С другим base → /base-demo/profile (base: '/base-demo')
40
+ С опцией base → /base-demo/profile (base: '/base-demo')
41
41
  </button>
42
42
  </div>
43
43
  </div>
@@ -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">Раздел с префиксом (локальный base)</Link>
34
+ <Link to="/base-demo">Раздел (section)</Link>
35
35
  </div>
36
36
  </div>
37
37
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@budarin/use-route",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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