@budarin/use-route 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKR,WAAW,EAGX,cAAc,EACd,eAAe,EAGlB,MAAM,SAAS,CAAC;AAwNjB,OAAO,EACH,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,WAAW,GACnB,MAAM,SAAS,CAAC;AAEjB,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAAC;AACnE,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,EACnD,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,eAAe,GAC1B,cAAc,CAAC,CAAC,CAAC,CAAC;AACrB,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,398 @@
1
+ import { getRouterConfig, getLogger } from './types';
2
+ import { useSyncExternalStore, useCallback, useMemo } from 'react';
3
+ // Утилита для проверки браузерного окружения
4
+ const isBrowser = typeof window !== 'undefined';
5
+ // Валидация URL: разрешаем только http://, https:// и относительные пути
6
+ function isValidUrl(url) {
7
+ if (!url || typeof url !== 'string')
8
+ return false;
9
+ // Относительные пути всегда валидны
10
+ if (url.startsWith('/') || !url.includes(':'))
11
+ return true;
12
+ // Абсолютные URL должны начинаться с http:// или https://
13
+ try {
14
+ const parsed = new URL(url);
15
+ return parsed.protocol === 'http:' || parsed.protocol === 'https:';
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ // Проверка соответствия паттерна pathname (только URLPattern)
22
+ function testPattern(compiled, pathname) {
23
+ return compiled.test({ pathname });
24
+ }
25
+ /** pathname без базового префикса (для возврата из хука при заданном base). */
26
+ function pathnameWithoutBase(pathname, base) {
27
+ if (!base || base === '/')
28
+ return pathname;
29
+ if (pathname === base || pathname.startsWith(base + '/')) {
30
+ return pathname === base ? '/' : pathname.slice(base.length);
31
+ }
32
+ return pathname;
33
+ }
34
+ // Общий LRU-кэш URL → разобранный URL (используется в snapshot, один раз на текущий URL)
35
+ const URL_CACHE = new Map();
36
+ /**
37
+ * Парсит URL с LRU-кэшем. При ошибке парсинга не кэширует — возвращает fallback URL.
38
+ */
39
+ function getCachedParsedUrl(urlStr) {
40
+ const cache = URL_CACHE;
41
+ const existing = cache.get(urlStr);
42
+ if (existing !== undefined) {
43
+ cache.delete(urlStr);
44
+ cache.set(urlStr, existing);
45
+ return existing;
46
+ }
47
+ const base = isBrowser ? window.location.origin : 'http://localhost';
48
+ try {
49
+ const parsed = new URL(urlStr, base);
50
+ const limit = getRouterConfig().urlCacheLimit;
51
+ if (cache.size >= limit) {
52
+ const firstKey = cache.keys().next().value;
53
+ if (firstKey !== undefined)
54
+ cache.delete(firstKey);
55
+ }
56
+ cache.set(urlStr, parsed);
57
+ return parsed;
58
+ }
59
+ catch (error) {
60
+ getLogger().warn('[useRoute] Invalid URL:', urlStr, error);
61
+ try {
62
+ return new URL('/', base);
63
+ }
64
+ catch {
65
+ return new URL('http://localhost/');
66
+ }
67
+ }
68
+ }
69
+ const DEFAULT_SNAPSHOT = {
70
+ currentKey: '',
71
+ canGoBackFlag: false,
72
+ canGoForwardFlag: false,
73
+ entriesKeys: [],
74
+ urlStr: '/',
75
+ pathname: '/',
76
+ searchParams: new URLSearchParams(),
77
+ };
78
+ function getNavigation() {
79
+ return typeof window !== 'undefined' && 'navigation' in window
80
+ ? window.navigation
81
+ : undefined;
82
+ }
83
+ function computeNavigationSnapshot(nav) {
84
+ if (!nav)
85
+ return DEFAULT_SNAPSHOT;
86
+ const urlStr = nav.currentEntry?.url ?? (isBrowser ? window.location.href : '/');
87
+ const parsed = getCachedParsedUrl(urlStr);
88
+ return {
89
+ currentKey: nav.currentEntry?.key ?? '',
90
+ canGoBackFlag: !!nav.canGoBack,
91
+ canGoForwardFlag: !!nav.canGoForward,
92
+ entriesKeys: nav.entries().map((e) => e.key) ?? [],
93
+ urlStr,
94
+ pathname: parsed.pathname,
95
+ searchParams: parsed.searchParams,
96
+ };
97
+ }
98
+ let sharedSnapshot = null;
99
+ const storeCallbacks = new Set();
100
+ let unsubscribeNavigation = null;
101
+ function subscribeToNavigation(callback) {
102
+ storeCallbacks.add(callback);
103
+ if (storeCallbacks.size === 1) {
104
+ const nav = getNavigation();
105
+ if (nav) {
106
+ const listener = () => {
107
+ sharedSnapshot = computeNavigationSnapshot(nav);
108
+ storeCallbacks.forEach((cb) => cb());
109
+ };
110
+ nav.addEventListener('navigate', listener);
111
+ nav.addEventListener('currententrychange', listener);
112
+ unsubscribeNavigation = () => {
113
+ nav.removeEventListener('navigate', listener);
114
+ nav.removeEventListener('currententrychange', listener);
115
+ };
116
+ }
117
+ }
118
+ return () => {
119
+ storeCallbacks.delete(callback);
120
+ if (storeCallbacks.size === 0) {
121
+ if (unsubscribeNavigation) {
122
+ unsubscribeNavigation();
123
+ unsubscribeNavigation = null;
124
+ }
125
+ sharedSnapshot = null;
126
+ noNavSnapshot = null;
127
+ noNavSnapshotUrl = null;
128
+ }
129
+ };
130
+ }
131
+ let noNavSnapshot = null;
132
+ let noNavSnapshotUrl = null;
133
+ function getNavigationSnapshot() {
134
+ if (sharedSnapshot !== null)
135
+ return sharedSnapshot;
136
+ const nav = getNavigation();
137
+ if (nav) {
138
+ sharedSnapshot = computeNavigationSnapshot(nav);
139
+ return sharedSnapshot;
140
+ }
141
+ // Нет Navigation API (тесты, старый браузер, SSR) — URL из window.location или из конфига (initialLocation для SSR)
142
+ const urlStr = isBrowser ? window.location.href : (getRouterConfig().initialLocation ?? '/');
143
+ if (noNavSnapshot !== null && noNavSnapshotUrl === urlStr)
144
+ return noNavSnapshot;
145
+ const parsed = getCachedParsedUrl(urlStr);
146
+ noNavSnapshotUrl = urlStr;
147
+ noNavSnapshot = {
148
+ ...DEFAULT_SNAPSHOT,
149
+ urlStr,
150
+ pathname: parsed.pathname,
151
+ searchParams: parsed.searchParams,
152
+ };
153
+ return noNavSnapshot;
154
+ }
155
+ // Один keyToIndexMap на снимок (один на все хуки при общем rawState)
156
+ let lastEntriesKeysRef = null;
157
+ let lastKeyToIndexMap = null;
158
+ function getKeyToIndexMap(entriesKeys) {
159
+ if (entriesKeys === lastEntriesKeysRef && lastKeyToIndexMap !== null) {
160
+ return lastKeyToIndexMap;
161
+ }
162
+ lastEntriesKeysRef = entriesKeys;
163
+ const map = new Map();
164
+ entriesKeys.forEach((key, index) => map.set(key, index));
165
+ lastKeyToIndexMap = map;
166
+ return map;
167
+ }
168
+ // Кэш скомпилированных URLPattern
169
+ const PATTERN_CACHE = new Map();
170
+ function getCompiledPattern(pattern) {
171
+ let compiled = PATTERN_CACHE.get(pattern);
172
+ if (!compiled) {
173
+ compiled = new URLPattern({ pathname: pattern });
174
+ PATTERN_CACHE.set(pattern, compiled);
175
+ }
176
+ return compiled;
177
+ }
178
+ // Извлечение params из уже скомпилированного URLPattern (один exec, без повторного getCompiledPattern)
179
+ // URLPattern кладёт сегменты * в groups с числовыми ключами — их не возвращаем.
180
+ function parseParamsFromCompiled(compiled, pathname) {
181
+ const match = compiled.exec({ pathname });
182
+ const groups = (match?.pathname.groups ?? {});
183
+ return Object.fromEntries(Object.entries(groups).filter(([key]) => !/^\d+$/.test(key)));
184
+ }
185
+ // Экспортируем configureRouter и очистку кэшей (для тестов / смены окружения)
186
+ export { configureRouter, } from './types';
187
+ /** Очищает кэши паттернов и URL. Для тестов или при смене base/origin. */
188
+ export function clearRouterCaches() {
189
+ PATTERN_CACHE.clear();
190
+ URL_CACHE.clear();
191
+ lastEntriesKeysRef = null;
192
+ lastKeyToIndexMap = null;
193
+ noNavSnapshot = null;
194
+ noNavSnapshotUrl = null;
195
+ }
196
+ /**
197
+ * Хук состояния маршрута и навигации (Navigation API + URLPattern).
198
+ * Вызов с одним объектом: useRoute({ base: '/dashboard' }) — опции без pattern.
199
+ * Вызов с pattern: useRoute('/users/:id') или useRoute('/users/:id', { base: '/dashboard' }).
200
+ */
201
+ export function useRoute(patternOrOptions, optionsParam) {
202
+ let pattern;
203
+ let options;
204
+ if (arguments.length === 1 &&
205
+ typeof patternOrOptions === 'object' &&
206
+ patternOrOptions !== null &&
207
+ typeof patternOrOptions !== 'function') {
208
+ options = patternOrOptions;
209
+ pattern = undefined;
210
+ }
211
+ else {
212
+ pattern = patternOrOptions;
213
+ options = optionsParam;
214
+ }
215
+ const navigation = getNavigation();
216
+ const rawState = useSyncExternalStore(subscribeToNavigation, getNavigationSnapshot, () => DEFAULT_SNAPSHOT);
217
+ const keyToIndexMap = getKeyToIndexMap(rawState.entriesKeys);
218
+ const effectiveBase = options?.base ?? getRouterConfig().base;
219
+ // 2. Производное состояние роутера. pathname/searchParams берём из snapshot (разбор URL один раз в store).
220
+ const routerState = useMemo(() => {
221
+ const { urlStr, pathname: rawPathname, searchParams } = rawState;
222
+ const pathname = pathnameWithoutBase(rawPathname, effectiveBase);
223
+ let matched;
224
+ let params = {};
225
+ if (pattern) {
226
+ if (typeof pattern === 'function') {
227
+ const result = pattern(pathname);
228
+ matched = result.matched;
229
+ params = result.params;
230
+ }
231
+ else {
232
+ const compiled = getCompiledPattern(pattern);
233
+ const patternMatched = testPattern(compiled, pathname);
234
+ matched = patternMatched;
235
+ params = patternMatched ? parseParamsFromCompiled(compiled, pathname) : {};
236
+ }
237
+ }
238
+ const historyIndex = keyToIndexMap.get(rawState.currentKey) ?? -1;
239
+ return {
240
+ location: urlStr,
241
+ pathname,
242
+ searchParams,
243
+ params,
244
+ historyIndex,
245
+ matched,
246
+ _entriesKeys: rawState.entriesKeys,
247
+ };
248
+ }, [
249
+ rawState.currentKey,
250
+ rawState.entriesKeys,
251
+ rawState.urlStr,
252
+ rawState.pathname,
253
+ rawState.searchParams,
254
+ pattern,
255
+ effectiveBase,
256
+ ]);
257
+ // 3. Навигационные операции. Только Navigation API — без Navigation состояние не обновляется.
258
+ const navigate = useCallback(async (to, navOptions = {}) => {
259
+ let targetUrl = typeof to === 'string' ? to : to.toString();
260
+ const baseForCall = navOptions.base !== undefined
261
+ ? navOptions.base === '' || navOptions.base === '/'
262
+ ? undefined
263
+ : navOptions.base
264
+ : effectiveBase;
265
+ if (baseForCall &&
266
+ baseForCall !== '/' &&
267
+ typeof to === 'string' &&
268
+ to.startsWith('/') &&
269
+ !to.startsWith('//') &&
270
+ !to.includes(':')) {
271
+ targetUrl = baseForCall + (to === '/' ? '' : to);
272
+ }
273
+ if (!isValidUrl(targetUrl)) {
274
+ getLogger().warn('[useRoute] Invalid URL rejected:', targetUrl);
275
+ return;
276
+ }
277
+ if (!navigation) {
278
+ return;
279
+ }
280
+ const defaultHistory = getRouterConfig().defaultHistory ?? 'auto';
281
+ const navigationOpts = {
282
+ state: navOptions.state,
283
+ history: navOptions.history ?? defaultHistory,
284
+ };
285
+ try {
286
+ await navigation.navigate(targetUrl, navigationOpts);
287
+ }
288
+ catch (error) {
289
+ getLogger().error('[useRoute] Navigation error:', error);
290
+ }
291
+ }, [navigation, effectiveBase]);
292
+ const back = useCallback(() => {
293
+ try {
294
+ if (navigation)
295
+ navigation.back();
296
+ }
297
+ catch (error) {
298
+ getLogger().error('[useRoute] Back navigation error:', error);
299
+ }
300
+ }, [navigation]);
301
+ const forward = useCallback(() => {
302
+ try {
303
+ if (navigation)
304
+ navigation.forward();
305
+ }
306
+ catch (error) {
307
+ getLogger().error('[useRoute] Forward navigation error:', error);
308
+ }
309
+ }, [navigation]);
310
+ const canGoBack = useCallback((steps = 1) => {
311
+ // Валидация входных данных
312
+ if (!Number.isFinite(steps) || steps < 0 || steps > Number.MAX_SAFE_INTEGER) {
313
+ return false;
314
+ }
315
+ if (!navigation || routerState._entriesKeys.length === 0) {
316
+ return false;
317
+ }
318
+ const idx = routerState.historyIndex;
319
+ if (idx === -1)
320
+ return false;
321
+ return idx - steps >= 0;
322
+ }, [navigation, routerState._entriesKeys.length, routerState.historyIndex]);
323
+ const canGoForward = useCallback((steps = 1) => {
324
+ // Валидация входных данных
325
+ if (!Number.isFinite(steps) || steps < 0 || steps > Number.MAX_SAFE_INTEGER) {
326
+ return false;
327
+ }
328
+ if (!navigation || routerState._entriesKeys.length === 0) {
329
+ return false;
330
+ }
331
+ const idx = routerState.historyIndex;
332
+ if (idx === -1)
333
+ return false;
334
+ return idx + steps < routerState._entriesKeys.length;
335
+ }, [navigation, routerState._entriesKeys.length, routerState.historyIndex]);
336
+ const go = useCallback((delta) => {
337
+ // Валидация входных данных
338
+ if (delta === Infinity || delta === -Infinity) {
339
+ getLogger().warn('[useRoute] Delta value too large:', delta);
340
+ return;
341
+ }
342
+ if (!Number.isFinite(delta) || delta === 0)
343
+ return;
344
+ if (delta > Number.MAX_SAFE_INTEGER || delta < -Number.MAX_SAFE_INTEGER) {
345
+ getLogger().warn('[useRoute] Delta value too large:', delta);
346
+ return;
347
+ }
348
+ try {
349
+ if (navigation && routerState._entriesKeys.length > 0) {
350
+ const idx = routerState.historyIndex;
351
+ if (idx === -1)
352
+ return;
353
+ const targetIdx = idx + delta;
354
+ if (targetIdx < 0 || targetIdx >= routerState._entriesKeys.length) {
355
+ return;
356
+ }
357
+ const targetKey = routerState._entriesKeys[targetIdx];
358
+ if (targetKey === undefined)
359
+ return;
360
+ navigation.traverseTo(targetKey);
361
+ }
362
+ }
363
+ catch (error) {
364
+ getLogger().error('[useRoute] Go navigation error:', error);
365
+ }
366
+ }, [navigation, routerState._entriesKeys, routerState.historyIndex]);
367
+ const replace = useCallback((to, options) => navigate(to, { ...options, history: 'replace' }), [navigate]);
368
+ return useMemo(() => ({
369
+ navigate,
370
+ back,
371
+ forward,
372
+ go,
373
+ replace,
374
+ canGoBack,
375
+ canGoForward,
376
+ location: routerState.location,
377
+ pathname: routerState.pathname,
378
+ searchParams: routerState.searchParams,
379
+ params: routerState.params,
380
+ historyIndex: routerState.historyIndex,
381
+ matched: routerState.matched,
382
+ }), [
383
+ navigate,
384
+ back,
385
+ forward,
386
+ go,
387
+ replace,
388
+ canGoBack,
389
+ canGoForward,
390
+ routerState.location,
391
+ routerState.pathname,
392
+ routerState.searchParams,
393
+ routerState.params,
394
+ routerState.historyIndex,
395
+ routerState.matched,
396
+ ]);
397
+ }
398
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Временные объявления нативного API до появления типов в lib.dom.
3
+ * Когда URLPattern и Navigation API появятся в TypeScript lib.dom — удалить этот файл
4
+ * и убрать реэкспорт из types.ts (или перейти на типы из lib).
5
+ *
6
+ * Источники: WHATWG URL Pattern Standard, MDN/WHATWG Navigation API.
7
+ */
8
+ declare global {
9
+ class URLPattern {
10
+ constructor(init?: URLPatternInit);
11
+ test(input: URLPatternInit | string): boolean;
12
+ exec(input: URLPatternInit | string): URLPatternResult | null;
13
+ }
14
+ interface URLPatternInit {
15
+ pathname?: string;
16
+ search?: string;
17
+ hash?: string;
18
+ baseURL?: string;
19
+ username?: string;
20
+ password?: string;
21
+ protocol?: string;
22
+ hostname?: string;
23
+ port?: string;
24
+ }
25
+ interface URLPatternResult {
26
+ pathname: {
27
+ groups: Record<string, string>;
28
+ };
29
+ search: {
30
+ groups: Record<string, string>;
31
+ };
32
+ hash: {
33
+ groups: Record<string, string>;
34
+ };
35
+ }
36
+ }
37
+ export interface NavigationNavigateOptions {
38
+ state?: unknown;
39
+ history?: 'auto' | 'push' | 'replace';
40
+ info?: unknown;
41
+ }
42
+ export interface NavigationNavigateResult {
43
+ committed: Promise<void>;
44
+ finished: Promise<void>;
45
+ }
46
+ export interface Navigation extends EventTarget {
47
+ readonly currentEntry: NavigationHistoryEntry | null;
48
+ entries(): NavigationHistoryEntry[];
49
+ readonly canGoBack: boolean;
50
+ readonly canGoForward: boolean;
51
+ navigate(url: string | URL, options?: NavigationNavigateOptions): Promise<NavigationNavigateResult>;
52
+ back(): void;
53
+ forward(): void;
54
+ traverseTo(key: string, options?: {
55
+ info?: unknown;
56
+ }): NavigationNavigateResult;
57
+ updateCurrentEntry(options?: {
58
+ state?: unknown;
59
+ }): void;
60
+ }
61
+ export {};
62
+ //# sourceMappingURL=native-api-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-api-types.d.ts","sourceRoot":"","sources":["../src/native-api-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,CAAC,MAAM,CAAC;IAEX,MAAM,UAAU;oBACA,IAAI,CAAC,EAAE,cAAc;QACjC,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO;QAC7C,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,gBAAgB,GAAG,IAAI;KAChE;IAED,UAAU,cAAc;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB;IAED,UAAU,gBAAgB;QACtB,QAAQ,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAC;QAC7C,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAC;QAC3C,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAC;KAC5C;CACJ;AAGD,MAAM,WAAW,yBAAyB;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC3C,QAAQ,CAAC,YAAY,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACrD,OAAO,IAAI,sBAAsB,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CACJ,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,OAAO,CAAC,EAAE,yBAAyB,GACpC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrC,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,wBAAwB,CAAC;IAChF,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,OAAO,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Временные объявления нативного API до появления типов в lib.dom.
3
+ * Когда URLPattern и Navigation API появятся в TypeScript lib.dom — удалить этот файл
4
+ * и убрать реэкспорт из types.ts (или перейти на типы из lib).
5
+ *
6
+ * Источники: WHATWG URL Pattern Standard, MDN/WHATWG Navigation API.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=native-api-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-api-types.js","sourceRoot":"","sources":["../src/native-api-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyDH,OAAO,EAAE,CAAC"}
@@ -0,0 +1,98 @@
1
+ /** Строка — полный URL. */
2
+ export type UrlString = string;
3
+ /** Строка — паттерн пути (например '/users/:id'). */
4
+ export type PathPattern = string;
5
+ /** Строка — pathname, часть пути URL (например '/users/123'). */
6
+ export type Pathname = string;
7
+ /** Ключ записи в Navigation API (history entry key). */
8
+ export type NavigationEntryKey = string;
9
+ /** Индекс в истории навигации. */
10
+ export type HistoryIndex = number;
11
+ /** Имя параметра маршрута (ключ в params). */
12
+ export type RouteParamName = string;
13
+ /** Значение параметра маршрута (сегмент pathname). */
14
+ export type RouteParamValue = string;
15
+ /** Параметры маршрута: имя параметра → значение (из pathname по паттерну). */
16
+ export type RouteParams = Record<RouteParamName, RouteParamValue>;
17
+ /** Функция-матчер пути: pathname → matched и params. Для иерархических/кастомных маршрутов. */
18
+ export type PathMatcher = (pathname: Pathname) => {
19
+ matched: boolean;
20
+ params: RouteParams;
21
+ };
22
+ /** Извлекает тип params из строки паттерна: '/users/:id' → { id: string } */
23
+ export type ExtractRouteParams<T extends string> = T extends `${string}:${infer Param}/${infer Rest}` ? {
24
+ [K in Param]: string;
25
+ } & ExtractRouteParams<`/${Rest}`> : T extends `${string}:${infer Param}` ? {
26
+ [K in Param]: string;
27
+ } : Record<string, never>;
28
+ /** Тип params для useRoute(pattern): литерал пути → типизированные ключи; PathMatcher → RouteParams; иначе {} */
29
+ export type ParamsForPath<P> = P extends PathMatcher ? RouteParams : [P] extends [string] ? string extends P ? RouteParams : ExtractRouteParams<P> : Record<string, never>;
30
+ export interface RouterState {
31
+ location: UrlString;
32
+ pathname: Pathname;
33
+ /** Только чтение. Мутировать не следует — не меняет реальный URL. */
34
+ searchParams: URLSearchParams;
35
+ params: RouteParams;
36
+ historyIndex: HistoryIndex;
37
+ /** true, если передан pattern и он совпал с pathname; false при несовпадении; undefined, если pattern не передан */
38
+ matched?: boolean;
39
+ }
40
+ export interface NavigateOptions {
41
+ /** 'replace' — заменить текущую запись, 'push' — новая запись, 'auto' — по умолчанию (браузер решает). */
42
+ history?: 'push' | 'replace' | 'auto';
43
+ /** Состояние записи в истории (Navigation API): произвольные данные, связанные с этим переходом; можно прочитать из currentEntry.getState() после навигации. Передаётся в navigate и replace в одном поле options.state. */
44
+ state?: unknown;
45
+ /** Базовый путь для этого вызова. undefined — из configureRouter; '' или '/' — не добавлять префикс; иначе — этот путь как префикс (переход по другому base). */
46
+ base?: string;
47
+ }
48
+ /** Опции хука useRoute: локальный базовый путь для поддерева (раздел приложения под своим подпутём). */
49
+ export interface UseRouteOptions {
50
+ /** Базовый путь для этого хука (раздел). pathname возвращается без этого префикса; navigate(to) по умолчанию добавляет его к относительным путям. Приоритет над глобальным base из configureRouter. '' или '/' — не добавлять префикс. */
51
+ base?: string;
52
+ }
53
+ export type UseRouteReturn<P extends string | PathMatcher | undefined = undefined> = Omit<RouterState, 'params'> & {
54
+ params: ParamsForPath<P>;
55
+ /** Резолвится при commit навигации (не обязательно при полном finish, см. Navigation API). */
56
+ navigate: (to: string | URL, options?: NavigateOptions) => Promise<void>;
57
+ back: () => void;
58
+ forward: () => void;
59
+ go: (delta: number) => void;
60
+ /** То же, что navigate(to, { ...options, history: 'replace' }). Опции те же, что у navigate (state, base); history игнорируется. */
61
+ replace: (to: string | URL, options?: NavigateOptions) => Promise<void>;
62
+ canGoBack: (steps?: number) => boolean;
63
+ canGoForward: (steps?: number) => boolean;
64
+ };
65
+ export type LoggerLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error';
66
+ export interface Logger {
67
+ trace(...args: unknown[]): void;
68
+ debug(...args: unknown[]): void;
69
+ info(...args: unknown[]): void;
70
+ warn(...args: unknown[]): void;
71
+ error(...args: unknown[]): void;
72
+ }
73
+ export interface RouterConfig {
74
+ /** Максимальное количество URL в кэше (по умолчанию: 50) */
75
+ urlCacheLimit: number;
76
+ /** Значение history по умолчанию для всех вызовов navigate() (по умолчанию: 'auto') */
77
+ defaultHistory?: 'push' | 'replace' | 'auto';
78
+ /** Логгер (по умолчанию: console) */
79
+ logger?: Logger;
80
+ /** Базовый путь приложения (например '/app'). pathname возвращается без base; navigate(to) добавляет base к относительным путям. */
81
+ base?: string;
82
+ /** Начальный URL для SSR: при рендере на сервере (нет window) используется этот URL для pathname/searchParams. Задаётся один раз перед рендером запроса (например request.url). */
83
+ initialLocation?: string;
84
+ }
85
+ /**
86
+ * Настройка глобальной конфигурации роутера
87
+ * Вызывается один раз при инициализации приложения
88
+ */
89
+ export declare function configureRouter(config: Partial<RouterConfig>): void;
90
+ /**
91
+ * Получить текущую конфигурацию (для внутреннего использования)
92
+ */
93
+ export declare function getRouterConfig(): RouterConfig;
94
+ /**
95
+ * Получить логгер (config.logger ?? console)
96
+ */
97
+ export declare function getLogger(): Logger;
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,24 @@
1
+ // Внутренняя конфигурация (не экспортируется)
2
+ let routerConfig = {
3
+ urlCacheLimit: 50,
4
+ };
5
+ /**
6
+ * Настройка глобальной конфигурации роутера
7
+ * Вызывается один раз при инициализации приложения
8
+ */
9
+ export function configureRouter(config) {
10
+ routerConfig = { ...routerConfig, ...config };
11
+ }
12
+ /**
13
+ * Получить текущую конфигурацию (для внутреннего использования)
14
+ */
15
+ export function getRouterConfig() {
16
+ return routerConfig;
17
+ }
18
+ /**
19
+ * Получить логгер (config.logger ?? console)
20
+ */
21
+ export function getLogger() {
22
+ return routerConfig.logger ?? console;
23
+ }
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiHA,8CAA8C;AAC9C,IAAI,YAAY,GAAiB;IAC7B,aAAa,EAAE,EAAE;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B;IACzD,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,MAAM,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO,YAAY,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACrB,OAAO,YAAY,CAAC,MAAM,IAAI,OAAO,CAAC;AAC1C,CAAC"}