sinwan-router 1.0.0 → 1.0.2

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
@@ -29,7 +29,7 @@ Sinwan Router matches paths with a radix tree (no regex compilation), keeps rout
29
29
  - **Lazy routes + prefetch** — `() => import("./Page")` or `lazy(...)`. `Link` prefetch and `RouterOutlet` share one per-router cache.
30
30
  - **Browser-safe links** — `Link` leaves `_blank`, `download`, modifier clicks (`ctrl` / `meta` / `shift` / `alt`), external URLs, and same-page hashes to the browser.
31
31
 
32
- Peer dependency: **sinwan >= 1.3.0** (`<Key>` remounts when `cache` is omitted).
32
+ Peer dependency: **sinwan >= 1.3.3** (reactive native JSX attributes; `<Key>` remounts when `cache` is omitted).
33
33
 
34
34
  ## Install
35
35
 
@@ -96,24 +96,22 @@ There is no `RouterProvider` component. Provide the instance with `provide(Route
96
96
  import { Routes, Route, Link } from "sinwan-router";
97
97
 
98
98
  const App = cc(() => (
99
- <div>
99
+ <Routes>
100
100
  <nav>
101
101
  <Link href="/">Home</Link>
102
102
  <Link href="/users/1">Profile</Link>
103
103
  </nav>
104
- <Routes>
105
- <Route path="/" component={Home} />
106
- <Route path="/users/:id" component={UserProfile} />
107
- <Route path="/app" component={AppLayout} meta={{ title: "App" }}>
108
- <Route path="/" component={AppIndex} />
109
- <Route path="settings" component={Settings} />
110
- </Route>
111
- </Routes>
112
- </div>
104
+ <Route path="/" component={Home} />
105
+ <Route path="/users/:id" component={UserProfile} />
106
+ <Route path="/app" component={AppLayout} meta={{ title: "App" }}>
107
+ <Route path="/" component={AppIndex} />
108
+ <Route path="settings" component={Settings} />
109
+ </Route>
110
+ </Routes>
113
111
  ));
114
112
  ```
115
113
 
116
- `Routes` creates the router from those children, provides `RouterKey`, and renders a `<RouterOutlet />`. You can still pass `fallback`, `notFound`, `error`, and `initialPath`.
114
+ `Routes` collects `<Route>` children into a router, provides `RouterKey` to layout siblings (`Link`, `NavLink`), and renders a `<RouterOutlet />`. Put links **inside** `<Routes>` — they need that context. You can still pass `fallback`, `notFound`, `error`, and `initialPath`.
117
115
 
118
116
  ## Routes
119
117
 
