@owlmeans/web-router 0.1.18-rc.47 → 0.1.18-rc.49

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/README.md CHANGED
@@ -14,7 +14,7 @@ third-party router — react-router is a separate opt-in plugin,
14
14
  ## Installation
15
15
 
16
16
  ```bash
17
- bun add @owlmeans/web-router@^0.1.18-rc.47
17
+ bun add @owlmeans/web-router@^0.1.18-rc.49
18
18
  ```
19
19
 
20
20
  ## Usage
@@ -50,7 +50,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
50
50
  your project's skill store (`.agents/skills/`):
51
51
 
52
52
  ```sh
53
- npx @owlmeans/agent-skills@^0.1.18-rc.47
53
+ npx @owlmeans/agent-skills@^0.1.18-rc.49
54
54
  ```
55
55
 
56
56
  The embedded files are version-matched to this package release. Do not edit them
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/web-router",
4
- "version": "0.1.18-rc.47",
5
- "generatedAt": "2026-10-03T20:05:07.607Z",
4
+ "version": "0.1.18-rc.49",
5
+ "generatedAt": "2026-10-05T21:03:06.413Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/web-router
9
9
 
10
10
  **Layer:** Web (React), build level L2
11
- **Install:** `"@owlmeans/web-router": "^0.1.18-rc.47"` in `dependencies`
11
+ **Install:** `"@owlmeans/web-router": "^0.1.18-rc.49"` in `dependencies`
12
12
 
13
13
  This package **is the default OwlMeans in-browser router** — a minimal, react-router-free
14
14
  implementation of standard URL routing over the browser History API. It registers itself as a
@@ -1,4 +1,4 @@
1
- import { flattenRoutes, rankRouteBranches } from '@owlmeans/router';
1
+ import { routeMatcherHelper } from '@owlmeans/router';
2
2
  import { BROWSER_ROUTER } from '../consts.js';
3
3
  import { BrowserRouterProvider } from './provider.js';
4
4
  import { Outlet } from './outlet.js';
