@owlmeans/router 0.1.14 → 0.1.15

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.
@@ -7,7 +7,7 @@ applyTo: "**/*.ts, **/*.tsx"
7
7
  # @owlmeans/router
8
8
 
9
9
  **Layer:** Core (L1)
10
- **Install:** `"@owlmeans/router": "^0.1.14"` in `dependencies`
10
+ **Install:** `"@owlmeans/router": "^0.1.15"` in `dependencies`
11
11
 
12
12
  The plugin **host** for OwlMeans UI routing. Defines the contract, holds a registry of routing
13
13
  plugins, and selects the active one by cascade. Concrete mechanics are plugins:
@@ -35,6 +35,14 @@ import { ROUTER_SERVICE } from '@owlmeans/router'
35
35
  ctx.service(ROUTER_SERVICE).useParams() // delegates to the active plugin
36
36
  ```
37
37
 
38
+ ## The host is a LAZY service
39
+
40
+ `makeRouterService` builds a **lazy** service (`createLazyService`) — the host has no async setup,
41
+ and plugin packages must reach it from an app's `makeContext`, i.e. while the context is still in
42
+ the Loading stage. `context.service()` throws for an uninitialized non-lazy service, which would
43
+ break `ensureRouterService` (and every `appendXxxRouter` on an existing host) exactly where apps
44
+ are told to call them. Keep it lazy when extending the host.
45
+
38
46
  ## Depends On
39
47
 
40
48
  - `@owlmeans/context`; peer `react` (types only — no react-router, no DOM here)
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@owlmeans/router",
4
- "version": "0.1.14",
5
- "generatedAt": "2026-08-05T16:56:53.383Z",
4
+ "version": "0.1.15",
5
+ "generatedAt": "2026-08-07T17:06:32.907Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/router
9
9
 
10
10
  **Layer:** Core (L1)
11
- **Install:** `"@owlmeans/router": "^0.1.14"` in `dependencies`
11
+ **Install:** `"@owlmeans/router": "^0.1.15"` in `dependencies`
12
12
 
13
13
  `@owlmeans/router` is the **plugin host** for OwlMeans UI routing. It does not talk to any
14
14
  concrete router; it defines the contract, holds a registry of routing plugins, and selects the
@@ -42,6 +42,15 @@ import { ROUTER_SERVICE } from '@owlmeans/router'
42
42
  const params = ctx.service(ROUTER_SERVICE).useParams() // delegates to the active plugin
43
43
  ```
44
44
 
45
+ ## The host is a LAZY service
46
+
47
+ `makeRouterService` builds a **lazy** service (`createLazyService`). The host carries no async
48
+ setup, and plugin packages must be able to reach it from an app's `makeContext` — i.e. while the
49
+ context is still in the Loading stage. `context.service()` throws for an uninitialized non-lazy
50
+ service, which would make `ensureRouterService` (and therefore `appendReactRouter` /
51
+ `appendWebRouter` on an existing host) fail exactly where apps are told to call them. Keep the host
52
+ lazy when extending it.
53
+
45
54
  ## Native-safety invariant
46
55
 
47
56
  The facade methods are **plain writable instance properties**, never getters — the native router
@@ -8,6 +8,13 @@ import type { RouterService } from "./types.js";
8
8
  * The facade methods stay ordinary writable properties (never getters) so that
9
9
  * non-plugin implementations — e.g. the native router — can keep overriding them
10
10
  * directly, exactly as `web-router` did before the plugin model.
11
+ *
12
+ * It is a LAZY service on purpose. The host carries no async setup, and plugin
13
+ * packages must be able to reach it from an app's `makeContext` — i.e. while the
14
+ * context is still in the Loading stage. `context.service()` throws for an
15
+ * uninitialized non-lazy service, which would make `ensureRouterService` (and
16
+ * therefore `appendReactRouter` / `appendWebRouter` on an existing host) fail
17
+ * exactly where apps are told to call them.
11
18
  */
12
19
  export declare const makeRouterService: (alias?: string) => RouterService;
13
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EACV,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAO,MAAsB,KAAG,aAwCjE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,YAAY,CAAC,GAAG,CAAC,KAAG,aAO5D,CAAA"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EACV,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAO,MAAsB,KAAG,aAwCjE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,YAAY,CAAC,GAAG,CAAC,KAAG,aAO5D,CAAA"}
package/build/service.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createService } from "@owlmeans/context";
1
+ import { createLazyService } from "@owlmeans/context";
2
2
  import { DEFAULT_ALIAS } from "./consts.js";
3
3
  import { defaultRouterEnv } from "./env.js";
4
4
  /**
@@ -9,10 +9,17 @@ import { defaultRouterEnv } from "./env.js";
9
9
  * The facade methods stay ordinary writable properties (never getters) so that
10
10
  * non-plugin implementations — e.g. the native router — can keep overriding them
11
11
  * directly, exactly as `web-router` did before the plugin model.
12
+ *
13
+ * It is a LAZY service on purpose. The host carries no async setup, and plugin
14
+ * packages must be able to reach it from an app's `makeContext` — i.e. while the
15
+ * context is still in the Loading stage. `context.service()` throws for an
16
+ * uninitialized non-lazy service, which would make `ensureRouterService` (and
17
+ * therefore `appendReactRouter` / `appendWebRouter` on an existing host) fail
18
+ * exactly where apps are told to call them.
12
19
  */