package/dist/index.d.ts CHANGED
@@ -33,7 +33,7 @@ export { createRadixTree, radixInsert, radixSearch, buildPath, normalizePath, ex
33
33
  export type { RadixNode, RouteData, MatchResult } from "./matcher.ts";
34
34
  export { Link, NavLink, RouterOutlet } from "./components.tsx";
35
35
  export type { LinkProps, NavLinkProps, RouterOutletProps, } from "./components.tsx";
36
- export { Route, Routes, collectRouteDefinitions, isRouteElement } from "./jsx-routes.tsx";
36
+ export { Route, Routes, collectRouteDefinitions, isRouteElement, layoutNodes, } from "./jsx-routes.tsx";
37
37
  export type { RouteProps, RoutesProps } from "./jsx-routes.tsx";
38
38
  export { useRouter, useParams, useSearchParams, useRoute, useNavigate, usePath, RouterKey, } from "./hooks.ts";
39
39
  export type { RouteDefinition, RouteComponent, LazyComponent, MatchedRoute, NavigateOptions, RouterContextValue, LazyPeek, } from "./types.ts";
package/dist/index.js CHANGED
@@ -454,9 +454,6 @@ function usePath() {
454
454
  }
455
455
 
456
456
  // src/link-nav.ts
457
- function jsxClass(value) {
458
- return value;
459
- }
460
457
  function isExternalHref(href) {
461
458
  if (href.startsWith("//"))
462
459
  return true;
@@ -679,7 +676,7 @@ var NavLink = cc(({
679
676
  }) => {
680
677
  const router = useRouter();
681
678
  const className = computed2(() => router.path === href || router.path.startsWith(href + "/") ? `${cls ?? ""} ${activeClass}`.trim() : cls ?? "");
682
- return _$createTemplate(_$tmpl_1, [href, jsxClass(() => className.value), target, downloadAttr(download), rel, (e) => {
679
+ return _$createTemplate(_$tmpl_1, [href, className, target, downloadAttr(download), rel, (e) => {
683
680
  onLinkClick(e, href, router, {
684
681
  target,
685
682
  download
@@ -739,7 +736,7 @@ var RouterOutlet = cc(({
739
736
  });
740
737
  // src/jsx-routes.tsx
741
738
  import { cc as cc2, provide, onDispose } from "sinwan/component";
742
- import { jsxDEV as jsxDEV2 } from "sinwan/jsx-dev-runtime";
739
+ import { jsxDEV as jsxDEV2, Fragment } from "sinwan/jsx-dev-runtime";
743
740
  var ROUTE_TYPE = Symbol.for("sinwan.router.Route");
744
741
  function isElementLike(value) {
745
742
  return value != null && typeof value === "object" && "tag" in value;
@@ -850,6 +847,15 @@ function collectRouteDefinitions(children) {
850
847
  }
851
848
  return defs;
852
849
  }
850
+ function layoutNodes(children) {
851
+ const out = [];
852
+ for (const node of flattenNodes(children)) {
853
+ if (isRouteElement(node) || isRouteDefinition(node))
854
+ continue;
855
+ out.push(node);
856
+ }
857
+ return out;
858
+ }
853
859
  var Routes = cc2(({
854
860
  children,
855
861
  fallback,
@@ -862,11 +868,20 @@ var Routes = cc2(({
862
868
  onDispose(() => {
863
869
  router.dispose();
864
870
  });
865
- return /* @__PURE__ */ jsxDEV2(RouterOutlet, {
871
+ const outlet = /* @__PURE__ */ jsxDEV2(RouterOutlet, {
866
872
  fallback,
867
873
  notFound,
868
874
  error
869
875
  }, undefined, false, undefined, this);
876
+ const layout = layoutNodes(children);
877
+ if (layout.length === 0)
878
+ return outlet;
879
+ return /* @__PURE__ */ jsxDEV2(Fragment, {
880
+ children: [
881
+ layout,
882
+ outlet
883
+ ]
884
+ }, undefined, true, undefined, this);
870
885
  });
871
886
  export {
872
887
  Link,
@@ -883,6 +898,7 @@ export {
883
898
  extractSearchParams,
884
899
  isLazyComponent,
885
900
  isRouteElement,
901
+ layoutNodes,
886
902
  lazy,
887
903
  normalizePath,
888
904
  radixInsert,
@@ -895,5 +911,5 @@ export {
895
911
  useSearchParams
896
912
  };
897
913
 
898
- //# debugId=B05954AB6554A08764756E2164756E21
914
+ //# debugId=D61DE7C0A6BF0E7964756E2164756E21
899
915
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -4,13 +4,13 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * Sinwan Router — Core Router\n *\n * Manages route state, navigation, and matching using Sinwan's reactivity.\n * Uses a radix tree for O(depth) route lookups — no regex compilation.\n * SSR-safe: all DOM access is guarded by `typeof window` checks.\n */\n\nimport { signal, computed } from \"sinwan/reactivity\";\nimport type { Signal, Computed } from \"sinwan/reactivity\";\nimport type { SinwanComponent } from \"sinwan/component\";\nimport type {\n RouteDefinition,\n MatchedRoute,\n NavigateOptions,\n LazyComponent,\n LazyPeek,\n} from \"./types.ts\";\nimport {\n createRadixTree,\n radixInsert,\n radixSearch,\n normalizePath,\n extractSearchParams,\n type RadixNode,\n} from \"./matcher.ts\";\n\nfunction hasTrueFlag(value: object, key: string): boolean {\n return key in value && (value as Record<string, unknown>)[key] === true;\n}\n\n/**\n * True for explicit `lazy()` factories, `_SinwanLazy` brands, and zero-arg\n * `() => import(...)` loaders. `cc` components and functions that take props\n * are not treated as lazy importers.\n */\nexport function isLazyComponent(comp: unknown): comp is LazyComponent {\n if (typeof comp !== \"function\") return false;\n if (hasTrueFlag(comp, \"_SinwanComponent\")) return false;\n if (hasTrueFlag(comp, \"_SinwanLazy\")) return true;\n return comp.length === 0;\n}\n\n/** Mark a dynamic import factory as a lazy route component. */\nexport function lazy(\n loader: () => Promise<{ default: SinwanComponent }>,\n): LazyComponent {\n const factory = (): Promise<{ default: SinwanComponent }> => loader();\n return Object.assign(factory, { _SinwanLazy: true as const });\n}\n\n/** Internal leaf data stored in the radix tree. */\ninterface LeafData {\n route: RouteDefinition;\n fullPattern: string;\n /** Chain of (route, fullPattern) pairs from root to this leaf. */\n chain: { route: RouteDefinition; fullPattern: string }[];\n [key: string]: unknown;\n}\n\n/** The core router instance. */\nexport class Router {\n private readonly tree: RadixNode;\n private readonly routeList: RouteDefinition[];\n private readonly _path: Signal<string>;\n private readonly _searchParams: Signal<URLSearchParams>;\n private readonly _matched: Computed<MatchedRoute | null>;\n private readonly _params: Computed<Record<string, string>>;\n private readonly lazyCache = new Map<string, SinwanComponent>();\n private readonly lazyErrors = new Map<string, unknown>();\n private readonly lazyInflight = new Map<string, Promise<SinwanComponent>>();\n private readonly _lazyTick: Signal<number>;\n private popstateHandler: (() => void) | null = null;\n\n constructor(routes: RouteDefinition[], initialPath?: string) {\n this.tree = createRadixTree();\n this.routeList = [];\n this._lazyTick = signal(0);\n\n // Insert all routes (including nested) into the radix tree.\n // Static segments are inserted first so they're checked before\n // param segments during search (insertion order within siblings\n // determines search order, and static children are always checked\n // first in searchNode regardless).\n for (const route of routes) {\n this.insertRoute(route, \"\");\n }\n\n const startPath =\n initialPath ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\");\n\n this._path = signal(normalizePath(startPath));\n this._searchParams = signal(extractSearchParams(startPath));\n\n this._matched = computed(() => {\n const path = normalizePath(this._path.value);\n const result = radixSearch(this.tree, path);\n if (!result) return null;\n\n const leaf = result.data as LeafData;\n const params = result.params;\n\n // Build the matched route chain (parent → child).\n // The returned matched route is the deepest (leaf) match,\n // with `parent` pointing up the chain to the root.\n let parent: MatchedRoute | undefined;\n let matched: MatchedRoute | undefined;\n for (let i = 0; i < leaf.chain.length; i++) {\n const entry = leaf.chain[i]!;\n const m: MatchedRoute = {\n route: entry.route,\n params,\n path,\n matchedPath: entry.fullPattern,\n parent: i > 0 ? parent : undefined,\n };\n parent = m;\n matched = m; // last one is the deepest\n }\n return matched ?? null;\n });\n\n this._params = computed(() => {\n const matched = this._matched.value;\n return matched ? matched.params : {};\n });\n\n // Listen to popstate on the client\n if (typeof window !== \"undefined\") {\n this.popstateHandler = () => {\n const url = window.location.pathname + window.location.search;\n this._path.value = normalizePath(url);\n this._searchParams.value = extractSearchParams(url);\n };\n window.addEventListener(\"popstate\", this.popstateHandler);\n }\n }\n\n /** Recursively insert a route and its children into the tree. */\n private insertRoute(\n route: RouteDefinition,\n parentPath: string,\n parentChain: { route: RouteDefinition; fullPattern: string }[] = [],\n ): void {\n const fullPattern = joinPaths(parentPath, route.path);\n const chain = [...parentChain, { route, fullPattern }];\n const leafData: LeafData = { route, fullPattern, chain };\n\n radixInsert(this.tree, fullPattern, leafData);\n this.routeList.push(route);\n\n if (route.children) {\n for (const child of route.children) {\n this.insertRoute(child, fullPattern, chain);\n }\n }\n }\n\n private bumpLazyTick(): void {\n this._lazyTick.value = this._lazyTick.value + 1;\n }\n\n /** Reactive counter bumped when a lazy load succeeds or fails. */\n get lazyTick(): number {\n return this._lazyTick.value;\n }\n\n /** Current load snapshot for a lazy cache key (pattern). */\n peekLazy(cacheKey: string): LazyPeek {\n const cached = this.lazyCache.get(cacheKey);\n if (cached) return { status: \"ready\", component: cached };\n if (this.lazyInflight.has(cacheKey)) return { status: \"loading\" };\n if (this.lazyErrors.has(cacheKey)) {\n return { status: \"error\", error: this.lazyErrors.get(cacheKey) };\n }\n return { status: \"idle\" };\n }\n\n /**\n * Start a lazy import if needed. Does not retry a stored error\n * (the outlet keeps showing the error UI until navigation or prefetch).\n */\n ensureLazy(cacheKey: string, loader: LazyComponent): void {\n const state = this.peekLazy(cacheKey);\n if (state.status !== \"idle\") return;\n this.startLazyLoad(cacheKey, loader);\n }\n\n private startLazyLoad(\n cacheKey: string,\n loader: LazyComponent,\n ): Promise<SinwanComponent> {\n this.lazyErrors.delete(cacheKey);\n const pending = loader()\n .then((mod) => {\n this.lazyCache.set(cacheKey, mod.default);\n this.lazyErrors.delete(cacheKey);\n this.bumpLazyTick();\n return mod.default;\n })\n .catch((err: unknown) => {\n this.lazyErrors.set(cacheKey, err);\n this.bumpLazyTick();\n throw err;\n })\n .finally(() => {\n this.lazyInflight.delete(cacheKey);\n });\n this.lazyInflight.set(cacheKey, pending);\n pending.catch(() => {\n /* prefetch / outlet consume errors via peekLazy */\n });\n return pending;\n }\n\n /** Current URL path (reactive). */\n get path(): string {\n return this._path.value;\n }\n\n /** Current path signal (for fine-grained reactivity). */\n get pathSignal(): Signal<string> {\n return this._path;\n }\n\n /** Current matched route (reactive). */\n get matched(): MatchedRoute | null {\n return this._matched.value;\n }\n\n /** Current matched route computed (for fine-grained reactivity). */\n get matchedComputed(): Computed<MatchedRoute | null> {\n return this._matched;\n }\n\n /** Current route parameters (reactive). */\n get params(): Record<string, string> {\n return this._params.value;\n }\n\n /** Current search params (reactive). */\n get searchParams(): URLSearchParams {\n return this._searchParams.value;\n }\n\n /** All registered routes. */\n get routes(): RouteDefinition[] {\n return this.routeList;\n }\n\n /** Navigate to a new path. */\n navigate(to: string, options: NavigateOptions = {}): void {\n const normalized = normalizePath(to);\n\n if (typeof window !== \"undefined\") {\n if (options.replace) {\n window.history.replaceState(options.state ?? {}, \"\", to);\n } else {\n window.history.pushState(options.state ?? {}, \"\", to);\n }\n }\n\n this._path.value = normalized;\n this._searchParams.value = extractSearchParams(to);\n }\n\n /** Prefetch a route's lazy component into this router's cache. */\n prefetch(path: string): void {\n if (typeof window === \"undefined\") return;\n\n const normalized = normalizePath(path);\n const result = radixSearch(this.tree, normalized);\n if (!result) return;\n\n const leaf = result.data as LeafData;\n const route = leaf.route;\n if (!isLazyComponent(route.component)) return;\n\n const cacheKey = leaf.fullPattern;\n const state = this.peekLazy(cacheKey);\n if (state.status === \"ready\" || state.status === \"loading\") return;\n this.startLazyLoad(cacheKey, route.component);\n }\n\n /** Resolve a lazy component, using this instance's cache if available. */\n async resolveComponent(\n route: RouteDefinition,\n ): Promise<SinwanComponent> {\n if (!isLazyComponent(route.component)) {\n return route.component;\n }\n\n const cacheKey = this.findFullPattern(route) ?? route.path;\n const cached = this.lazyCache.get(cacheKey);\n if (cached) return cached;\n\n const inflight = this.lazyInflight.get(cacheKey);\n if (inflight) return inflight;\n\n return this.startLazyLoad(cacheKey, route.component);\n }\n\n /** Find the full pattern for a route. */\n private findFullPattern(route: RouteDefinition): string | undefined {\n return this.searchForRoute(this.tree, route, \"\");\n }\n\n private searchForRoute(\n node: RadixNode,\n target: RouteDefinition,\n pathSoFar: string,\n ): string | undefined {\n if (node.route) {\n const leaf = node.route as LeafData;\n if (leaf.route === target) return leaf.fullPattern;\n }\n for (const child of node.children) {\n const seg = child.isParam\n ? \"/:\" + child.paramName\n : child.isWildcard\n ? \"/*\"\n : \"/\" + child.prefix;\n const found = this.searchForRoute(child, target, pathSoFar + seg);\n if (found) return found;\n }\n return undefined;\n }\n\n /** Clean up event listeners and drop this instance's lazy cache. */\n dispose(): void {\n if (this.popstateHandler && typeof window !== \"undefined\") {\n window.removeEventListener(\"popstate\", this.popstateHandler);\n this.popstateHandler = null;\n }\n this.lazyCache.clear();\n this.lazyErrors.clear();\n this.lazyInflight.clear();\n }\n}\n\n/** Join parent and child paths. */\nfunction joinPaths(parent: string, child: string): string {\n if (child === \"/\") return parent || \"/\";\n // Strip leading slash from child so it's always relative\n const relativeChild = child.startsWith(\"/\") ? child.slice(1) : child;\n if (parent === \"/\" || parent === \"\") return \"/\" + relativeChild;\n return parent + \"/\" + relativeChild;\n}\n\n/** Create a router instance. */\nexport function createRouter(\n routes: RouteDefinition[],\n initialPath?: string,\n): Router {\n return new Router(routes, initialPath);\n}\n",
6
6
  "/**\n * Sinwan Router — Radix Tree Path Matching\n *\n * Segment-by-segment trie matching for O(depth) lookups.\n * No regex compilation — static segments are matched by direct\n * string comparison, params by position, and wildcards capture\n * the remaining path.\n *\n * Architecture mirrors the sinwan-engine HTTPRouter radix tree:\n * - Static children checked first (fast path)\n * - Param children checked second\n * - Wildcard children checked last (catch-all)\n */\n\n// ─── Radix Node ────────────────────────────────────────────\n\nexport interface RadixNode {\n /** Literal segment prefix, or `:param` / `*` marker. */\n prefix: string;\n /** Child nodes. */\n children: RadixNode[];\n /** Whether this node is a `:param` segment. */\n isParam: boolean;\n /** Param name (without the `:`). */\n paramName: string;\n /** Whether this node is a `*` wildcard. */\n isWildcard: boolean;\n /** Route data attached at this node (set at leaf). */\n route: RouteData | null;\n}\n\n/** Arbitrary data attached to a matched leaf node. */\nexport interface RouteData {\n [key: string]: unknown;\n}\n\nfunction createNode(prefix: string): RadixNode {\n return {\n prefix,\n children: [],\n isParam: prefix.startsWith(\":\"),\n paramName: prefix.startsWith(\":\") ? prefix.slice(1) : \"\",\n isWildcard: prefix === \"*\" || prefix.startsWith(\"*\"),\n route: null,\n };\n}\n\n// ─── Path Utilities ────────────────────────────────────────\n\n/**\n * Normalize a URL path: ensure leading slash, strip trailing slash\n * (except for root), and strip hash/query.\n */\nexport function normalizePath(path: string): string {\n // Strip query and hash\n const qIdx = path.indexOf(\"?\");\n if (qIdx !== -1) path = path.slice(0, qIdx);\n const hIdx = path.indexOf(\"#\");\n if (hIdx !== -1) path = path.slice(0, hIdx);\n\n // Ensure leading slash\n if (!path.startsWith(\"/\")) path = \"/\" + path;\n\n // Strip trailing slash (except root)\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n return path;\n}\n\n/** Split a path into segments, filtering empty strings. */\nfunction splitSegments(path: string): string[] {\n return path.split(\"/\").filter(Boolean);\n}\n\n/** Extract the search params from a URL string. */\nexport function extractSearchParams(path: string): URLSearchParams {\n const qIdx = path.indexOf(\"?\");\n if (qIdx === -1) return new URLSearchParams();\n return new URLSearchParams(path.slice(qIdx + 1));\n}\n\n// ─── Radix Insert ──────────────────────────────────────────\n\n/**\n * Insert a route into the radix tree.\n *\n * @param root The root node.\n * @param pattern Path pattern like `/users/:id` or `/files/*path`.\n * @param data Arbitrary data to attach at the leaf.\n */\nexport function radixInsert(\n root: RadixNode,\n pattern: string,\n data: RouteData,\n): void {\n const segments = splitSegments(normalizePath(pattern));\n insertNode(root, segments, 0, data);\n}\n\nfunction insertNode(\n node: RadixNode,\n segments: string[],\n depth: number,\n data: RouteData,\n): void {\n if (depth === segments.length) {\n node.route = data;\n return;\n }\n\n const seg = segments[depth];\n if (seg === undefined) return;\n\n // Wildcard child\n if (seg === \"*\" || seg.startsWith(\"*\")) {\n const existing = node.children.find((c) => c.isWildcard);\n if (existing) {\n insertNode(existing, segments, depth + 1, data);\n return;\n }\n const wc = createNode(seg);\n node.children.push(wc);\n insertNode(wc, segments, depth + 1, data);\n return;\n }\n\n // Param child\n if (seg.startsWith(\":\")) {\n const paramName = seg.slice(1);\n for (const child of node.children) {\n if (child.isParam && child.paramName === paramName) {\n insertNode(child, segments, depth + 1, data);\n return;\n }\n }\n const pc = createNode(seg);\n node.children.push(pc);\n insertNode(pc, segments, depth + 1, data);\n return;\n }\n\n // Static child\n for (const child of node.children) {\n if (child.isParam || child.isWildcard) continue;\n if (child.prefix === seg) {\n insertNode(child, segments, depth + 1, data);\n return;\n }\n }\n\n const sc = createNode(seg);\n node.children.push(sc);\n insertNode(sc, segments, depth + 1, data);\n}\n\n// ─── Radix Search ──────────────────────────────────────────\n\n/** Result of a radix search. */\nexport interface MatchResult {\n /** The data attached to the matched leaf node. */\n data: RouteData;\n /** Extracted path parameters. */\n params: Record<string, string>;\n /** The full pattern that was matched. */\n matchedPath: string;\n}\n\n/**\n * Search the radix tree for a matching route.\n *\n * Static segments are checked first (fast path), then param\n * segments, then wildcard segments (catch-all).\n *\n * @returns `MatchResult` if found, `null` otherwise.\n */\nexport function radixSearch(root: RadixNode, path: string): MatchResult | null {\n const segments = splitSegments(normalizePath(path));\n const params: Record<string, string> = Object.create(null);\n const result = searchNode(root, segments, 0, params, \"\");\n if (!result) return null;\n return result;\n}\n\nfunction searchNode(\n node: RadixNode,\n segments: string[],\n depth: number,\n params: Record<string, string>,\n pathSoFar: string,\n): MatchResult | null {\n // Reached the end of the path — check if this node has a route\n if (depth === segments.length) {\n if (node.route) {\n return {\n data: node.route,\n params: copyParams(params),\n matchedPath: pathSoFar,\n };\n }\n // Check for trailing wildcard (matches empty rest)\n for (const child of node.children) {\n if (child.isWildcard && child.route) {\n const paramName = child.prefix === \"*\" ? \"\" : child.prefix.slice(1);\n if (paramName) {\n params[paramName] = \"\";\n } else {\n params[\"_wildcard\"] = \"\";\n }\n return {\n data: child.route,\n params: copyParams(params),\n matchedPath: pathSoFar + \"/*\",\n };\n }\n }\n return null;\n }\n\n const seg = segments[depth];\n if (seg === undefined) return null;\n\n // 1) Static children (fast path)\n for (const child of node.children) {\n if (child.isParam || child.isWildcard) continue;\n if (child.prefix !== seg) continue;\n const found = searchNode(\n child,\n segments,\n depth + 1,\n params,\n pathSoFar + \"/\" + child.prefix,\n );\n if (found) return found;\n }\n\n // 2) Param children\n for (const child of node.children) {\n if (!child.isParam) continue;\n params[child.paramName] = decodeURIComponent(seg);\n const found = searchNode(\n child,\n segments,\n depth + 1,\n params,\n pathSoFar + \"/:\" + child.paramName,\n );\n if (found) return found;\n delete params[child.paramName];\n }\n\n // 3) Wildcard children (catch-all)\n for (const child of node.children) {\n if (!child.isWildcard) continue;\n if (!child.route) continue;\n const rest = wildcardValue(segments, depth);\n // Extract param name: \"*\" → \"_wildcard\", \"*path\" → \"path\"\n const paramName = child.prefix === \"*\" ? \"\" : child.prefix.slice(1);\n if (paramName) {\n params[paramName] = rest;\n } else {\n params[\"_wildcard\"] = rest;\n }\n return {\n data: child.route,\n params: copyParams(params),\n matchedPath: pathSoFar + \"/*\",\n };\n }\n\n return null;\n}\n\n/** Build the wildcard value from remaining segments. */\nfunction wildcardValue(segments: string[], depth: number): string {\n let rest = \"\";\n for (let i = depth; i < segments.length; i += 1) {\n const seg = segments[i];\n if (seg === undefined || seg === \"\") continue;\n if (rest === \"\") rest = seg;\n else rest += \"/\" + seg;\n }\n return rest;\n}\n\n/** Fast key-by-key copy of params. */\nfunction copyParams(src: Record<string, string>): Record<string, string> {\n const dst: Record<string, string> = Object.create(null);\n for (const key in src) dst[key] = src[key]!;\n return dst;\n}\n\n// ─── Radix Tree Factory ────────────────────────────────────\n\n/** Create a new empty radix tree root. */\nexport function createRadixTree(): RadixNode {\n return createNode(\"\");\n}\n\n// ─── Build Path (still useful for programmatic URL construction) ─\n\n/**\n * Build a path from a pattern and params.\n *\n * @example\n * ```ts\n * buildPath(\"/users/:id\", { id: \"42\" }); // \"/users/42\"\n * ```\n */\nexport function buildPath(\n pattern: string,\n params: Record<string, string> = {},\n): string {\n return pattern.replace(/:(\\w+)/g, (_match, name: string) => {\n const value = params[name];\n if (value === undefined) {\n throw new Error(`Missing param \"${name}\" for pattern \"${pattern}\"`);\n }\n return encodeURIComponent(value);\n });\n}\n",
7
- "import { _$createTemplate } from \"sinwan/renderer\";\nconst _$tmpl_0 = {\n html: \"<a href=\\\"\\\" class=\\\"\\\" target=\\\"\\\" download=\\\"\\\" rel=\\\"\\\" onclick=\\\"\\\" onmouseenter=\\\"\\\"><!--s:0--></a>\",\n slots: [{\n path: [],\n type: \"attr\",\n name: \"href\"\n }, {\n path: [],\n type: \"attr\",\n name: \"class\"\n }, {\n path: [],\n type: \"attr\",\n name: \"target\"\n }, {\n path: [],\n type: \"attr\",\n name: \"download\"\n }, {\n path: [],\n type: \"attr\",\n name: \"rel\"\n }, {\n path: [],\n type: \"event\",\n name: \"onclick\"\n }, {\n path: [],\n type: \"event\",\n name: \"onmouseenter\"\n }, {\n path: [0],\n type: \"child\"\n }]\n};\nconst _$tmpl_1 = {\n html: \"<a href=\\\"\\\" class=\\\"\\\" target=\\\"\\\" download=\\\"\\\" rel=\\\"\\\" onclick=\\\"\\\" onmouseenter=\\\"\\\"><!--s:0--></a>\",\n slots: [{\n path: [],\n type: \"attr\",\n name: \"href\"\n }, {\n path: [],\n type: \"attr\",\n name: \"class\"\n }, {\n path: [],\n type: \"attr\",\n name: \"target\"\n }, {\n path: [],\n type: \"attr\",\n name: \"download\"\n }, {\n path: [],\n type: \"attr\",\n name: \"rel\"\n }, {\n path: [],\n type: \"event\",\n name: \"onclick\"\n }, {\n path: [],\n type: \"event\",\n name: \"onmouseenter\"\n }, {\n path: [0],\n type: \"child\"\n }]\n};\nconst _$tmpl_2 = {\n html: \"<div>404 - Page not found</div>\",\n slots: []\n};\nconst _$tmpl_3 = {\n html: \"<div>Loading...</div>\",\n slots: []\n};\nconst _$tmpl_4 = {\n html: \"<div>Failed to load page</div>\",\n slots: []\n};\n/**\n * Sinwan Router — Components\n *\n * Link, NavLink, and RouterOutlet that use useRouter() internally.\n * The router instance must be provided via provide(RouterKey, router).\n */\n\nimport { cc } from \"sinwan/component\";\nimport { Key } from \"sinwan/component\";\nimport type { SinwanComponent, SinwanNode } from \"sinwan/component\";\nimport { computed } from \"sinwan/reactivity\";\nimport { useRouter } from \"./hooks.ts\";\nimport { isLazyComponent } from \"./router.ts\";\nimport type { Router } from \"./router.ts\";\nimport type { MatchedRoute } from \"./types.ts\";\nimport { jsxClass, shouldInterceptLinkClick, type LinkInterceptOptions } from \"./link-nav.ts\";\nimport { computeOutletKey, getMatchAtDepth } from \"./outlet.ts\";\n\n// ─── Link ──────────────────────────────────────────────────\n\nexport interface LinkProps {\n href: string;\n prefetch?: boolean;\n class?: string;\n children?: SinwanNode;\n target?: string;\n download?: string | boolean;\n rel?: string;\n}\nfunction onLinkClick(event: MouseEvent, href: string, router: Router, options: LinkInterceptOptions): void {\n if (!shouldInterceptLinkClick(event, href, router.path, options)) return;\n event.preventDefault();\n router.navigate(href);\n}\nfunction downloadAttr(download: string | boolean | undefined): string | undefined {\n if (download === undefined || download === false) return undefined;\n if (download === true) return \"\";\n return download;\n}\n\n/**\n * Link — client-side navigation anchor.\n * Uses the router from context (provide(RouterKey, router)).\n */\nexport const Link = cc<LinkProps>(({\n href,\n prefetch = true,\n class: cls,\n children,\n target,\n download,\n rel\n}) => {\n const router = useRouter();\n return _$createTemplate(_$tmpl_0, [href, cls, target, downloadAttr(download), rel, (e: MouseEvent) => {\n onLinkClick(e, href, router, {\n target,\n download\n });\n }, () => {\n if (prefetch) router.prefetch(href);\n }, children]);\n});\n\n// ─── NavLink ───────────────────────────────────────────────\n\nexport interface NavLinkProps extends LinkProps {\n activeClass?: string;\n}\n\n/**\n * NavLink — Link with active state styling.\n * Uses the router from context.\n */\nexport const NavLink = cc<NavLinkProps>(({\n href,\n prefetch = true,\n activeClass = \"active\",\n class: cls,\n children,\n target,\n download,\n rel\n}) => {\n const router = useRouter();\n const className = computed(() => router.path === href || router.path.startsWith(href + \"/\") ? `${cls ?? \"\"} ${activeClass}`.trim() : cls ?? \"\");\n return _$createTemplate(_$tmpl_1, [href, jsxClass(() => className.value), target, downloadAttr(download), rel, (e: MouseEvent) => {\n onLinkClick(e, href, router, {\n target,\n download\n });\n }, () => {\n if (prefetch) router.prefetch(href);\n }, children]);\n});\n\n// ─── RouterOutlet ──────────────────────────────────────────\n\nexport interface RouterOutletProps {\n fallback?: SinwanComponent;\n notFound?: SinwanComponent;\n error?: SinwanComponent<{\n error?: unknown;\n }>;\n /** Depth of this outlet (0 = top-level, 1 = nested in parent route). */\n depth?: number;\n}\nconst DefaultNotFound = cc(() => _$createTemplate(_$tmpl_2, []));\nconst DefaultLoading = cc(() => _$createTemplate(_$tmpl_3, []));\nconst DefaultError = cc<{\n error?: unknown;\n}>(() => _$createTemplate(_$tmpl_4, []));\nfunction resolveOutletNode(matched: MatchedRoute, router: Router, fallback: SinwanComponent, errorComp: SinwanComponent<{\n error?: unknown;\n}>): SinwanNode {\n const route = matched.route;\n if (!isLazyComponent(route.component)) {\n const Comp = route.component;\n return <Comp />;\n }\n const cacheKey = matched.matchedPath;\n const state = router.peekLazy(cacheKey);\n if (state.status === \"ready\") {\n const Comp = state.component;\n return <Comp />;\n }\n if (state.status === \"error\") {\n const ErrorView = errorComp;\n return <ErrorView error={state.error} />;\n }\n router.ensureLazy(cacheKey, route.component);\n const Fallback = fallback;\n return <Fallback />;\n}\n\n/**\n * RouterOutlet — renders the matched route's component at a given depth.\n * For nested routes, place a <RouterOutlet /> inside the parent component.\n * Uses the router from context.\n */\nexport const RouterOutlet = cc<RouterOutletProps>(({\n fallback,\n notFound,\n error,\n depth = 0\n}) => {\n const router = useRouter();\n const Fallback = fallback ?? DefaultLoading;\n const NotFound = notFound ?? DefaultNotFound;\n const ErrorView = error ?? DefaultError;\n return <Key when={() => computeOutletKey(router, depth)}>\n {() => {\n const matched = getMatchAtDepth(router.matched, depth);\n if (!matched) {\n if (depth > 0) return null;\n return <NotFound />;\n }\n return resolveOutletNode(matched, router, Fallback, ErrorView);\n }}\n </Key>;\n});",
7
+ "import { _$createTemplate } from \"sinwan/renderer\";\nconst _$tmpl_0 = {\n html: \"<a href=\\\"\\\" class=\\\"\\\" target=\\\"\\\" download=\\\"\\\" rel=\\\"\\\" onclick=\\\"\\\" onmouseenter=\\\"\\\"><!--s:0--></a>\",\n slots: [{\n path: [],\n type: \"attr\",\n name: \"href\"\n }, {\n path: [],\n type: \"attr\",\n name: \"class\"\n }, {\n path: [],\n type: \"attr\",\n name: \"target\"\n }, {\n path: [],\n type: \"attr\",\n name: \"download\"\n }, {\n path: [],\n type: \"attr\",\n name: \"rel\"\n }, {\n path: [],\n type: \"event\",\n name: \"onclick\"\n }, {\n path: [],\n type: \"event\",\n name: \"onmouseenter\"\n }, {\n path: [0],\n type: \"child\"\n }]\n};\nconst _$tmpl_1 = {\n html: \"<a href=\\\"\\\" class=\\\"\\\" target=\\\"\\\" download=\\\"\\\" rel=\\\"\\\" onclick=\\\"\\\" onmouseenter=\\\"\\\"><!--s:0--></a>\",\n slots: [{\n path: [],\n type: \"attr\",\n name: \"href\"\n }, {\n path: [],\n type: \"attr\",\n name: \"class\"\n }, {\n path: [],\n type: \"attr\",\n name: \"target\"\n }, {\n path: [],\n type: \"attr\",\n name: \"download\"\n }, {\n path: [],\n type: \"attr\",\n name: \"rel\"\n }, {\n path: [],\n type: \"event\",\n name: \"onclick\"\n }, {\n path: [],\n type: \"event\",\n name: \"onmouseenter\"\n }, {\n path: [0],\n type: \"child\"\n }]\n};\nconst _$tmpl_2 = {\n html: \"<div>404 - Page not found</div>\",\n slots: []\n};\nconst _$tmpl_3 = {\n html: \"<div>Loading...</div>\",\n slots: []\n};\nconst _$tmpl_4 = {\n html: \"<div>Failed to load page</div>\",\n slots: []\n};\n/**\n * Sinwan Router — Components\n *\n * Link, NavLink, and RouterOutlet that use useRouter() internally.\n * The router instance must be provided via provide(RouterKey, router).\n */\n\nimport { cc } from \"sinwan/component\";\nimport { Key } from \"sinwan/component\";\nimport type { SinwanComponent, SinwanNode } from \"sinwan/component\";\nimport { computed } from \"sinwan/reactivity\";\nimport { useRouter } from \"./hooks.ts\";\nimport { isLazyComponent } from \"./router.ts\";\nimport type { Router } from \"./router.ts\";\nimport type { MatchedRoute } from \"./types.ts\";\nimport { shouldInterceptLinkClick, type LinkInterceptOptions } from \"./link-nav.ts\";\nimport { computeOutletKey, getMatchAtDepth } from \"./outlet.ts\";\n\n// ─── Link ──────────────────────────────────────────────────\n\nexport interface LinkProps {\n href: string;\n prefetch?: boolean;\n class?: string;\n children?: SinwanNode;\n target?: string;\n download?: string | boolean;\n rel?: string;\n}\nfunction onLinkClick(event: MouseEvent, href: string, router: Router, options: LinkInterceptOptions): void {\n if (!shouldInterceptLinkClick(event, href, router.path, options)) return;\n event.preventDefault();\n router.navigate(href);\n}\nfunction downloadAttr(download: string | boolean | undefined): string | undefined {\n if (download === undefined || download === false) return undefined;\n if (download === true) return \"\";\n return download;\n}\n\n/**\n * Link — client-side navigation anchor.\n * Uses the router from context (provide(RouterKey, router)).\n */\nexport const Link = cc<LinkProps>(({\n href,\n prefetch = true,\n class: cls,\n children,\n target,\n download,\n rel\n}) => {\n const router = useRouter();\n return _$createTemplate(_$tmpl_0, [href, cls, target, downloadAttr(download), rel, (e: MouseEvent) => {\n onLinkClick(e, href, router, {\n target,\n download\n });\n }, () => {\n if (prefetch) router.prefetch(href);\n }, children]);\n});\n\n// ─── NavLink ───────────────────────────────────────────────\n\nexport interface NavLinkProps extends LinkProps {\n activeClass?: string;\n}\n\n/**\n * NavLink — Link with active state styling.\n * Uses the router from context.\n */\nexport const NavLink = cc<NavLinkProps>(({\n href,\n prefetch = true,\n activeClass = \"active\",\n class: cls,\n children,\n target,\n download,\n rel\n}) => {\n const router = useRouter();\n const className = computed(() => router.path === href || router.path.startsWith(href + \"/\") ? `${cls ?? \"\"} ${activeClass}`.trim() : cls ?? \"\");\n return _$createTemplate(_$tmpl_1, [href, className, target, downloadAttr(download), rel, (e: MouseEvent) => {\n onLinkClick(e, href, router, {\n target,\n download\n });\n }, () => {\n if (prefetch) router.prefetch(href);\n }, children]);\n});\n\n// ─── RouterOutlet ──────────────────────────────────────────\n\nexport interface RouterOutletProps {\n fallback?: SinwanComponent;\n notFound?: SinwanComponent;\n error?: SinwanComponent<{\n error?: unknown;\n }>;\n /** Depth of this outlet (0 = top-level, 1 = nested in parent route). */\n depth?: number;\n}\nconst DefaultNotFound = cc(() => _$createTemplate(_$tmpl_2, []));\nconst DefaultLoading = cc(() => _$createTemplate(_$tmpl_3, []));\nconst DefaultError = cc<{\n error?: unknown;\n}>(() => _$createTemplate(_$tmpl_4, []));\nfunction resolveOutletNode(matched: MatchedRoute, router: Router, fallback: SinwanComponent, errorComp: SinwanComponent<{\n error?: unknown;\n}>): SinwanNode {\n const route = matched.route;\n if (!isLazyComponent(route.component)) {\n const Comp = route.component;\n return <Comp />;\n }\n const cacheKey = matched.matchedPath;\n const state = router.peekLazy(cacheKey);\n if (state.status === \"ready\") {\n const Comp = state.component;\n return <Comp />;\n }\n if (state.status === \"error\") {\n const ErrorView = errorComp;\n return <ErrorView error={state.error} />;\n }\n router.ensureLazy(cacheKey, route.component);\n const Fallback = fallback;\n return <Fallback />;\n}\n\n/**\n * RouterOutlet — renders the matched route's component at a given depth.\n * For nested routes, place a <RouterOutlet /> inside the parent component.\n * Uses the router from context.\n */\nexport const RouterOutlet = cc<RouterOutletProps>(({\n fallback,\n notFound,\n error,\n depth = 0\n}) => {\n const router = useRouter();\n const Fallback = fallback ?? DefaultLoading;\n const NotFound = notFound ?? DefaultNotFound;\n const ErrorView = error ?? DefaultError;\n return <Key when={() => computeOutletKey(router, depth)}>\n {() => {\n const matched = getMatchAtDepth(router.matched, depth);\n if (!matched) {\n if (depth > 0) return null;\n return <NotFound />;\n }\n return resolveOutletNode(matched, router, Fallback, ErrorView);\n }}\n </Key>;\n});",
8
8
  "/**\n * Sinwan Router — Hooks\n *\n * Reactive hooks for accessing router state inside components.\n * Must be called within a component that has a Router in context.\n */\n\nimport { inject } from \"sinwan/component\";\nimport type { InjectionKey } from \"sinwan/component\";\nimport type { Router } from \"./router.ts\";\nimport type { RouterContextValue, NavigateOptions } from \"./types.ts\";\n\n/** Injection key for the router instance. */\nexport const RouterKey: InjectionKey<Router> = Symbol(\"sinwan.router\");\n\n/**\n * Access the router instance.\n *\n * @example\n * ```tsx\n * const router = useRouter();\n * router.navigate(\"/about\");\n * ```\n */\nexport function useRouter(): Router {\n const router = inject(RouterKey);\n if (!router) {\n throw new Error(\"useRouter() called outside of a Router provider.\");\n }\n return router;\n}\n\n/**\n * Get the current route parameters.\n *\n * @example\n * ```tsx\n * const params = useParams();\n * console.log(params.id); // \"42\" for /users/42\n * ```\n */\nexport function useParams(): Record<string, string> {\n return useRouter().params;\n}\n\n/**\n * Get the current search params (query string).\n *\n * @example\n * ```tsx\n * const searchParams = useSearchParams();\n * console.log(searchParams.get(\"q\")); // \"hello\" for /search?q=hello\n * ```\n */\nexport function useSearchParams(): URLSearchParams {\n return useRouter().searchParams;\n}\n\n/**\n * Get the current matched route.\n *\n * @example\n * ```tsx\n * const route = useRoute();\n * if (route) {\n * console.log(route.path, route.params);\n * }\n * ```\n */\nexport function useRoute() {\n return useRouter().matched;\n}\n\n/**\n * Get a navigate function.\n *\n * @example\n * ```tsx\n * const navigate = useNavigate();\n * navigate(\"/users/42\");\n * navigate(\"/login\", { replace: true });\n * ```\n */\nexport function useNavigate(): (to: string, options?: NavigateOptions) => void {\n const router = useRouter();\n return router.navigate.bind(router);\n}\n\n/**\n * Get the current path.\n *\n * @example\n * ```tsx\n * const path = usePath();\n * console.log(path); // \"/users/42\"\n * ```\n */\nexport function usePath(): string {\n return useRouter().path;\n}\n",
9
- "/**\n * Link click interception and JSX class adapter.\n */\n\nimport type { Reactive } from \"sinwan/component\";\n\n/** Fields read from a click event to decide client-side navigation. */\nexport interface LinkClickEvent {\n button: number;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n defaultPrevented: boolean;\n}\n\nexport interface LinkInterceptOptions {\n target?: string;\n download?: string | boolean;\n}\n\n/**\n * Sinwan JSX types `class` as `string`; the renderer accepts Reactive<string>.\n * Isolated here so call sites do not use `any`.\n */\nexport function jsxClass(value: Reactive<string>): string {\n return value as string;\n}\n\n/** True when the href should be left to the browser (other origin or scheme). */\nexport function isExternalHref(href: string): boolean {\n if (href.startsWith(\"//\")) return true;\n const colon = href.indexOf(\":\");\n if (colon <= 0) return false;\n const slash = href.indexOf(\"/\");\n if (slash !== -1 && slash < colon) return false;\n return true;\n}\n\n/** True when the href is an in-page hash (no path change). */\nexport function isHashOnlyHref(href: string, currentPath: string): boolean {\n if (href.startsWith(\"#\")) return true;\n const hashIdx = href.indexOf(\"#\");\n if (hashIdx === -1) return false;\n const beforeHash = href.slice(0, hashIdx);\n if (beforeHash === \"\") return true;\n const qIdx = beforeHash.indexOf(\"?\");\n const pathPart = qIdx === -1 ? beforeHash : beforeHash.slice(0, qIdx);\n if (pathPart === \"\" || pathPart === \".\") return true;\n const normalized =\n pathPart.startsWith(\"/\") ? pathPart : \"/\" + pathPart;\n const stripped =\n normalized.length > 1 && normalized.endsWith(\"/\")\n ? normalized.slice(0, -1)\n : normalized;\n return stripped === currentPath;\n}\n\n/** Whether this click should be handled by the client router. */\nexport function shouldInterceptLinkClick(\n event: LinkClickEvent,\n href: string,\n currentPath: string,\n options: LinkInterceptOptions = {},\n): boolean {\n if (event.defaultPrevented) return false;\n if (event.button !== 0) return false;\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return false;\n }\n if (options.target != null && options.target !== \"\" && options.target !== \"_self\") {\n return false;\n }\n if (options.download !== undefined && options.download !== false) {\n return false;\n }\n if (isExternalHref(href)) return false;\n if (isHashOnlyHref(href, currentPath)) return false;\n return true;\n}\n",
9
+ "/**\n * Link click interception.\n */\n\n/** Fields read from a click event to decide client-side navigation. */\nexport interface LinkClickEvent {\n button: number;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n defaultPrevented: boolean;\n}\n\nexport interface LinkInterceptOptions {\n target?: string;\n download?: string | boolean;\n}\n\n/** True when the href should be left to the browser (other origin or scheme). */\nexport function isExternalHref(href: string): boolean {\n if (href.startsWith(\"//\")) return true;\n const colon = href.indexOf(\":\");\n if (colon <= 0) return false;\n const slash = href.indexOf(\"/\");\n if (slash !== -1 && slash < colon) return false;\n return true;\n}\n\n/** True when the href is an in-page hash (no path change). */\nexport function isHashOnlyHref(href: string, currentPath: string): boolean {\n if (href.startsWith(\"#\")) return true;\n const hashIdx = href.indexOf(\"#\");\n if (hashIdx === -1) return false;\n const beforeHash = href.slice(0, hashIdx);\n if (beforeHash === \"\") return true;\n const qIdx = beforeHash.indexOf(\"?\");\n const pathPart = qIdx === -1 ? beforeHash : beforeHash.slice(0, qIdx);\n if (pathPart === \"\" || pathPart === \".\") return true;\n const normalized =\n pathPart.startsWith(\"/\") ? pathPart : \"/\" + pathPart;\n const stripped =\n normalized.length > 1 && normalized.endsWith(\"/\")\n ? normalized.slice(0, -1)\n : normalized;\n return stripped === currentPath;\n}\n\n/** Whether this click should be handled by the client router. */\nexport function shouldInterceptLinkClick(\n event: LinkClickEvent,\n href: string,\n currentPath: string,\n options: LinkInterceptOptions = {},\n): boolean {\n if (event.defaultPrevented) return false;\n if (event.button !== 0) return false;\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return false;\n }\n if (options.target != null && options.target !== \"\" && options.target !== \"_self\") {\n return false;\n }\n if (options.download !== undefined && options.download !== false) {\n return false;\n }\n if (isExternalHref(href)) return false;\n if (isHashOnlyHref(href, currentPath)) return false;\n return true;\n}\n",
10
10
  "/**\n * Nested-outlet matching and Key identity.\n */\n\nimport { isLazyComponent } from \"./router.ts\";\nimport type { Router } from \"./router.ts\";\nimport type { MatchedRoute } from \"./types.ts\";\n\n/**\n * Walk the matched route chain to a specific depth.\n * depth=0 → root match, depth=1 → first child, etc.\n */\nexport function getMatchAtDepth(\n matched: MatchedRoute | null,\n depth: number,\n): MatchedRoute | null {\n if (!matched) return null;\n let current: MatchedRoute | undefined = matched;\n const chain: MatchedRoute[] = [];\n while (current) {\n chain.unshift(current);\n current = current.parent;\n }\n return chain[depth] ?? null;\n}\n\n/**\n * Stable identity for a match at one outlet depth.\n * Parent layouts ignore child param changes; param routes include their values.\n */\nexport function routeIdentity(matched: MatchedRoute): string {\n const pattern = matched.matchedPath;\n if (pattern.includes(\"*\")) {\n return matched.path;\n }\n let concrete = pattern;\n for (const key of Object.keys(matched.params)) {\n const value = matched.params[key];\n if (value === undefined) continue;\n concrete = concrete.replace(\":\" + key, encodeURIComponent(value));\n }\n if (concrete.includes(\":\")) {\n return matched.path;\n }\n return concrete;\n}\n\nfunction lazyStatusSuffix(router: Router, matched: MatchedRoute): string {\n if (!isLazyComponent(matched.route.component)) return \"sync\";\n const state = router.peekLazy(matched.matchedPath);\n return state.status;\n}\n\n/**\n * Key value for `<Key>` at an outlet depth.\n * Reads `lazyTick` so load completion re-evaluates without a same-path navigate.\n * Unchanged identities do not remount parent layouts.\n */\nexport function computeOutletKey(router: Router, depth: number): string {\n void router.lazyTick;\n const matched = getMatchAtDepth(router.matched, depth);\n if (!matched) {\n return depth > 0 ? `__empty:${depth}` : \"__notfound__\";\n }\n return `${routeIdentity(matched)}:${lazyStatusSuffix(router, matched)}`;\n}\n",
11
- "/**\n * JSX <Routes> / <Route> — the same fields as RouteDefinition.\n */\n\nimport { cc, provide, onDispose } from \"sinwan/component\";\nimport type { SinwanComponent, SinwanElement, SinwanNode } from \"sinwan/component\";\nimport { createRouter } from \"./router.ts\";\nimport { RouterOutlet } from \"./components.tsx\";\nimport { RouterKey } from \"./hooks.ts\";\nimport type { RouteComponent, RouteDefinition } from \"./types.ts\";\nexport const ROUTE_TYPE = Symbol.for(\"sinwan.router.Route\");\n\n/**\n * JSX props match {@link RouteDefinition}.\n * `children` may be nested `<Route>` elements or a `RouteDefinition[]`.\n */\nexport type RouteProps = Omit<RouteDefinition, \"children\"> & {\n children?: RouteDefinition | RouteDefinition[] | SinwanNode;\n};\nexport interface RoutesProps {\n children?: SinwanNode;\n fallback?: SinwanComponent;\n notFound?: SinwanComponent;\n error?: SinwanComponent<{\n error?: unknown;\n }>;\n initialPath?: string;\n}\nfunction isElementLike(value: unknown): value is SinwanElement {\n return value != null && typeof value === \"object\" && \"tag\" in value;\n}\nfunction routePropsRecord(props: RouteProps): Record<string, unknown> {\n const record: Record<string, unknown> = {\n path: props.path,\n component: props.component\n };\n if (props.meta !== undefined) record.meta = props.meta;\n if (props.children !== undefined) record.children = props.children;\n return record;\n}\n\n/** Marker for a single route. Same props as `RouteDefinition`. */\nexport function Route(props: RouteProps): SinwanElement {\n return {\n tag: ROUTE_TYPE,\n props: routePropsRecord(props),\n children: []\n };\n}\nexport function isRouteElement(value: unknown): value is SinwanElement {\n if (!isElementLike(value)) return false;\n return value.tag === ROUTE_TYPE || value.tag === Route;\n}\nfunction isRouteDefinition(value: unknown): value is RouteDefinition {\n if (value == null || typeof value !== \"object\") return false;\n if (\"tag\" in value) return false;\n const rec = value as {\n path?: unknown;\n component?: unknown;\n };\n return typeof rec.path === \"string\" && rec.component != null;\n}\nfunction flattenNodes(node: unknown): unknown[] {\n if (node == null || typeof node === \"boolean\") return [];\n if (Array.isArray(node)) {\n const out: unknown[] = [];\n for (const child of node) {\n out.push(...flattenNodes(child));\n }\n return out;\n }\n if (isElementLike(node) && node.tag === \"\") {\n const fromKids = flattenNodes(node.children);\n if (fromKids.length > 0) return fromKids;\n return flattenNodes(node.props.children);\n }\n return [node];\n}\nfunction nestedDefinitions(source: unknown): RouteDefinition[] | undefined {\n if (source == null) return undefined;\n if (Array.isArray(source) && source.length > 0 && isRouteDefinition(source[0])) {\n const defs: RouteDefinition[] = [];\n for (const item of source) {\n if (isRouteDefinition(item)) defs.push(item);\n }\n return defs.length > 0 ? defs : undefined;\n }\n if (isRouteDefinition(source)) return [source];\n const collected = collectRouteDefinitions(source);\n return collected.length > 0 ? collected : undefined;\n}\nfunction routeNodeToDefinition(node: unknown): RouteDefinition | null {\n if (isRouteDefinition(node)) {\n const def: RouteDefinition = {\n path: node.path,\n component: node.component\n };\n if (node.meta) def.meta = node.meta;\n if (node.children && node.children.length > 0) def.children = node.children;\n return def;\n }\n if (!isRouteElement(node)) return null;\n const props = node.props;\n const path = props.path;\n const component = props.component;\n if (typeof path !== \"string\" || component == null) return null;\n const def: RouteDefinition = {\n path,\n component: component as RouteComponent\n };\n const meta = props.meta;\n if (meta != null && typeof meta === \"object\") {\n def.meta = meta as Record<string, unknown>;\n }\n const nested = nestedDefinitions(props.children ?? node.children);\n if (nested) def.children = nested;\n return def;\n}\n\n/** Walk JSX children (and fragments) into native `RouteDefinition[]`. */\nexport function collectRouteDefinitions(children: unknown): RouteDefinition[] {\n const defs: RouteDefinition[] = [];\n for (const node of flattenNodes(children)) {\n const def = routeNodeToDefinition(node);\n if (def) defs.push(def);\n }\n return defs;\n}\n\n/**\n * Declarative JSX router. Builds a `Router` from `<Route>` children\n * (same fields as `RouteDefinition`) and renders a `<RouterOutlet />`.\n */\nexport const Routes = cc<RoutesProps>(({\n children,\n fallback,\n notFound,\n error,\n initialPath\n}) => {\n const router = createRouter(collectRouteDefinitions(children), initialPath);\n provide(RouterKey, router);\n onDispose(() => {\n router.dispose();\n });\n return <RouterOutlet fallback={fallback} notFound={notFound} error={error} />;\n});"
11
+ "/**\n * JSX <Routes> / <Route> — the same fields as RouteDefinition.\n */\n\nimport { cc, provide, onDispose } from \"sinwan/component\";\nimport type { SinwanComponent, SinwanElement, SinwanNode } from \"sinwan/component\";\nimport { createRouter } from \"./router.ts\";\nimport { RouterOutlet } from \"./components.tsx\";\nimport { RouterKey } from \"./hooks.ts\";\nimport type { RouteComponent, RouteDefinition } from \"./types.ts\";\nexport const ROUTE_TYPE = Symbol.for(\"sinwan.router.Route\");\n\n/**\n * JSX props match {@link RouteDefinition}.\n * `children` may be nested `<Route>` elements or a `RouteDefinition[]`.\n */\nexport type RouteProps = Omit<RouteDefinition, \"children\"> & {\n children?: RouteDefinition | RouteDefinition[] | SinwanNode;\n};\nexport interface RoutesProps {\n children?: SinwanNode;\n fallback?: SinwanComponent;\n notFound?: SinwanComponent;\n error?: SinwanComponent<{\n error?: unknown;\n }>;\n initialPath?: string;\n}\nfunction isElementLike(value: unknown): value is SinwanElement {\n return value != null && typeof value === \"object\" && \"tag\" in value;\n}\nfunction routePropsRecord(props: RouteProps): Record<string, unknown> {\n const record: Record<string, unknown> = {\n path: props.path,\n component: props.component\n };\n if (props.meta !== undefined) record.meta = props.meta;\n if (props.children !== undefined) record.children = props.children;\n return record;\n}\n\n/** Marker for a single route. Same props as `RouteDefinition`. */\nexport function Route(props: RouteProps): SinwanElement {\n return {\n tag: ROUTE_TYPE,\n props: routePropsRecord(props),\n children: []\n };\n}\nexport function isRouteElement(value: unknown): value is SinwanElement {\n if (!isElementLike(value)) return false;\n return value.tag === ROUTE_TYPE || value.tag === Route;\n}\nfunction isRouteDefinition(value: unknown): value is RouteDefinition {\n if (value == null || typeof value !== \"object\") return false;\n if (\"tag\" in value) return false;\n const rec = value as {\n path?: unknown;\n component?: unknown;\n };\n return typeof rec.path === \"string\" && rec.component != null;\n}\nfunction flattenNodes(node: unknown): unknown[] {\n if (node == null || typeof node === \"boolean\") return [];\n if (Array.isArray(node)) {\n const out: unknown[] = [];\n for (const child of node) {\n out.push(...flattenNodes(child));\n }\n return out;\n }\n if (isElementLike(node) && node.tag === \"\") {\n const fromKids = flattenNodes(node.children);\n if (fromKids.length > 0) return fromKids;\n return flattenNodes(node.props.children);\n }\n return [node];\n}\nfunction nestedDefinitions(source: unknown): RouteDefinition[] | undefined {\n if (source == null) return undefined;\n if (Array.isArray(source) && source.length > 0 && isRouteDefinition(source[0])) {\n const defs: RouteDefinition[] = [];\n for (const item of source) {\n if (isRouteDefinition(item)) defs.push(item);\n }\n return defs.length > 0 ? defs : undefined;\n }\n if (isRouteDefinition(source)) return [source];\n const collected = collectRouteDefinitions(source);\n return collected.length > 0 ? collected : undefined;\n}\nfunction routeNodeToDefinition(node: unknown): RouteDefinition | null {\n if (isRouteDefinition(node)) {\n const def: RouteDefinition = {\n path: node.path,\n component: node.component\n };\n if (node.meta) def.meta = node.meta;\n if (node.children && node.children.length > 0) def.children = node.children;\n return def;\n }\n if (!isRouteElement(node)) return null;\n const props = node.props;\n const path = props.path;\n const component = props.component;\n if (typeof path !== \"string\" || component == null) return null;\n const def: RouteDefinition = {\n path,\n component: component as RouteComponent\n };\n const meta = props.meta;\n if (meta != null && typeof meta === \"object\") {\n def.meta = meta as Record<string, unknown>;\n }\n const nested = nestedDefinitions(props.children ?? node.children);\n if (nested) def.children = nested;\n return def;\n}\n\n/** Walk JSX children (and fragments) into native `RouteDefinition[]`. */\nexport function collectRouteDefinitions(children: unknown): RouteDefinition[] {\n const defs: RouteDefinition[] = [];\n for (const node of flattenNodes(children)) {\n const def = routeNodeToDefinition(node);\n if (def) defs.push(def);\n }\n return defs;\n}\n\n/** Non-route siblings (nav, layout) to render beside the outlet. */\nexport function layoutNodes(children: unknown): SinwanNode[] {\n const out: SinwanNode[] = [];\n for (const node of flattenNodes(children)) {\n if (isRouteElement(node) || isRouteDefinition(node)) continue;\n out.push(node as SinwanNode);\n }\n return out;\n}\n\n/**\n * Declarative JSX router. Builds a `Router` from `<Route>` children\n * (same fields as `RouteDefinition`), provides `RouterKey` to layout\n * siblings such as `<NavLink>`, and renders a `<RouterOutlet />`.\n */\nexport const Routes = cc<RoutesProps>(({\n children,\n fallback,\n notFound,\n error,\n initialPath\n}) => {\n const router = createRouter(collectRouteDefinitions(children), initialPath);\n provide(RouterKey, router);\n onDispose(() => {\n router.dispose();\n });\n const outlet = <RouterOutlet fallback={fallback} notFound={notFound} error={error} />;\n const layout = layoutNodes(children);\n if (layout.length === 0) return outlet;\n return <>\n {layout}\n {outlet}\n </>;\n});"
12
12
  ],
13
- "mappings": "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",
14
- "debugId": "B05954AB6554A08764756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "D61DE7C0A6BF0E7964756E2164756E21",
15
15
  "names": []
16
16
  }
@@ -25,8 +25,11 @@ export declare function Route(props: RouteProps): SinwanElement;
25
25
  export declare function isRouteElement(value: unknown): value is SinwanElement;
26
26
  /** Walk JSX children (and fragments) into native `RouteDefinition[]`. */
27
27
  export declare function collectRouteDefinitions(children: unknown): RouteDefinition[];
28
+ /** Non-route siblings (nav, layout) to render beside the outlet. */
29
+ export declare function layoutNodes(children: unknown): SinwanNode[];
28
30
  /**
29
31
  * Declarative JSX router. Builds a `Router` from `<Route>` children
30
- * (same fields as `RouteDefinition`) and renders a `<RouterOutlet />`.
32
+ * (same fields as `RouteDefinition`), provides `RouterKey` to layout
33
+ * siblings such as `<NavLink>`, and renders a `<RouterOutlet />`.
31
34
  */
32
35
  export declare const Routes: SinwanComponent<RoutesProps>;
@@ -1,7 +1,6 @@
1
1
  /**
2
- * Link click interception and JSX class adapter.
2
+ * Link click interception.
3
3
  */
4
- import type { Reactive } from "sinwan/component";
5
4
  /** Fields read from a click event to decide client-side navigation. */
6
5
  export interface LinkClickEvent {
7
6
  button: number;
@@ -15,11 +14,6 @@ export interface LinkInterceptOptions {
15
14
  target?: string;
16
15
  download?: string | boolean;
17
16
  }
18
- /**
19
- * Sinwan JSX types `class` as `string`; the renderer accepts Reactive<string>.
20
- * Isolated here so call sites do not use `any`.
21
- */
22
- export declare function jsxClass(value: Reactive<string>): string;
23
17
  /** True when the href should be left to the browser (other origin or scheme). */
24
18
  export declare function isExternalHref(href: string): boolean;
25
19
  /** True when the href is an in-page hash (no path change). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sinwan-router",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Client-side router for Sinwan apps — declarative route matching, params, lazy loading, and prefetching built on Sinwan's reactivity system.",
5
5
  "author": "Mohammed Ben Cheikh",
6
6
  "license": "MIT",
@@ -39,12 +39,11 @@
39
39
  "typecheck": "bunx tsc -p tsconfig.json"
40
40
  },
41
41
  "peerDependencies": {
42
- "sinwan": ">=1.3.0 <2.0.0"
42
+ "sinwan": ">=1.3.3 <2.0.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/bun": "latest",
46
46
  "bun-plugin-sinwan": "^0.2.5",
47
- "sinwan": "^1.3.0",
48
47
  "happy-dom": "^20.9.0",
49
48
  "typescript": "^5"
50
49
  }