@budarin/use-route 1.3.3 → 1.3.5
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 +12 -0
- package/demo/node_modules/.vite/deps/@budarin_use-route.js +186 -168
- 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 +15 -3
- 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 +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +198 -193
- 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 +0 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -11
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@
|
|
|
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.4] - 2025-02-01
|
|
9
|
+
|
|
10
|
+
### Изменено
|
|
11
|
+
|
|
12
|
+
- **Оптимизация производительности:** все методы навигации (`navigate`, `back`, `forward`, `go`, `replace`, `updateState`, `canGoBack`, `canGoForward`) теперь создаются **один раз глобально** вместо создания в каждом компоненте. При 50 компонентах с `useRoute()` экономия ~400 `useCallback` вызовов. Методы кэшируются по `effectiveBase` и переиспользуются между компонентами.
|
|
13
|
+
- **Глобальное хранилище состояния:** `sharedSnapshot` теперь всегда валиден и не очищается при отписке последнего подписчика. Методы читают актуальный snapshot без дополнительных вычислений (O(1)).
|
|
14
|
+
- **Упрощение кода:** удалён fallback на старое API (`window.location`, `window.history.pushState/replaceState`) для браузеров без Navigation API. Хук строго требует Navigation API в браузере; без него возвращает дефолтное состояние и методы работают в режиме no-op. SSR поддержка через `initialLocation` сохранена.
|
|
15
|
+
|
|
16
|
+
### Удалено
|
|
17
|
+
|
|
18
|
+
- **Fallback на window.location/history:** в браузере без Navigation API хук больше не использует `window.location.href` для получения pathname и `window.history` для навигации. Вместо этого возвращается `DEFAULT_SNAPSHOT` (pathname: '/', searchParams: empty), методы навигации — no-op.
|
|
19
|
+
|
|
8
20
|
## [1.3.3] - 2025-02-01
|
|
9
21
|
|
|
10
22
|
### Изменено
|
|
@@ -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,23 +438,7 @@ function useRoute(patternOrOptions, optionsParam) {
|
|
|
404
438
|
historyIndex: routerState.historyIndex,
|
|
405
439
|
state: routerState.state,
|
|
406
440
|
matched: routerState.matched
|
|
407
|
-
}
|
|
408
|
-
navigate,
|
|
409
|
-
back,
|
|
410
|
-
forward,
|
|
411
|
-
go,
|
|
412
|
-
replace,
|
|
413
|
-
updateState,
|
|
414
|
-
canGoBack,
|
|
415
|
-
canGoForward,
|
|
416
|
-
routerState.location,
|
|
417
|
-
routerState.pathname,
|
|
418
|
-
routerState.searchParams,
|
|
419
|
-
routerState.params,
|
|
420
|
-
routerState.historyIndex,
|
|
421
|
-
routerState.state,
|
|
422
|
-
routerState.matched
|
|
423
|
-
]);
|
|
441
|
+
};
|
|
424
442
|
}
|
|
425
443
|
export {
|
|
426
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
|
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
{
|
|
2
|
-
"hash": "
|
|
2
|
+
"hash": "e9f3058a",
|
|
3
3
|
"configHash": "5d40f1b5",
|
|
4
|
-
"lockfileHash": "
|
|
5
|
-
"browserHash": "
|
|
4
|
+
"lockfileHash": "b110f999",
|
|
5
|
+
"browserHash": "77e455a2",
|
|
6
6
|
"optimized": {
|
|
7
7
|
"react": {
|
|
8
8
|
"src": "../../../../node_modules/.pnpm/react@19.2.4/node_modules/react/index.js",
|
|
9
9
|
"file": "react.js",
|
|
10
|
-
"fileHash": "
|
|
10
|
+
"fileHash": "3427d084",
|
|
11
11
|
"needsInterop": true
|
|
12
12
|
},
|
|
13
13
|
"react-dom": {
|
|
14
14
|
"src": "../../../../node_modules/.pnpm/react-dom@19.2.4_react@19.2.4/node_modules/react-dom/index.js",
|
|
15
15
|
"file": "react-dom.js",
|
|
16
|
-
"fileHash": "
|
|
16
|
+
"fileHash": "d9711b24",
|
|
17
17
|
"needsInterop": true
|
|
18
18
|
},
|
|
19
19
|
"react/jsx-dev-runtime": {
|
|
20
20
|
"src": "../../../../node_modules/.pnpm/react@19.2.4/node_modules/react/jsx-dev-runtime.js",
|
|
21
21
|
"file": "react_jsx-dev-runtime.js",
|
|
22
|
-
"fileHash": "
|
|
22
|
+
"fileHash": "7b60a338",
|
|
23
23
|
"needsInterop": true
|
|
24
24
|
},
|
|
25
25
|
"react/jsx-runtime": {
|
|
26
26
|
"src": "../../../../node_modules/.pnpm/react@19.2.4/node_modules/react/jsx-runtime.js",
|
|
27
27
|
"file": "react_jsx-runtime.js",
|
|
28
|
-
"fileHash": "
|
|
28
|
+
"fileHash": "2806e1e3",
|
|
29
29
|
"needsInterop": true
|
|
30
30
|
},
|
|
31
31
|
"@budarin/use-route": {
|
|
32
|
-
"src": "../../../../node_modules/.pnpm/@budarin+use-route@1.3.
|
|
32
|
+
"src": "../../../../node_modules/.pnpm/@budarin+use-route@1.3.4/node_modules/@budarin/use-route/dist/index.js",
|
|
33
33
|
"file": "@budarin_use-route.js",
|
|
34
|
-
"fileHash": "
|
|
34
|
+
"fileHash": "5b933597",
|
|
35
35
|
"needsInterop": false
|
|
36
36
|
},
|
|
37
37
|
"react-dom/client": {
|
|
38
38
|
"src": "../../../../node_modules/.pnpm/react-dom@19.2.4_react@19.2.4/node_modules/react-dom/client.js",
|
|
39
39
|
"file": "react-dom_client.js",
|
|
40
|
-
"fileHash": "
|
|
40
|
+
"fileHash": "31004c82",
|
|
41
41
|
"needsInterop": true
|
|
42
42
|
}
|
|
43
43
|
},
|
package/demo/package.json
CHANGED
package/demo/src/App.tsx
CHANGED
|
@@ -35,7 +35,11 @@ function Nav() {
|
|
|
35
35
|
<span style={{ width: '0.5rem' }} />
|
|
36
36
|
<Link
|
|
37
37
|
to={section || '/'}
|
|
38
|
-
className={
|
|
38
|
+
className={
|
|
39
|
+
// Вне раздела: Главная активна на pathname === '/'
|
|
40
|
+
// В разделе: Главная не подсвечивается — активна «Выйти из раздела»
|
|
41
|
+
!section && pathname === '/' ? 'active' : ''
|
|
42
|
+
}
|
|
39
43
|
title="Главная страница демо"
|
|
40
44
|
>
|
|
41
45
|
Главная
|
|
@@ -93,7 +97,13 @@ function Nav() {
|
|
|
93
97
|
Раздел (section)
|
|
94
98
|
</Link>
|
|
95
99
|
) : (
|
|
96
|
-
<Link
|
|
100
|
+
<Link
|
|
101
|
+
to="/"
|
|
102
|
+
className={pathname.startsWith(section) ? 'active' : ''}
|
|
103
|
+
title="Выйти из раздела в корень приложения"
|
|
104
|
+
>
|
|
105
|
+
Выйти из раздела
|
|
106
|
+
</Link>
|
|
97
107
|
)}
|
|
98
108
|
</div>
|
|
99
109
|
</nav>
|
|
@@ -137,7 +147,9 @@ function Router() {
|
|
|
137
147
|
<p>
|
|
138
148
|
Путь <code>{pathname}</code> не найден.
|
|
139
149
|
</p>
|
|
140
|
-
<Link to="/"
|
|
150
|
+
<Link to="/" className="demo-link-btn">
|
|
151
|
+
На главную
|
|
152
|
+
</Link>
|
|
141
153
|
</div>
|
|
142
154
|
);
|
|
143
155
|
}
|
package/demo/src/index.css
CHANGED
|
@@ -158,3 +158,40 @@ button:disabled {
|
|
|
158
158
|
gap: 0.5rem;
|
|
159
159
|
margin: 0.75rem 0;
|
|
160
160
|
}
|
|
161
|
+
|
|
162
|
+
/* Ссылки внутри блока кнопок — в одном стиле с кнопками */
|
|
163
|
+
.demo-buttons a {
|
|
164
|
+
display: inline-block;
|
|
165
|
+
font: inherit;
|
|
166
|
+
cursor: pointer;
|
|
167
|
+
padding: 0.4em 0.8em;
|
|
168
|
+
border: 1px solid #ccc;
|
|
169
|
+
border-radius: 4px;
|
|
170
|
+
background: #fff;
|
|
171
|
+
color: #1a1a1a;
|
|
172
|
+
text-decoration: none;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.demo-buttons a:hover {
|
|
176
|
+
background: #f0f0f0;
|
|
177
|
+
text-decoration: none;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Отдельные ссылки «назад» / «на главную» в контенте — тоже под кнопку */
|
|
181
|
+
.demo-content a.demo-link-btn {
|
|
182
|
+
display: inline-block;
|
|
183
|
+
font: inherit;
|
|
184
|
+
cursor: pointer;
|
|
185
|
+
padding: 0.4em 0.8em;
|
|
186
|
+
margin: 0.25rem 0;
|
|
187
|
+
border: 1px solid #ccc;
|
|
188
|
+
border-radius: 4px;
|
|
189
|
+
background: #fff;
|
|
190
|
+
color: #1a1a1a;
|
|
191
|
+
text-decoration: none;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.demo-content a.demo-link-btn:hover {
|
|
195
|
+
background: #f0f0f0;
|
|
196
|
+
text-decoration: none;
|
|
197
|
+
}
|