@budarin/use-route 1.3.4 → 1.4.0
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 +23 -3
- package/README.md +10 -10
- package/demo/node_modules/.vite/deps/@budarin_use-route.js +186 -152
- package/demo/node_modules/.vite/deps/@budarin_use-route.js.map +3 -3
- package/demo/node_modules/.vite/deps/_metadata.json +10 -10
- package/demo/package.json +1 -1
- package/demo/src/App.tsx +17 -5
- package/demo/src/index.css +37 -0
- package/demo/src/pages/PushReplace.tsx +3 -1
- package/demo/src/pages/State.tsx +6 -2
- package/dist/index.d.ts +2 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -68
- package/dist/index.js.map +1 -1
- package/dist/native-api-types.d.ts +0 -7
- package/dist/native-api-types.d.ts.map +1 -1
- package/dist/native-api-types.js +0 -7
- package/dist/native-api-types.js.map +1 -1
- package/dist/types.d.ts +5 -43
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -17
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,26 @@
|
|
|
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.4.0] - 2025-02-01
|
|
9
|
+
|
|
10
|
+
### Изменено (Breaking)
|
|
11
|
+
|
|
12
|
+
- **Переименование API:** все сущности с именем «Router» заменены на «Route» (приведение к названию пакета use-route).
|
|
13
|
+
- `configureRouter` → **`configureRoute`**
|
|
14
|
+
- `getRouterConfig` → **`getRouteConfig`** (внутренний)
|
|
15
|
+
- `clearRouterCaches` → **`clearRouteCaches`**
|
|
16
|
+
- тип `RouterState` → **`RouteState`**
|
|
17
|
+
- тип `RouterConfig` → **`RouteConfig`**
|
|
18
|
+
- В демо компонент `Router` переименован в **`RouteView`**.
|
|
19
|
+
|
|
20
|
+
### Миграция
|
|
21
|
+
|
|
22
|
+
Замените в коде вызовы и импорты:
|
|
23
|
+
|
|
24
|
+
- `configureRouter({ ... })` → `configureRoute({ ... })`
|
|
25
|
+
- `clearRouterCaches()` → `clearRouteCaches()`
|
|
26
|
+
- при использовании типов: `RouterState` → `RouteState`, `RouterConfig` → `RouteConfig`
|
|
27
|
+
|
|
8
28
|
## [1.3.4] - 2025-02-01
|
|
9
29
|
|
|
10
30
|
### Изменено
|
|
@@ -21,7 +41,7 @@
|
|
|
21
41
|
|
|
22
42
|
### Изменено
|
|
23
43
|
|
|
24
|
-
- **useRoute:** в зависимостях финального `useMemo` вместо перечисления полей `
|
|
44
|
+
- **useRoute:** в зависимостях финального `useMemo` вместо перечисления полей `routeState` (location, pathname, searchParams, params, historyIndex, state, matched) используется один объект `routeState`. Поведение не меняется: ссылка на `routeState` обновляется только при изменении этих данных.
|
|
25
45
|
|
|
26
46
|
## [1.3.2] - 2025-01-31
|
|
27
47
|
|
|
@@ -50,7 +70,7 @@
|
|
|
50
70
|
|
|
51
71
|
### Добавлено
|
|
52
72
|
|
|
53
|
-
- **section** в `UseRouteOptions`: путь подраздела под глобальным base (например `/dashboard`). `pathname` возвращается без этого префикса; `navigate(to)` добавляет глобальный base + section. Комбинируется с `
|
|
73
|
+
- **section** в `UseRouteOptions`: путь подраздела под глобальным base (например `/dashboard`). `pathname` возвращается без этого префикса; `navigate(to)` добавляет глобальный base + section. Комбинируется с `configureRoute.base`, не заменяет его.
|
|
54
74
|
- **section** и **base** в `NavigateOptions`: переопределение section или полного base для одного перехода (например `navigate('/', { section: '' })` — в корень приложения, `navigate('/login', { base: '' })` — путь вне приложения).
|
|
55
75
|
- Демо-приложение в `demo/` (Vite + React): примеры section, base, push/replace, свой matcher.
|
|
56
76
|
- CI (GitHub Actions): проверка форматирования, типов, тесты и сборка при push в `master`.
|
|
@@ -66,5 +86,5 @@
|
|
|
66
86
|
|
|
67
87
|
- Первый релиз.
|
|
68
88
|
- Хук `useRoute(options?)`: `pathname`, `searchParams`, `navigate`, `replace`, `back`, `forward`, `canGoBack`, `canGoForward`, `state`, опционально `pattern` и параметры URL.
|
|
69
|
-
- `
|
|
89
|
+
- `configureRoute(options)`: глобальные `base`, `logger`, `initialLocation` (SSR).
|
|
70
90
|
- Интеграция с Navigation API; запасной вариант для старых окружений.
|
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ npm i @budarin/use-route
|
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
```typescript
|
|
60
|
-
import { useRoute,
|
|
60
|
+
import { useRoute, configureRoute } from '@budarin/use-route';
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
function App() {
|
|
@@ -103,7 +103,7 @@ function App() {
|
|
|
103
103
|
- **`pattern`** (опционально) — строка-паттерн (URLPattern) или PathMatcher для парсинга `params` и `matched`.
|
|
104
104
|
- **`options`** (опционально)
|
|
105
105
|
|
|
106
|
-
**`section`**: путь раздела под глобальным base (например `/dashboard`). `navigate(to)` по умолчанию добавляет к путям полный префикс (base + section). Комбинируется с глобальным `base` из `
|
|
106
|
+
**`section`**: путь раздела под глобальным base (например `/dashboard`). `navigate(to)` по умолчанию добавляет к путям полный префикс (base + section). Комбинируется с глобальным `base` из `configureRoute`, не заменяет его. В компонентах раздела вызывайте `useRoute({ section: '/dashboard' })` и работайте с путями относительно раздела.
|
|
107
107
|
|
|
108
108
|
**Возвращает:**
|
|
109
109
|
|
|
@@ -134,7 +134,7 @@ function App() {
|
|
|
134
134
|
|
|
135
135
|
```typescript
|
|
136
136
|
{
|
|
137
|
-
history?: 'push' | 'replace' | 'auto'; // по умолчанию из
|
|
137
|
+
history?: 'push' | 'replace' | 'auto'; // по умолчанию из configureRoute или 'auto'
|
|
138
138
|
state?: unknown; // опциональные данные перехода (только подсказки для UX); подробнее — раздел про state ниже
|
|
139
139
|
base?: string; // полная подстановка префикса для этого вызова: '' или '/' — без префикса (другое приложение); иначе — полный путь (напр. '/auth')
|
|
140
140
|
section?: string; // переопределение секции для этого вызова: '' — корень приложения (только global base); '/path' — другая секция
|
|
@@ -172,10 +172,10 @@ function App() {
|
|
|
172
172
|
|
|
173
173
|
**Итог.** State в истории — опциональный инструмент для «передать что-то вместе с переходом», когда это улучшение, а не требование. Если сомневаетесь — можно не использовать; в большинстве приложений достаточно pathname, query и запросов к API.
|
|
174
174
|
|
|
175
|
-
**`
|
|
175
|
+
**`configureRoute(config)`** — глобальная настройка один раз при старте приложения:
|
|
176
176
|
|
|
177
177
|
```typescript
|
|
178
|
-
|
|
178
|
+
configureRoute({
|
|
179
179
|
urlCacheLimit: 50, // лимит LRU-кэша URL (по умолчанию 50)
|
|
180
180
|
defaultHistory: 'replace', // history по умолчанию для всех navigate()
|
|
181
181
|
logger: myLogger, // логгер (дефолт: console)
|
|
@@ -442,8 +442,8 @@ function UserPostsExample() {
|
|
|
442
442
|
Когда приложение располагается **не в корне домена**, а по подпути (например `https://example.com/app/` — все маршруты под `/app`), задайте в конфиге `base: '/app'`. Тогда `navigate(to)` добавляет base к относительным путям. Для одноразового перехода «вне» этого пути (например на `/login`) используйте опцию `base` в `navigate` или `replace`: `navigate('/login', { base: '' })`.
|
|
443
443
|
|
|
444
444
|
```tsx
|
|
445
|
-
import { useRoute,
|
|
446
|
-
|
|
445
|
+
import { useRoute, configureRoute } from '@budarin/use-route';
|
|
446
|
+
configureRoute({ base: '/app' });
|
|
447
447
|
|
|
448
448
|
function AppUnderBase() {
|
|
449
449
|
const { pathname, navigate } = useRoute();
|
|
@@ -511,13 +511,13 @@ function DashboardSection() {
|
|
|
511
511
|
|
|
512
512
|
```tsx
|
|
513
513
|
// Серверный обработчик (псевдокод: Express, Fastify, Next и т.д.)
|
|
514
|
-
import {
|
|
514
|
+
import { configureRoute } from '@budarin/use-route';
|
|
515
515
|
import { renderToStaticMarkup } from 'react-dom/server';
|
|
516
516
|
import { App } from './App';
|
|
517
517
|
|
|
518
518
|
function handleRequest(req, res) {
|
|
519
519
|
// Один раз перед рендером этого запроса
|
|
520
|
-
|
|
520
|
+
configureRoute({ initialLocation: req.url });
|
|
521
521
|
|
|
522
522
|
const html = renderToStaticMarkup(<App />);
|
|
523
523
|
res.send(html);
|
|
@@ -623,7 +623,7 @@ import 'urlpattern-polyfill';
|
|
|
623
623
|
- LRU кэш parsed URL (настраиваемый лимит)
|
|
624
624
|
- Map для O(1) поиска `historyIndex`
|
|
625
625
|
- URLPattern для `:params`
|
|
626
|
-
- Кэш compiled patterns; `
|
|
626
|
+
- Кэш compiled patterns; `clearRouteCaches()` — очистка кэшей (тесты, смена окружения)
|
|
627
627
|
- SSR-safe (checks `typeof window`)
|
|
628
628
|
|
|
629
629
|
## 🤝 Лицензия
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
require_react
|
|
4
4
|
} from "./chunk-3SNVYWQ3.js";
|
|
5
5
|
|
|
6
|
-
// ../node_modules/.pnpm/@budarin+use-route@1.3.
|
|
6
|
+
// ../node_modules/.pnpm/@budarin+use-route@1.3.4/node_modules/@budarin/use-route/dist/types.js
|
|
7
7
|
var routerConfig = {
|
|
8
8
|
urlCacheLimit: 50
|
|
9
9
|
};
|
|
@@ -17,7 +17,7 @@ function getLogger() {
|
|
|
17
17
|
return routerConfig.logger ?? console;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
// ../node_modules/.pnpm/@budarin+use-route@1.3.
|
|
20
|
+
// ../node_modules/.pnpm/@budarin+use-route@1.3.4/node_modules/@budarin/use-route/dist/index.js
|
|
21
21
|
var import_react = __toESM(require_react());
|
|
22
22
|
var isBrowser = typeof window !== "undefined";
|
|
23
23
|
function isValidUrl(url) {
|
|
@@ -95,8 +95,19 @@ function getNavigation() {
|
|
|
95
95
|
return typeof window !== "undefined" && "navigation" in window ? window.navigation : void 0;
|
|
96
96
|
}
|
|
97
97
|
function computeNavigationSnapshot(nav) {
|
|
98
|
-
if (!nav)
|
|
98
|
+
if (!nav) {
|
|
99
|
+
if (!isBrowser) {
|
|
100
|
+
const urlStr2 = getRouterConfig().initialLocation ?? "/";
|
|
101
|
+
const parsed2 = getCachedParsedUrl(urlStr2);
|
|
102
|
+
return {
|
|
103
|
+
...DEFAULT_SNAPSHOT,
|
|
104
|
+
urlStr: urlStr2,
|
|
105
|
+
pathname: parsed2.pathname,
|
|
106
|
+
searchParams: parsed2.searchParams
|
|
107
|
+
};
|
|
108
|
+
}
|
|
99
109
|
return DEFAULT_SNAPSHOT;
|
|
110
|
+
}
|
|
100
111
|
const entry = nav.currentEntry;
|
|
101
112
|
const urlStr = entry?.url ?? (isBrowser ? window.location.href : "/");
|
|
102
113
|
const parsed = getCachedParsedUrl(urlStr);
|
|
@@ -112,7 +123,7 @@ function computeNavigationSnapshot(nav) {
|
|
|
112
123
|
state
|
|
113
124
|
};
|
|
114
125
|
}
|
|
115
|
-
var sharedSnapshot =
|
|
126
|
+
var sharedSnapshot = computeNavigationSnapshot(getNavigation());
|
|
116
127
|
var storeCallbacks = /* @__PURE__ */ new Set();
|
|
117
128
|
var unsubscribeNavigation = null;
|
|
118
129
|
function subscribeToNavigation(callback) {
|
|
@@ -120,6 +131,7 @@ function subscribeToNavigation(callback) {
|
|
|
120
131
|
if (storeCallbacks.size === 1) {
|
|
121
132
|
const nav = getNavigation();
|
|
122
133
|
if (nav) {
|
|
134
|
+
sharedSnapshot = computeNavigationSnapshot(nav);
|
|
123
135
|
const interceptListener = (event) => {
|
|
124
136
|
const navEvent = event;
|
|
125
137
|
if (!navEvent.canIntercept || !isBrowser)
|
|
@@ -154,35 +166,18 @@ function subscribeToNavigation(callback) {
|
|
|
154
166
|
unsubscribeNavigation();
|
|
155
167
|
unsubscribeNavigation = null;
|
|
156
168
|
}
|
|
157
|
-
sharedSnapshot = null;
|
|
158
|
-
noNavSnapshot = null;
|
|
159
|
-
noNavSnapshotUrl = null;
|
|
160
169
|
}
|
|
161
170
|
};
|
|
162
171
|
}
|
|
163
|
-
var noNavSnapshot = null;
|
|
164
|
-
var noNavSnapshotUrl = null;
|
|
165
172
|
function getNavigationSnapshot() {
|
|
166
|
-
if (sharedSnapshot !== null)
|
|
167
|
-
return sharedSnapshot;
|
|
168
173
|
const nav = getNavigation();
|
|
169
|
-
if (nav) {
|
|
170
|
-
|
|
171
|
-
|
|
174
|
+
if (storeCallbacks.size === 0 && nav) {
|
|
175
|
+
const currentUrl = nav.currentEntry?.url ?? (isBrowser ? window.location.href : "/");
|
|
176
|
+
if (currentUrl !== sharedSnapshot.urlStr) {
|
|
177
|
+
sharedSnapshot = computeNavigationSnapshot(nav);
|
|
178
|
+
}
|
|
172
179
|
}
|
|
173
|
-
|
|
174
|
-
if (noNavSnapshot !== null && noNavSnapshotUrl === urlStr)
|
|
175
|
-
return noNavSnapshot;
|
|
176
|
-
const parsed = getCachedParsedUrl(urlStr);
|
|
177
|
-
noNavSnapshotUrl = urlStr;
|
|
178
|
-
noNavSnapshot = {
|
|
179
|
-
...DEFAULT_SNAPSHOT,
|
|
180
|
-
urlStr,
|
|
181
|
-
pathname: parsed.pathname,
|
|
182
|
-
searchParams: parsed.searchParams,
|
|
183
|
-
state: isBrowser ? window.history.state : void 0
|
|
184
|
-
};
|
|
185
|
-
return noNavSnapshot;
|
|
180
|
+
return sharedSnapshot;
|
|
186
181
|
}
|
|
187
182
|
var lastEntriesKeysRef = null;
|
|
188
183
|
var lastKeyToIndexMap = null;
|
|
@@ -215,8 +210,159 @@ function clearRouterCaches() {
|
|
|
215
210
|
URL_CACHE.clear();
|
|
216
211
|
lastEntriesKeysRef = null;
|
|
217
212
|
lastKeyToIndexMap = null;
|
|
218
|
-
|
|
219
|
-
|
|
213
|
+
sharedSnapshot = computeNavigationSnapshot(getNavigation());
|
|
214
|
+
}
|
|
215
|
+
function globalBack() {
|
|
216
|
+
try {
|
|
217
|
+
const nav = getNavigation();
|
|
218
|
+
if (nav)
|
|
219
|
+
nav.back();
|
|
220
|
+
} catch (error) {
|
|
221
|
+
getLogger().error("[useRoute] Back navigation error:", error);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function globalForward() {
|
|
225
|
+
try {
|
|
226
|
+
const nav = getNavigation();
|
|
227
|
+
if (nav)
|
|
228
|
+
nav.forward();
|
|
229
|
+
} catch (error) {
|
|
230
|
+
getLogger().error("[useRoute] Forward navigation error:", error);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function globalUpdateState(state) {
|
|
234
|
+
try {
|
|
235
|
+
const nav = getNavigation();
|
|
236
|
+
if (nav) {
|
|
237
|
+
nav.updateCurrentEntry({ state });
|
|
238
|
+
sharedSnapshot = computeNavigationSnapshot(nav);
|
|
239
|
+
storeCallbacks.forEach((cb) => cb());
|
|
240
|
+
} else {
|
|
241
|
+
getLogger().warn("[useRoute] updateState requires Navigation API");
|
|
242
|
+
}
|
|
243
|
+
} catch (error) {
|
|
244
|
+
getLogger().error("[useRoute] updateState error:", error);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
var navigateCache = /* @__PURE__ */ new Map();
|
|
248
|
+
function getNavigateForBase(effectiveBase) {
|
|
249
|
+
const cacheKey = effectiveBase ?? "__root__";
|
|
250
|
+
let cachedNavigate = navigateCache.get(cacheKey);
|
|
251
|
+
if (!cachedNavigate) {
|
|
252
|
+
cachedNavigate = async (to, navOptions = {}) => {
|
|
253
|
+
let targetUrl = typeof to === "string" ? to : to.toString();
|
|
254
|
+
let baseForCall;
|
|
255
|
+
if (navOptions.base !== void 0) {
|
|
256
|
+
baseForCall = navOptions.base === "" || navOptions.base === "/" ? void 0 : navOptions.base;
|
|
257
|
+
} else if (navOptions.section !== void 0) {
|
|
258
|
+
baseForCall = combineBases(getRouterConfig().base, navOptions.section);
|
|
259
|
+
} else {
|
|
260
|
+
baseForCall = effectiveBase;
|
|
261
|
+
}
|
|
262
|
+
if (baseForCall && baseForCall !== "/" && typeof to === "string" && to.startsWith("/") && !to.startsWith("//") && !to.includes(":")) {
|
|
263
|
+
targetUrl = baseForCall + (to === "/" ? "" : to);
|
|
264
|
+
}
|
|
265
|
+
if (!isValidUrl(targetUrl)) {
|
|
266
|
+
getLogger().warn("[useRoute] Invalid URL rejected:", targetUrl);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const nav = getNavigation();
|
|
270
|
+
if (!nav) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const defaultHistory = getRouterConfig().defaultHistory ?? "auto";
|
|
274
|
+
const navigationOpts = {
|
|
275
|
+
state: navOptions.state,
|
|
276
|
+
history: navOptions.history ?? defaultHistory
|
|
277
|
+
};
|
|
278
|
+
try {
|
|
279
|
+
await nav.navigate(targetUrl, navigationOpts);
|
|
280
|
+
} catch (error) {
|
|
281
|
+
getLogger().error("[useRoute] Navigation error:", error);
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
navigateCache.set(cacheKey, cachedNavigate);
|
|
285
|
+
}
|
|
286
|
+
return cachedNavigate;
|
|
287
|
+
}
|
|
288
|
+
var replaceCache = /* @__PURE__ */ new Map();
|
|
289
|
+
function getReplaceForBase(effectiveBase) {
|
|
290
|
+
const cacheKey = effectiveBase ?? "__root__";
|
|
291
|
+
let cachedReplace = replaceCache.get(cacheKey);
|
|
292
|
+
if (!cachedReplace) {
|
|
293
|
+
const navigateFn = getNavigateForBase(effectiveBase);
|
|
294
|
+
cachedReplace = (to, options) => navigateFn(to, { ...options, history: "replace" });
|
|
295
|
+
replaceCache.set(cacheKey, cachedReplace);
|
|
296
|
+
}
|
|
297
|
+
return cachedReplace;
|
|
298
|
+
}
|
|
299
|
+
function globalGo(delta) {
|
|
300
|
+
if (delta === Infinity || delta === -Infinity) {
|
|
301
|
+
getLogger().warn("[useRoute] Delta value too large:", delta);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (!Number.isFinite(delta) || delta === 0)
|
|
305
|
+
return;
|
|
306
|
+
if (delta > Number.MAX_SAFE_INTEGER || delta < -Number.MAX_SAFE_INTEGER) {
|
|
307
|
+
getLogger().warn("[useRoute] Delta value too large:", delta);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const nav = getNavigation();
|
|
311
|
+
if (!nav)
|
|
312
|
+
return;
|
|
313
|
+
try {
|
|
314
|
+
const snapshot = getNavigationSnapshot();
|
|
315
|
+
if (snapshot.entriesKeys.length === 0)
|
|
316
|
+
return;
|
|
317
|
+
const keyToIndexMap = getKeyToIndexMap(snapshot.entriesKeys);
|
|
318
|
+
const idx = keyToIndexMap.get(snapshot.currentKey) ?? -1;
|
|
319
|
+
if (idx === -1)
|
|
320
|
+
return;
|
|
321
|
+
const targetIdx = idx + delta;
|
|
322
|
+
if (targetIdx < 0 || targetIdx >= snapshot.entriesKeys.length) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const targetKey = snapshot.entriesKeys[targetIdx];
|
|
326
|
+
if (targetKey === void 0)
|
|
327
|
+
return;
|
|
328
|
+
nav.traverseTo(targetKey);
|
|
329
|
+
} catch (error) {
|
|
330
|
+
getLogger().error("[useRoute] Go navigation error:", error);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function globalCanGoBack(steps = 1) {
|
|
334
|
+
if (!Number.isFinite(steps) || steps < 0 || steps > Number.MAX_SAFE_INTEGER) {
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
const nav = getNavigation();
|
|
338
|
+
if (!nav)
|
|
339
|
+
return false;
|
|
340
|
+
const snapshot = getNavigationSnapshot();
|
|
341
|
+
if (snapshot.entriesKeys.length === 0) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
const keyToIndexMap = getKeyToIndexMap(snapshot.entriesKeys);
|
|
345
|
+
const idx = keyToIndexMap.get(snapshot.currentKey) ?? -1;
|
|
346
|
+
if (idx === -1)
|
|
347
|
+
return false;
|
|
348
|
+
return idx - steps >= 0;
|
|
349
|
+
}
|
|
350
|
+
function globalCanGoForward(steps = 1) {
|
|
351
|
+
if (!Number.isFinite(steps) || steps < 0 || steps > Number.MAX_SAFE_INTEGER) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
const nav = getNavigation();
|
|
355
|
+
if (!nav)
|
|
356
|
+
return false;
|
|
357
|
+
const snapshot = getNavigationSnapshot();
|
|
358
|
+
if (snapshot.entriesKeys.length === 0) {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
const keyToIndexMap = getKeyToIndexMap(snapshot.entriesKeys);
|
|
362
|
+
const idx = keyToIndexMap.get(snapshot.currentKey) ?? -1;
|
|
363
|
+
if (idx === -1)
|
|
364
|
+
return false;
|
|
365
|
+
return idx + steps < snapshot.entriesKeys.length;
|
|
220
366
|
}
|
|
221
367
|
function useRoute(patternOrOptions, optionsParam) {
|
|
222
368
|
let pattern;
|
|
@@ -228,7 +374,6 @@ function useRoute(patternOrOptions, optionsParam) {
|
|
|
228
374
|
pattern = patternOrOptions;
|
|
229
375
|
options = optionsParam;
|
|
230
376
|
}
|
|
231
|
-
const navigation = getNavigation();
|
|
232
377
|
const rawState = (0, import_react.useSyncExternalStore)(subscribeToNavigation, getNavigationSnapshot, () => DEFAULT_SNAPSHOT);
|
|
233
378
|
const keyToIndexMap = getKeyToIndexMap(rawState.entriesKeys);
|
|
234
379
|
const effectiveBase = combineBases(getRouterConfig().base, options?.section);
|
|
@@ -257,8 +402,7 @@ function useRoute(patternOrOptions, optionsParam) {
|
|
|
257
402
|
params,
|
|
258
403
|
historyIndex,
|
|
259
404
|
state: rawState.state,
|
|
260
|
-
matched
|
|
261
|
-
_entriesKeys: rawState.entriesKeys
|
|
405
|
+
matched
|
|
262
406
|
};
|
|
263
407
|
}, [
|
|
264
408
|
rawState.currentKey,
|
|
@@ -270,125 +414,15 @@ function useRoute(patternOrOptions, optionsParam) {
|
|
|
270
414
|
pattern,
|
|
271
415
|
effectiveBase
|
|
272
416
|
]);
|
|
273
|
-
const navigate = (
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
if (baseForCall && baseForCall !== "/" && typeof to === "string" && to.startsWith("/") && !to.startsWith("//") && !to.includes(":")) {
|
|
284
|
-
targetUrl = baseForCall + (to === "/" ? "" : to);
|
|
285
|
-
}
|
|
286
|
-
if (!isValidUrl(targetUrl)) {
|
|
287
|
-
getLogger().warn("[useRoute] Invalid URL rejected:", targetUrl);
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
if (!navigation) {
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
const defaultHistory = getRouterConfig().defaultHistory ?? "auto";
|
|
294
|
-
const navigationOpts = {
|
|
295
|
-
state: navOptions.state,
|
|
296
|
-
history: navOptions.history ?? defaultHistory
|
|
297
|
-
};
|
|
298
|
-
try {
|
|
299
|
-
await navigation.navigate(targetUrl, navigationOpts);
|
|
300
|
-
} catch (error) {
|
|
301
|
-
getLogger().error("[useRoute] Navigation error:", error);
|
|
302
|
-
}
|
|
303
|
-
}, [navigation, effectiveBase]);
|
|
304
|
-
const back = (0, import_react.useCallback)(() => {
|
|
305
|
-
try {
|
|
306
|
-
if (navigation)
|
|
307
|
-
navigation.back();
|
|
308
|
-
} catch (error) {
|
|
309
|
-
getLogger().error("[useRoute] Back navigation error:", error);
|
|
310
|
-
}
|
|
311
|
-
}, [navigation]);
|
|
312
|
-
const forward = (0, import_react.useCallback)(() => {
|
|
313
|
-
try {
|
|
314
|
-
if (navigation)
|
|
315
|
-
navigation.forward();
|
|
316
|
-
} catch (error) {
|
|
317
|
-
getLogger().error("[useRoute] Forward navigation error:", error);
|
|
318
|
-
}
|
|
319
|
-
}, [navigation]);
|
|
320
|
-
const canGoBack = (0, import_react.useCallback)((steps = 1) => {
|
|
321
|
-
if (!Number.isFinite(steps) || steps < 0 || steps > Number.MAX_SAFE_INTEGER) {
|
|
322
|
-
return false;
|
|
323
|
-
}
|
|
324
|
-
if (!navigation || routerState._entriesKeys.length === 0) {
|
|
325
|
-
return false;
|
|
326
|
-
}
|
|
327
|
-
const idx = routerState.historyIndex;
|
|
328
|
-
if (idx === -1)
|
|
329
|
-
return false;
|
|
330
|
-
return idx - steps >= 0;
|
|
331
|
-
}, [navigation, routerState._entriesKeys.length, routerState.historyIndex]);
|
|
332
|
-
const canGoForward = (0, import_react.useCallback)((steps = 1) => {
|
|
333
|
-
if (!Number.isFinite(steps) || steps < 0 || steps > Number.MAX_SAFE_INTEGER) {
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
336
|
-
if (!navigation || routerState._entriesKeys.length === 0) {
|
|
337
|
-
return false;
|
|
338
|
-
}
|
|
339
|
-
const idx = routerState.historyIndex;
|
|
340
|
-
if (idx === -1)
|
|
341
|
-
return false;
|
|
342
|
-
return idx + steps < routerState._entriesKeys.length;
|
|
343
|
-
}, [navigation, routerState._entriesKeys.length, routerState.historyIndex]);
|
|
344
|
-
const go = (0, import_react.useCallback)((delta) => {
|
|
345
|
-
if (delta === Infinity || delta === -Infinity) {
|
|
346
|
-
getLogger().warn("[useRoute] Delta value too large:", delta);
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
if (!Number.isFinite(delta) || delta === 0)
|
|
350
|
-
return;
|
|
351
|
-
if (delta > Number.MAX_SAFE_INTEGER || delta < -Number.MAX_SAFE_INTEGER) {
|
|
352
|
-
getLogger().warn("[useRoute] Delta value too large:", delta);
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
try {
|
|
356
|
-
if (navigation && routerState._entriesKeys.length > 0) {
|
|
357
|
-
const idx = routerState.historyIndex;
|
|
358
|
-
if (idx === -1)
|
|
359
|
-
return;
|
|
360
|
-
const targetIdx = idx + delta;
|
|
361
|
-
if (targetIdx < 0 || targetIdx >= routerState._entriesKeys.length) {
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
const targetKey = routerState._entriesKeys[targetIdx];
|
|
365
|
-
if (targetKey === void 0)
|
|
366
|
-
return;
|
|
367
|
-
navigation.traverseTo(targetKey);
|
|
368
|
-
}
|
|
369
|
-
} catch (error) {
|
|
370
|
-
getLogger().error("[useRoute] Go navigation error:", error);
|
|
371
|
-
}
|
|
372
|
-
}, [navigation, routerState._entriesKeys, routerState.historyIndex]);
|
|
373
|
-
const replace = (0, import_react.useCallback)((to, options2) => navigate(to, { ...options2, history: "replace" }), [navigate]);
|
|
374
|
-
const updateState = (0, import_react.useCallback)((state) => {
|
|
375
|
-
try {
|
|
376
|
-
if (navigation) {
|
|
377
|
-
navigation.updateCurrentEntry({ state });
|
|
378
|
-
sharedSnapshot = computeNavigationSnapshot(navigation);
|
|
379
|
-
storeCallbacks.forEach((cb) => cb());
|
|
380
|
-
} else if (isBrowser) {
|
|
381
|
-
window.history.replaceState(state, "", window.location.href);
|
|
382
|
-
if (noNavSnapshot !== null) {
|
|
383
|
-
noNavSnapshot = { ...noNavSnapshot, state };
|
|
384
|
-
}
|
|
385
|
-
storeCallbacks.forEach((cb) => cb());
|
|
386
|
-
}
|
|
387
|
-
} catch (error) {
|
|
388
|
-
getLogger().error("[useRoute] updateState error:", error);
|
|
389
|
-
}
|
|
390
|
-
}, [navigation]);
|
|
391
|
-
return (0, import_react.useMemo)(() => ({
|
|
417
|
+
const navigate = getNavigateForBase(effectiveBase);
|
|
418
|
+
const replace = getReplaceForBase(effectiveBase);
|
|
419
|
+
const back = globalBack;
|
|
420
|
+
const forward = globalForward;
|
|
421
|
+
const go = globalGo;
|
|
422
|
+
const updateState = globalUpdateState;
|
|
423
|
+
const canGoBack = globalCanGoBack;
|
|
424
|
+
const canGoForward = globalCanGoForward;
|
|
425
|
+
return {
|
|
392
426
|
navigate,
|
|
393
427
|
back,
|
|
394
428
|
forward,
|
|
@@ -404,7 +438,7 @@ function useRoute(patternOrOptions, optionsParam) {
|
|
|
404
438
|
historyIndex: routerState.historyIndex,
|
|
405
439
|
state: routerState.state,
|
|
406
440
|
matched: routerState.matched
|
|
407
|
-
}
|
|
441
|
+
};
|
|
408
442
|
}
|
|
409
443
|
export {
|
|
410
444
|
clearRouterCaches,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../node_modules/.pnpm/@budarin+use-route@1.3.
|
|
3
|
+
"sources": ["../../../../node_modules/.pnpm/@budarin+use-route@1.3.4/node_modules/@budarin/use-route/src/types.ts", "../../../../node_modules/.pnpm/@budarin+use-route@1.3.4/node_modules/@budarin/use-route/src/index.ts"],
|
|
4
4
|
"sourcesContent": [null, null],
|
|
5
|
-
"mappings": ";;;;;;AAwHA,IAAI,eAA6B;EAC7B,eAAe;;AAOb,SAAU,gBAAgB,QAA6B;AACzD,iBAAe,EAAE,GAAG,cAAc,GAAG,OAAM;AAC/C;AAKM,SAAU,kBAAe;AAC3B,SAAO;AACX;AAKM,SAAU,YAAS;AACrB,SAAO,aAAa,UAAU;AAClC;;;AC/HA,
|
|
6
|
-
"names": ["
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["urlStr", "parsed"]
|
|
7
7
|
}
|