13
20
  export const makeRouterService = (alias = DEFAULT_ALIAS) => {
14
21
  const plugins = [];
15
- const service = createService(alias, {
22
+ const service = createLazyService(alias, {
16
23
  registerPlugin: plugin => {
17
24
  const existing = plugins.findIndex(candidate => candidate.alias === plugin.alias);
18
25
  if (existing >= 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAK3C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,aAAa,EAAiB,EAAE;IAChF,MAAM,OAAO,GAAmB,EAAE,CAAA;IAElC,MAAM,OAAO,GAAkB,aAAa,CAAgB,KAAK,EAAE;QACjE,cAAc,EAAE,MAAM,CAAC,EAAE;YACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAA;YACjF,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YAC7B,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/D,CAAC;QAED,MAAM,EAAE,GAAG,CAAC,EAAE;YACZ,MAAM,WAAW,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAA;YAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAoC,CAAA;YACxD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAA;YACrF,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACtE,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;QAEvC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAE3C,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAkB;QAEhE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QAEjD,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QAEjD,eAAe,EAAE,CAAC,CAAC,IAA+C,EAAE,EAAE,CACpE,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAwB;QAEhE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAoC,CAAC;KAClG,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAsB,EAAiB,EAAE;IAC3E,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,OAAO,CAAgB,aAAa,CAAC,CAAA;IAClD,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAK3C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,aAAa,EAAiB,EAAE;IAChF,MAAM,OAAO,GAAmB,EAAE,CAAA;IAElC,MAAM,OAAO,GAAkB,iBAAiB,CAAgB,KAAK,EAAE;QACrE,cAAc,EAAE,MAAM,CAAC,EAAE;YACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAA;YACjF,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YAC7B,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/D,CAAC;QAED,MAAM,EAAE,GAAG,CAAC,EAAE;YACZ,MAAM,WAAW,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAA;YAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAoC,CAAA;YACxD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAA;YACrF,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACtE,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;QAEvC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAE3C,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAkB;QAEhE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QAEjD,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QAEjD,eAAe,EAAE,CAAC,CAAC,IAA+C,EAAE,EAAE,CACpE,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAwB;QAEhE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAoC,CAAC;KAClG,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAsB,EAAiB,EAAE;IAC3E,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,OAAO,CAAgB,aAAa,CAAC,CAAA;IAClD,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
package/build/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { InitializedService, BasicContext } from "@owlmeans/context";
1
+ import type { LazyService, BasicContext } from "@owlmeans/context";
2
2
  import type { ComponentType } from 'react';
3
3
  export type { ComponentType };
4
4
  export type LibraryRouter = unknown;
@@ -45,7 +45,7 @@ export interface RouterPlugin {
45
45
  useNavigate: UseNavigateHook;
46
46
  useSearchParams: UseSearchParamsHook;
47
47
  }
48
- export interface RouterService extends InitializedService {
48
+ export interface RouterService extends LazyService {
49
49
  registerPlugin: (plugin: RouterPlugin) => void;
50
50
  /** Select the active plugin for the given (or default) environment. */
51
51
  plugin: (env?: RouterEnv) => RouterPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/router",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -21,7 +21,7 @@
21
21
  }
22
22
  },
23
23
  "dependencies": {
24
- "@owlmeans/context": "^0.1.14"
24
+ "@owlmeans/context": "^0.1.15"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "react": "*"
package/src/service.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { createService } from "@owlmeans/context"
1
+ import { createLazyService } from "@owlmeans/context"
2
2
  import type { BasicContext } from "@owlmeans/context"
3
3
  import { DEFAULT_ALIAS } from "./consts.js"
4
4
  import { defaultRouterEnv } from "./env.js"
@@ -14,11 +14,18 @@ import type {
14
14
  * The facade methods stay ordinary writable properties (never getters) so that
15
15
  * non-plugin implementations — e.g. the native router — can keep overriding them
16
16
  * directly, exactly as `web-router` did before the plugin model.
17
+ *
18
+ * It is a LAZY service on purpose. The host carries no async setup, and plugin
19
+ * packages must be able to reach it from an app's `makeContext` — i.e. while the
20
+ * context is still in the Loading stage. `context.service()` throws for an
21
+ * uninitialized non-lazy service, which would make `ensureRouterService` (and
22
+ * therefore `appendReactRouter` / `appendWebRouter` on an existing host) fail
23
+ * exactly where apps are told to call them.
17
24
  */
18
25
  export const makeRouterService = (alias: string = DEFAULT_ALIAS): RouterService => {
19
26
  const plugins: RouterPlugin[] = []
20
27
 
21
- const service: RouterService = createService<RouterService>(alias, {
28
+ const service: RouterService = createLazyService<RouterService>(alias, {
22
29
  registerPlugin: plugin => {
23
30
  const existing = plugins.findIndex(candidate => candidate.alias === plugin.alias)
24
31
  if (existing >= 0) {
package/src/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { InitializedService, BasicContext } from "@owlmeans/context"
1
+ import type { LazyService, BasicContext } from "@owlmeans/context"
2
2
  import type { ComponentType } from 'react'
3
3
  export type { ComponentType }
4
4
 
@@ -51,7 +51,7 @@ export interface RouterPlugin {
51
51
  useSearchParams: UseSearchParamsHook
52
52
  }
53
53
 
54
- export interface RouterService extends InitializedService {
54
+ export interface RouterService extends LazyService {
55
55
  registerPlugin: (plugin: RouterPlugin) => void
56
56
  /** Select the active plugin for the given (or default) environment. */
57
57
  plugin: (env?: RouterEnv) => RouterPlugin