@geometra/router 1.16.0 → 1.18.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/dist/history.d.ts +4 -0
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +8 -2
- package/dist/history.js.map +1 -1
- package/dist/link.d.ts +1 -1
- package/dist/link.d.ts.map +1 -1
- package/dist/link.js +12 -3
- package/dist/link.js.map +1 -1
- package/dist/matcher.d.ts +2 -0
- package/dist/matcher.d.ts.map +1 -1
- package/dist/matcher.js +4 -0
- package/dist/matcher.js.map +1 -1
- package/dist/ranking.d.ts +7 -1
- package/dist/ranking.d.ts.map +1 -1
- package/dist/ranking.js +9 -1
- package/dist/ranking.js.map +1 -1
- package/package.json +2 -2
package/dist/history.d.ts
CHANGED
|
@@ -40,12 +40,16 @@ type MemoryHistoryOptions = {
|
|
|
40
40
|
* - Empty `initialEntries` becomes a single `"/"` entry.
|
|
41
41
|
* - `initialIndex` is clamped to the stack; default is the last entry.
|
|
42
42
|
* - `go(0)` does not notify listeners.
|
|
43
|
+
* - Non-finite `delta` (`NaN`, `±Infinity`) is a no-op (does not move the index or notify).
|
|
44
|
+
* - Values that are not primitive finite numbers (`bigint`, strings, objects, etc.) are also no-ops so
|
|
45
|
+
* `index + delta` never mixes types (BigInt + number throws).
|
|
43
46
|
*/
|
|
44
47
|
export declare function createMemoryHistory(options?: MemoryHistoryOptions): HistoryAdapter;
|
|
45
48
|
/**
|
|
46
49
|
* Wraps the real (or injected) `window.history` and `popstate`.
|
|
47
50
|
*
|
|
48
51
|
* `push` / `replace` update `history` state and notify listeners; `go` delegates to `history.go` (async relative to `popstate`).
|
|
52
|
+
* Non-finite `delta` is ignored so corrupt host data never reaches the native history API.
|
|
49
53
|
* Throws if no `window` is available unless {@link BrowserHistoryOptions.window} is provided.
|
|
50
54
|
*/
|
|
51
55
|
export declare function createBrowserHistory(options?: BrowserHistoryOptions): HistoryAdapter;
|
package/dist/history.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAA;CACnC,CAAA;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAA;AAEpC;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,WAAW,CAAA;CAC/D;AAED,4EAA4E;AAC5E,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,kBAAkB,GAAG,qBAAqB,CAAC,CAAA;CAC3F,CAAA;AAmBD,KAAK,oBAAoB,GAAG;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAA;CACnC,CAAA;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAA;AAEpC;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,WAAW,CAAA;CAC/D;AAED,4EAA4E;AAC5E,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,kBAAkB,GAAG,qBAAqB,CAAC,CAAA;CAC3F,CAAA;AAmBD,KAAK,oBAAoB,GAAG;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,cAAc,CAgDtF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAuDxF"}
|
package/dist/history.js
CHANGED
|
@@ -19,6 +19,9 @@ function locationFromWindow(windowLike) {
|
|
|
19
19
|
* - Empty `initialEntries` becomes a single `"/"` entry.
|
|
20
20
|
* - `initialIndex` is clamped to the stack; default is the last entry.
|
|
21
21
|
* - `go(0)` does not notify listeners.
|
|
22
|
+
* - Non-finite `delta` (`NaN`, `±Infinity`) is a no-op (does not move the index or notify).
|
|
23
|
+
* - Values that are not primitive finite numbers (`bigint`, strings, objects, etc.) are also no-ops so
|
|
24
|
+
* `index + delta` never mixes types (BigInt + number throws).
|
|
22
25
|
*/
|
|
23
26
|
export function createMemoryHistory(options = {}) {
|
|
24
27
|
const entries = (options.initialEntries ?? ['/']).map(parseToLocation);
|
|
@@ -52,10 +55,10 @@ export function createMemoryHistory(options = {}) {
|
|
|
52
55
|
notify('replace');
|
|
53
56
|
},
|
|
54
57
|
go(delta) {
|
|
55
|
-
if (Number.
|
|
58
|
+
if (!Number.isFinite(delta))
|
|
56
59
|
return;
|
|
57
60
|
const sum = index + delta;
|
|
58
|
-
if (Number.
|
|
61
|
+
if (!Number.isFinite(sum))
|
|
59
62
|
return;
|
|
60
63
|
const nextIndex = Math.max(0, Math.min(sum, entries.length - 1));
|
|
61
64
|
if (nextIndex === index)
|
|
@@ -73,6 +76,7 @@ export function createMemoryHistory(options = {}) {
|
|
|
73
76
|
* Wraps the real (or injected) `window.history` and `popstate`.
|
|
74
77
|
*
|
|
75
78
|
* `push` / `replace` update `history` state and notify listeners; `go` delegates to `history.go` (async relative to `popstate`).
|
|
79
|
+
* Non-finite `delta` is ignored so corrupt host data never reaches the native history API.
|
|
76
80
|
* Throws if no `window` is available unless {@link BrowserHistoryOptions.window} is provided.
|
|
77
81
|
*/
|
|
78
82
|
export function createBrowserHistory(options = {}) {
|
|
@@ -110,6 +114,8 @@ export function createBrowserHistory(options = {}) {
|
|
|
110
114
|
notify('replace');
|
|
111
115
|
},
|
|
112
116
|
go(delta) {
|
|
117
|
+
if (!Number.isFinite(delta))
|
|
118
|
+
return;
|
|
113
119
|
windowLike.history.go(delta);
|
|
114
120
|
},
|
|
115
121
|
listen(listener) {
|
package/dist/history.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAqCA,SAAS,eAAe,CAAC,EAAU;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAA;IACjD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG;QAC7B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAoC;IAC9D,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG;QAC7C,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE;QACxC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE;KACrC,CAAA;AACH,CAAC;AAOD
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|
package/dist/link.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export type LinkProps = FlexProps & StyleProps & {
|
|
|
16
16
|
*
|
|
17
17
|
* - **Pointer**: `onClick` calls your handler first, then `router.navigate(to, { replace })`.
|
|
18
18
|
* - **Keyboard**: `onKeyDown` runs first; **Enter**, **NumpadEnter**, **Space** (`' '`), and legacy **Spacebar**
|
|
19
|
-
* then navigate
|
|
19
|
+
* then navigate when **Ctrl / Meta / Alt** are not held (modified chords skip in-app navigation so hosts can bind alternatives).
|
|
20
20
|
*
|
|
21
21
|
* Layout and style props are forwarded to {@link import('@geometra/core').box} like any other box element.
|
|
22
22
|
*/
|
package/dist/link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAChJ,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,MAAM,SAAS,GAAG,SAAS,GAC/B,UAAU,GAAG;IACX,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC9C,CAAA;
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAChJ,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,MAAM,SAAS,GAAG,SAAS,GAC/B,UAAU,GAAG;IACX,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC9C,CAAA;AAeH;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,GAAE,SAAS,EAAO,GAAG,UAAU,CAuC7E"}
|
package/dist/link.js
CHANGED
|
@@ -2,20 +2,29 @@ import { box } from '@geometra/core';
|
|
|
2
2
|
function isActivationKey(key) {
|
|
3
3
|
return key === 'Enter' || key === 'NumpadEnter' || key === ' ' || key === 'Spacebar';
|
|
4
4
|
}
|
|
5
|
+
/** True when Enter/Space should perform default link navigation (no ctrl/meta/alt chord). */
|
|
6
|
+
function isUnmodifiedActivation(event) {
|
|
7
|
+
return !event.ctrlKey && !event.metaKey && !event.altKey;
|
|
8
|
+
}
|
|
9
|
+
function isDirection(value) {
|
|
10
|
+
return value === 'ltr' || value === 'rtl' || value === 'auto';
|
|
11
|
+
}
|
|
5
12
|
/**
|
|
6
13
|
* Declarative navigation target: a focusable box with link semantics (`role: link`, `tag: a`) and
|
|
7
14
|
* `cursor: pointer` unless overridden.
|
|
8
15
|
*
|
|
9
16
|
* - **Pointer**: `onClick` calls your handler first, then `router.navigate(to, { replace })`.
|
|
10
17
|
* - **Keyboard**: `onKeyDown` runs first; **Enter**, **NumpadEnter**, **Space** (`' '`), and legacy **Spacebar**
|
|
11
|
-
* then navigate
|
|
18
|
+
* then navigate when **Ctrl / Meta / Alt** are not held (modified chords skip in-app navigation so hosts can bind alternatives).
|
|
12
19
|
*
|
|
13
20
|
* Layout and style props are forwarded to {@link import('@geometra/core').box} like any other box element.
|
|
14
21
|
*/
|
|
15
22
|
export function link(props, children = []) {
|
|
16
|
-
const { to, router, replace, key, semantic, onClick, onKeyDown, cursor, ...styleAndLayout } = props;
|
|
23
|
+
const { to, router, replace, key, semantic, onClick, onKeyDown, cursor, dir, ...styleAndLayout } = props;
|
|
24
|
+
const normalizedDir = isDirection(dir) ? dir : undefined;
|
|
17
25
|
return box({
|
|
18
26
|
...styleAndLayout,
|
|
27
|
+
...(normalizedDir ? { dir: normalizedDir } : {}),
|
|
19
28
|
cursor: cursor ?? 'pointer',
|
|
20
29
|
key,
|
|
21
30
|
semantic: {
|
|
@@ -29,7 +38,7 @@ export function link(props, children = []) {
|
|
|
29
38
|
},
|
|
30
39
|
onKeyDown: (event) => {
|
|
31
40
|
onKeyDown?.(event);
|
|
32
|
-
if (isActivationKey(event.key)) {
|
|
41
|
+
if (isActivationKey(event.key) && isUnmodifiedActivation(event)) {
|
|
33
42
|
router.navigate(to, { replace });
|
|
34
43
|
}
|
|
35
44
|
},
|
package/dist/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA8G,MAAM,gBAAgB,CAAA;AAehJ,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,UAAU,CAAA;AACtF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAC,KAAgB,EAAE,WAAwB,EAAE;IAC/D,MAAM,EACJ,EAAE,EACF,MAAM,EACN,OAAO,EACP,GAAG,EACH,QAAQ,EACR,OAAO,EACP,SAAS,EACT,MAAM,EACN,GAAG,cAAc,EAClB,GAAG,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA8G,MAAM,gBAAgB,CAAA;AAehJ,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,UAAU,CAAA;AACtF,CAAC;AAED,6FAA6F;AAC7F,SAAS,sBAAsB,CAAC,KAAuB;IACrD,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,CAAA;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAC,KAAgB,EAAE,WAAwB,EAAE;IAC/D,MAAM,EACJ,EAAE,EACF,MAAM,EACN,OAAO,EACP,GAAG,EACH,QAAQ,EACR,OAAO,EACP,SAAS,EACT,MAAM,EACN,GAAG,EACH,GAAG,cAAc,EAClB,GAAG,KAAK,CAAA;IACT,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IAExD,OAAO,GAAG,CACR;QACE,GAAG,cAAc;QACjB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,EAAE,MAAM,IAAI,SAAS;QAC3B,GAAG;QACH,QAAQ,EAAE;YACR,GAAG,QAAQ;YACX,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG;YACzB,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,MAAM;SAC/B;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;YAChB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAClC,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,SAAS,EAAE,CAAC,KAAK,CAAC,CAAA;YAClB,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;KACF,EACD,QAAQ,CACT,CAAA;AACH,CAAC"}
|
package/dist/matcher.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export type RouteMatch = {
|
|
|
18
18
|
* - Each captured segment is passed through `decodeURIComponent`; invalid `%` sequences are left as-is.
|
|
19
19
|
* - An empty `pattern` (`''`) parses to zero segments and matches only the root pathname (`/` or `''` after
|
|
20
20
|
* normalization), with empty `params`. Any non-root path misses.
|
|
21
|
+
* - Non-string `pattern` or `pathname` (e.g. `null` from loose deserialization) returns `null` without throwing,
|
|
22
|
+
* matching the router package’s other string guards (see {@link import('./query.js').parseQuery}).
|
|
21
23
|
*
|
|
22
24
|
* @param pattern - Route pattern (`:id`, optional `?` segments, `*` splat); leading `/` optional.
|
|
23
25
|
* @param pathname - Path to match; `?` and `#` are stripped before comparison. Trailing `/` is normalized
|
package/dist/matcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B,CAAA;AA6GD
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B,CAAA;AA6GD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU9E"}
|
package/dist/matcher.js
CHANGED
|
@@ -99,6 +99,8 @@ function matchRecursive(segments, pathnameSegments, segmentIndex, pathIndex, par
|
|
|
99
99
|
* - Each captured segment is passed through `decodeURIComponent`; invalid `%` sequences are left as-is.
|
|
100
100
|
* - An empty `pattern` (`''`) parses to zero segments and matches only the root pathname (`/` or `''` after
|
|
101
101
|
* normalization), with empty `params`. Any non-root path misses.
|
|
102
|
+
* - Non-string `pattern` or `pathname` (e.g. `null` from loose deserialization) returns `null` without throwing,
|
|
103
|
+
* matching the router package’s other string guards (see {@link import('./query.js').parseQuery}).
|
|
102
104
|
*
|
|
103
105
|
* @param pattern - Route pattern (`:id`, optional `?` segments, `*` splat); leading `/` optional.
|
|
104
106
|
* @param pathname - Path to match; `?` and `#` are stripped before comparison. Trailing `/` is normalized
|
|
@@ -106,6 +108,8 @@ function matchRecursive(segments, pathnameSegments, segmentIndex, pathIndex, par
|
|
|
106
108
|
* @returns `{ params }` on success, or `null` when the pathname does not match.
|
|
107
109
|
*/
|
|
108
110
|
export function matchPath(pattern, pathname) {
|
|
111
|
+
if (typeof pattern !== 'string' || typeof pathname !== 'string')
|
|
112
|
+
return null;
|
|
109
113
|
const segments = parseSegments(pattern);
|
|
110
114
|
const normalizedPath = normalizePath(pathname, true);
|
|
111
115
|
const trimmedPath = trimSlashes(normalizedPath);
|
package/dist/matcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"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"}
|
package/dist/ranking.d.ts
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Sum specificity scores for each path segment in `pattern` (after the same leading/trailing slash trim
|
|
3
3
|
* as {@link matchPath} / {@link buildPath}). Static segments weigh highest, then params, optional
|
|
4
|
-
* segments, then splats
|
|
4
|
+
* segments, then splats (any segment whose first character is `*`, including named splats like `*rest`).
|
|
5
|
+
* Empty segments produced by doubled slashes (e.g. `/a//b`) count as extra
|
|
5
6
|
* static segments so ranking depth stays aligned with {@link matchPath} segment lists.
|
|
7
|
+
*
|
|
8
|
+
* Non-string runtime values (bad casts, loose deserialization) score as **0**, same as an empty pattern,
|
|
9
|
+
* so dynamic route tables cannot throw while ranking.
|
|
6
10
|
*/
|
|
7
11
|
export declare function scorePathPattern(pattern: string): number;
|
|
8
12
|
/**
|
|
9
13
|
* Comparator for sorting patterns from most specific to least: higher {@link scorePathPattern} wins;
|
|
10
14
|
* on a tie, the deeper pattern (more segments) wins. Return value follows `Array.prototype.sort` —
|
|
11
15
|
* negative when `a` should sort before `b` (i.e. `a` is more specific).
|
|
16
|
+
*
|
|
17
|
+
* Non-string arguments are treated like empty patterns via {@link scorePathPattern} / internal segment parsing.
|
|
12
18
|
*/
|
|
13
19
|
export declare function comparePatternSpecificity(a: string, b: string): number;
|
|
14
20
|
//# sourceMappingURL=ranking.d.ts.map
|
package/dist/ranking.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAwCA;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAUtE"}
|
package/dist/ranking.js
CHANGED
|
@@ -2,6 +2,8 @@ function trimSlashes(value) {
|
|
|
2
2
|
return value.replace(/^\/+|\/+$/g, '');
|
|
3
3
|
}
|
|
4
4
|
function parseRankedSegments(pattern) {
|
|
5
|
+
if (typeof pattern !== 'string')
|
|
6
|
+
return [];
|
|
5
7
|
const trimmed = trimSlashes(pattern);
|
|
6
8
|
if (trimmed === '')
|
|
7
9
|
return [];
|
|
@@ -36,8 +38,12 @@ function scoreSegment(segment) {
|
|
|
36
38
|
/**
|
|
37
39
|
* Sum specificity scores for each path segment in `pattern` (after the same leading/trailing slash trim
|
|
38
40
|
* as {@link matchPath} / {@link buildPath}). Static segments weigh highest, then params, optional
|
|
39
|
-
* segments, then splats
|
|
41
|
+
* segments, then splats (any segment whose first character is `*`, including named splats like `*rest`).
|
|
42
|
+
* Empty segments produced by doubled slashes (e.g. `/a//b`) count as extra
|
|
40
43
|
* static segments so ranking depth stays aligned with {@link matchPath} segment lists.
|
|
44
|
+
*
|
|
45
|
+
* Non-string runtime values (bad casts, loose deserialization) score as **0**, same as an empty pattern,
|
|
46
|
+
* so dynamic route tables cannot throw while ranking.
|
|
41
47
|
*/
|
|
42
48
|
export function scorePathPattern(pattern) {
|
|
43
49
|
const segments = parseRankedSegments(pattern);
|
|
@@ -47,6 +53,8 @@ export function scorePathPattern(pattern) {
|
|
|
47
53
|
* Comparator for sorting patterns from most specific to least: higher {@link scorePathPattern} wins;
|
|
48
54
|
* on a tie, the deeper pattern (more segments) wins. Return value follows `Array.prototype.sort` —
|
|
49
55
|
* negative when `a` should sort before `b` (i.e. `a` is more specific).
|
|
56
|
+
*
|
|
57
|
+
* Non-string arguments are treated like empty patterns via {@link scorePathPattern} / internal segment parsing.
|
|
50
58
|
*/
|
|
51
59
|
export function comparePatternSpecificity(a, b) {
|
|
52
60
|
const scoreA = scorePathPattern(a);
|
package/dist/ranking.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ranking.js","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAIA,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAE7B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAA;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,gBAAyB,EAAE,CAAA;YACnE,OAAO,EAAE,IAAI,EAAE,iBAA0B,EAAE,CAAA;QAC7C,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAA;QAC3D,OAAO,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB;IAC1C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO;YACV,OAAO,GAAG,CAAA;QACZ,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAA;QACZ,KAAK,gBAAgB;YACnB,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO;YACV,OAAO,CAAC,CAAA;IACZ,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"ranking.js","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAIA,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAE7B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAA;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,gBAAyB,EAAE,CAAA;YACnE,OAAO,EAAE,IAAI,EAAE,iBAA0B,EAAE,CAAA;QAC7C,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAA;QAC3D,OAAO,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB;IAC1C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO;YACV,OAAO,GAAG,CAAA;QACZ,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAA;QACZ,KAAK,gBAAgB;YACnB,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO;YACV,OAAO,CAAC,CAAA;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,CAAS,EAAE,CAAS;IAC5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAA;IAE7C,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAA;IAE7C,OAAO,CAAC,CAAA;AACV,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geometra/router",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.1",
|
|
4
4
|
"description": "Routing primitives for Geometra",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
"check": "tsc --noEmit"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@geometra/core": "^1.
|
|
37
|
+
"@geometra/core": "^1.18.1"
|
|
38
38
|
}
|
|
39
39
|
}
|