@@ -15,7 +15,7 @@ export const makeBrowserRouterPlugin = () => ({
15
15
  match: () => true,
16
16
  compile: routes => ({
17
17
  routes,
18
- branches: rankRouteBranches(flattenRoutes(routes))
18
+ branches: routeMatcherHelper.rankRouteBranches(routeMatcherHelper.flattenRoutes(routes))
19
19
  }),
20
20
  provider: () => BrowserRouterProvider,
21
21
  outlet: () => Outlet,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/browser/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGjF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAiB,EAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,cAAc;IACrB,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;IACjB,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM;QACN,QAAQ,EAAE,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;KACN,CAAA;IAC9C,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB;IACrC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;IACpB,SAAS;IACT,WAAW;IACX,WAAW;IACX,eAAe;CAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/browser/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGjF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAiB,EAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,cAAc;IACrB,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;IACjB,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM;QACN,QAAQ,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;KAC5C,CAAA;IAC9C,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB;IACrC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;IACpB,SAAS;IACT,WAAW;IACX,WAAW;IACX,eAAe;CAChB,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { createElement, useEffect, useMemo, useRef, useState } from 'react';
2
- import { matchRoutes } from '@owlmeans/router';
2
+ import { routeMatcherHelper } from '@owlmeans/router';
3
3
  import { createBrowserHistory } from './history.js';
4
4
  import { RouterStateContext } from './context.js';
5
5
  import { RouteChain } from './chain.js';
@@ -14,7 +14,7 @@ export const BrowserRouterProvider = ({ router }) => {
14
14
  const history = historyRef.current;
15
15
  const [location, setLocation] = useState(() => history.location);
16
16
  useEffect(() => history.listen(setLocation), []);
17
- const matches = useMemo(() => matchRoutes(lib.branches, location.pathname) ?? [], [lib, location.pathname]);
17
+ const matches = useMemo(() => routeMatcherHelper.matchRoutes(lib.branches, location.pathname) ?? [], [lib, location.pathname]);
18
18
  const navigate = useMemo(() => ((to, options) => {
19
19
  if (typeof to === 'number') {
20
20
  history.go(to);
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/browser/provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAkC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IACjF,MAAM,GAAG,GAAG,MAA0B,CAAA;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;IAElC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE1E,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAA;IAEhD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EACxD,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CACzB,CAAA;IAED,MAAM,QAAQ,GAAG,OAAO,CAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,EAA2E,EAAE,OAA4C,EAAE,EAAE;QAC9K,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACd,OAAM;QACR,CAAC;QACD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAA;YACzB,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,QAAQ;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAA;QAC5D,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CAAqB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAElC,OAAO,aAAa,CAClB,kBAAkB,CAAC,QAAQ,EAC3B,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAC1C,aAAa,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACxC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/browser/provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAkC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IACjF,MAAM,GAAG,GAAG,MAA0B,CAAA;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;IAElC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE1E,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAA;IAEhD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAC3E,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CACzB,CAAA;IAED,MAAM,QAAQ,GAAG,OAAO,CAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,EAA2E,EAAE,OAA4C,EAAE,EAAE;QAC9K,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACd,OAAM;QACR,CAAC;QACD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAA;YACzB,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,QAAQ;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAA;QAC5D,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CAAqB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAElC,OAAO,aAAa,CAClB,kBAAkB,CAAC,QAAQ,EAC3B,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAC1C,aAAa,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACxC,CAAA;AACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/web-router",
3
- "version": "0.1.18-rc.47",
3
+ "version": "0.1.18-rc.49",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -26,20 +26,20 @@
26
26
  },
27
27
  "devDependencies": {
28
28
  "@owlmeans/dep-config": "workspace:*",
29
- "@owlmeans/test-ui": "^0.1.18-rc.47",
30
- "@types/node": "^26.1.0",
31
- "@types/react": "^19.2.17",
32
- "@vitejs/plugin-react": "^6.0.3",
29
+ "@owlmeans/test-ui": "^0.1.18-rc.49",
30
+ "@types/node": "^26.6.4",
31
+ "@types/react": "^19.3.0",
32
+ "@vitejs/plugin-react": "^6.1.1",
33
33
  "nodemon": "^3.1.14",
34
- "playwright": "^1.61.1",
35
- "react": "^19.2.7",
36
- "react-dom": "^19.2.7",
34
+ "playwright": "^1.63.0",
35
+ "react": "^19.3.0",
36
+ "react-dom": "^19.3.0",
37
37
  "typescript": "^7.0.2",
38
- "vite": "^8.1.2"
38
+ "vite": "^8.3.2"
39
39
  },
40
40
  "dependencies": {
41
- "@owlmeans/context": "^0.1.18-rc.32",
42
- "@owlmeans/router": "^0.1.18-rc.31"
41
+ "@owlmeans/context": "^0.1.18-rc.34",
42
+ "@owlmeans/router": "^0.1.18-rc.33"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"
@@ -1,5 +1,5 @@
1
1
  import type { LibraryRouter, RouterPlugin } from '@owlmeans/router'
2
- import { flattenRoutes, rankRouteBranches } from '@owlmeans/router'
2
+ import { routeMatcherHelper } from '@owlmeans/router'
3
3
  import { BROWSER_ROUTER } from '../consts.js'
4
4
  import { BrowserRouterProvider } from './provider.js'
5
5
  import { Outlet } from './outlet.js'
@@ -18,7 +18,7 @@ export const makeBrowserRouterPlugin = (): RouterPlugin => ({
18
18
  match: () => true,
19
19
  compile: routes => ({
20
20
  routes,
21
- branches: rankRouteBranches(flattenRoutes(routes))
21
+ branches: routeMatcherHelper.rankRouteBranches(routeMatcherHelper.flattenRoutes(routes))
22
22
  } satisfies OwlLibraryRouter as LibraryRouter),
23
23
  provider: () => BrowserRouterProvider,
24
24
  outlet: () => Outlet,
@@ -1,7 +1,7 @@
1
1
  import type { FC } from 'react'
2
2
  import { createElement, useEffect, useMemo, useRef, useState } from 'react'
3
3
  import type { LibraryRouter, Location, NavigateFunction } from '@owlmeans/router'
4
- import { matchRoutes } from '@owlmeans/router'
4
+ import { routeMatcherHelper } from '@owlmeans/router'
5
5
  import { createBrowserHistory } from './history.js'
6
6
  import { RouterStateContext } from './context.js'
7
7
  import { RouteChain } from './chain.js'
@@ -22,7 +22,7 @@ export const BrowserRouterProvider: FC<{ router: LibraryRouter }> = ({ router })
22
22
  useEffect(() => history.listen(setLocation), [])
23
23
 
24
24
  const matches = useMemo(
25
- () => matchRoutes(lib.branches, location.pathname) ?? [],
25
+ () => routeMatcherHelper.matchRoutes(lib.branches, location.pathname) ?? [],
26
26
  [lib, location.pathname]
27
27
  )
28
28
 
@@ -1,14 +1,14 @@
1
1
  import { afterAll, describe, expect, test } from 'bun:test'
2
- import { closeBrowser, withPage } from '@owlmeans/test-ui'
3
2
  import { HARNESS_URL } from './context.js'
3
+ import { browserHelper } from '@owlmeans/test-ui'
4
4
 
5
5
  const at = (path: string) => new URL(path, HARNESS_URL).toString()
6
6
 
7
- afterAll(async () => { await closeBrowser() })
7
+ afterAll(async () => { await browserHelper.closeBrowser() })
8
8
 
9
9
  describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', () => {
10
10
  test('renders the index route inside the layout at /', async () => {
11
- await withPage(async page => {
11
+ await browserHelper.withPage(async page => {
12
12
  await page.goto(HARNESS_URL)
13
13
  await page.waitForSelector('#home')
14
14
  expect(await page.locator('#layout').isVisible()).toBe(true)
@@ -17,7 +17,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
17
17
  })
18
18
 
19
19
  test('programmatic navigate resolves nested route, params and search', async () => {
20
- await withPage(async page => {
20
+ await browserHelper.withPage(async page => {
21
21
  await page.goto(HARNESS_URL)
22
22
  await page.waitForSelector('#nav-user')
23
23
  await page.click('#nav-user')
@@ -33,7 +33,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
33
33
  })
34
34
 
35
35
  test('nested index route renders at /users', async () => {
36
- await withPage(async page => {
36
+ await browserHelper.withPage(async page => {
37
37
  await page.goto(HARNESS_URL)
38
38
  await page.waitForSelector('#nav-users')
39
39
  await page.click('#nav-users')
@@ -44,7 +44,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
44
44
  })
45
45
 
46
46
  test('static segment outranks the :id dynamic sibling', async () => {
47
- await withPage(async page => {
47
+ await browserHelper.withPage(async page => {
48
48
  await page.goto(at('users/settings'))
49
49
  await page.waitForSelector('#settings')
50
50
  expect(await page.locator('#settings').textContent()).toContain('settings-screen')
@@ -53,7 +53,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
53
53
  })
54
54
 
55
55
  test('deep-links directly to a :param URL (synchronous initial match)', async () => {
56
- await withPage(async page => {
56
+ await browserHelper.withPage(async page => {
57
57
  await page.goto(at('users/7?token=xyz'))
58
58
  await page.waitForSelector('#user')
59
59
  expect(await page.locator('#user').textContent()).toBe('user:7:token:xyz')
@@ -61,7 +61,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
61
61
  })
62
62
 
63
63
  test('renders through a component-less group at the top of the chain', async () => {
64
- await withPage(async page => {
64
+ await browserHelper.withPage(async page => {
65
65
  await page.goto(at('group/leaf'))
66
66
  await page.waitForSelector('#leaf')
67
67
  expect(await page.locator('#leaf').textContent()).toContain('leaf-screen')
@@ -71,7 +71,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
71
71
  })
72
72
 
73
73
  test('outlet falls through a component-less group in the middle of the chain', async () => {
74
- await withPage(async page => {
74
+ await browserHelper.withPage(async page => {
75
75
  await page.goto(at('users/nested/deep'))
76
76
  await page.waitForSelector('#deep')
77
77
  expect(await page.locator('#layout').isVisible()).toBe(true)
@@ -81,7 +81,7 @@ describe('@owlmeans/web-router — OwlMeans browser routing (chromium e2e)', ()
81
81
  })
82
82
 
83
83
  test('browser back/forward restores the matched route', async () => {
84
- await withPage(async page => {
84
+ await browserHelper.withPage(async page => {
85
85
  await page.goto(HARNESS_URL)
86
86
  await page.waitForSelector('#home')
87
87
  await page.click('#nav-user')