@studiolambda/router 0.1.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/matcher-C4dv_pr6.cjs +2 -0
- package/dist/{matcher-CTRKcf7I.cjs.map → matcher-C4dv_pr6.cjs.map} +1 -1
- package/dist/{matcher-ehhvtyaT.js → matcher-CQObVRFk.js} +2 -1
- package/dist/{matcher-ehhvtyaT.js.map → matcher-CQObVRFk.js.map} +1 -1
- package/dist/router.cjs +1 -1
- package/dist/router.js +1 -1
- package/dist/router_react.cjs +2 -2
- package/dist/router_react.cjs.map +1 -1
- package/dist/router_react.js +233 -154
- package/dist/router_react.js.map +1 -1
- package/dist/src/react/components/NotFound.d.ts +5 -2
- package/dist/src/react/components/Router.d.ts +1 -1
- package/dist/src/react/context/NavigationContext.d.ts +1 -1
- package/dist/src/react/context/NavigationSignalContext.d.ts +6 -1
- package/dist/src/react/context/NavigationTypeContext.d.ts +6 -1
- package/dist/src/react/context/ParamsContext.d.ts +10 -0
- package/dist/src/react/context/PathnameContext.d.ts +5 -4
- package/dist/src/react/context/TransitionContext.d.ts +0 -6
- package/dist/src/react/context/UrlContext.d.ts +12 -0
- package/dist/src/react/createRouter.d.ts +5 -0
- package/dist/src/react/extractPathname.d.ts +1 -2
- package/dist/src/react/hooks/useBack.d.ts +7 -1
- package/dist/src/react/hooks/useForward.d.ts +8 -1
- package/dist/src/react/hooks/useNavigate.d.ts +15 -0
- package/dist/src/react/hooks/useNavigation.d.ts +10 -0
- package/dist/src/react/hooks/useNavigationEvents.d.ts +18 -0
- package/dist/src/react/hooks/useNavigationHandlers.d.ts +9 -0
- package/dist/src/react/hooks/useNavigationSignal.d.ts +15 -0
- package/dist/src/react/hooks/useNavigationType.d.ts +18 -0
- package/dist/src/react/hooks/useNextMatch.d.ts +11 -0
- package/dist/src/react/hooks/useParams.d.ts +1 -0
- package/dist/src/react/hooks/usePathname.d.ts +1 -0
- package/dist/src/react/hooks/usePrefetch.d.ts +57 -0
- package/dist/src/react/hooks/useSearchParams.d.ts +9 -5
- package/dist/src/react/index.d.ts +2 -1
- package/dist/src/react/navigation/createMemoryNavigation.d.ts +5 -1
- package/package.json +1 -1
- package/dist/matcher-CTRKcf7I.cjs +0 -2
- package/dist/src/react/context/PropsContext.d.ts +0 -10
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){let t=e?.root??{children:new Map};function n(e,n){let r=e.split(`/`).filter(Boolean),i=t;for(let t of r){if(t.startsWith(`*`)){let n=t.length>1?t.slice(1):`*`;if(!i.wildcard)i.wildcard={children:new Map,name:n};else if(i.wildcard.name!==n)throw Error(`conflicting wildcard param name at "${e}": existing "*${i.wildcard.name}" vs new "*${n}"`);i=i.wildcard;continue}if(t.startsWith(`:`)){let n=t.slice(1);if(!i.child)i.child={children:new Map,name:n};else if(i.child.name!==n)throw Error(`conflicting dynamic param name at "${e}": existing ":${i.child.name}" vs new ":${n}"`);i=i.child;continue}let n=i.children.get(t);n||(n={children:new Map},i.children.set(t,n)),i=n}if(i.handler!==void 0)throw Error(`duplicate route registration for pattern "${e}"`);i.handler=n}function r(e){let n=e.split(`/`).filter(Boolean);function r(e,t,i){if(t===n.length)return e.handler===void 0?null:{handler:e.handler,params:i};let a=n[t],o=e.children.get(a);if(o){let e=r(o,t+1,i);if(e)return e}if(e.child&&e.child.name){let n=r(e.child,t+1,{...i,[e.child.name]:a});if(n)return n}if(e.wildcard&&e.wildcard.name&&e.wildcard.handler!==void 0){let r=n.slice(t).join(`/`);return{handler:e.wildcard.handler,params:{...i,[e.wildcard.name]:r}}}return null}return r(t,0,{})}return{register:n,match:r}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
|
|
2
|
+
//# sourceMappingURL=matcher-C4dv_pr6.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher-CTRKcf7I.cjs","names":[],"sources":["../src/router/matcher.ts"],"sourcesContent":["/**\n * Describes a route matcher that maps URL path patterns to\n * handlers. Supports static segments, dynamic `:param`\n * segments, and wildcard `*param` segments with a trie-based\n * lookup.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Matcher<T> {\n /**\n * Registers a route pattern with a corresponding handler.\n * Patterns use `/`-separated segments where `:name` denotes\n * a dynamic parameter (e.g. `/user/:id/posts`) and `*name`\n * denotes a wildcard that captures the rest of the path\n * (e.g. `/files/*path`). A bare `*` captures into a param\n * named `'*'`.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to associate with this pattern.\n */\n readonly register: (pattern: string, handler: T) => void\n\n /**\n * Attempts to match a URL path against registered routes.\n * Static segments take priority over dynamic ones, which\n * take priority over wildcard segments. Returns the matched\n * handler and extracted parameters, or `null` if no route\n * matches.\n *\n * @param path - The URL path to match (e.g. `/user/42`).\n * @returns The resolved match with handler and params, or null.\n */\n readonly match: (path: string) => Resolved<T> | null\n}\n\n/**\n * The result of a successful route match. Contains the handler\n * registered for the matched pattern and a record of extracted\n * dynamic parameters.\n *\n * @typeParam T - The handler type associated with the route.\n */\nexport interface Resolved<T> {\n /**\n * The handler that was registered for the matched route pattern.\n */\n readonly handler: T\n\n /**\n * Dynamic path parameters extracted from the URL. Keys are the\n * parameter names from the pattern (without the `:` prefix),\n * values are the corresponding URL segments.\n *\n * @example\n * Pattern `/user/:id` matched against `/user/42`\n * produces `{ id: \"42\" }`.\n */\n readonly params: Record<string, string>\n}\n\n/**\n * Configuration options for creating a new matcher instance.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Options<T> {\n /**\n * An existing trie root node to use instead of creating\n * an empty one. Useful for pre-built or shared route trees.\n */\n readonly root?: Node<T>\n}\n\n/**\n * A node in the route-matching trie. Each node represents a\n * single URL path segment and may hold a handler (indicating\n * a complete route), static children (keyed by segment string),\n * a single dynamic child (for `:param` segments), and/or a\n * wildcard child (for `*param` segments that capture the rest\n * of the path).\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Node<T> {\n /**\n * Map of static child segments. Each key is a literal path\n * segment string (e.g. `\"user\"`, `\"posts\"`).\n */\n readonly children: Map<string, Node<T>>\n\n /**\n * The handler registered at this node, or `undefined` if\n * this node is only an intermediate segment in a longer\n * pattern.\n */\n handler?: T\n\n /**\n * The single dynamic child node for `:param` segments.\n * Only one dynamic segment is allowed per trie level.\n */\n child?: Node<T>\n\n /**\n * The parameter name for this dynamic segment (without the\n * `:` prefix). Only set on nodes created from `:param`\n * patterns.\n */\n readonly name?: string\n\n /**\n * The wildcard child node for `*param` segments. Captures\n * all remaining path segments into a single parameter.\n * Only one wildcard is allowed per trie level and it must\n * be the last segment in the pattern.\n */\n wildcard?: Node<T>\n}\n\n/**\n * Creates a new trie-based route matcher. Routes are registered\n * with patterns containing static segments, dynamic (`:param`)\n * segments, and wildcard (`*param`) segments. Matching\n * prioritises static segments over dynamic ones, and dynamic\n * over wildcards, performing a depth-first search through the\n * trie.\n *\n * Wildcard segments capture all remaining path segments into a\n * single parameter joined by `/`. A bare `*` captures into\n * a param named `'*'`. Wildcards must be the last segment\n * in a pattern.\n *\n * @typeParam T - The handler type associated with each route.\n * @param options - Optional configuration with a pre-built root node.\n * @returns A matcher instance with `register` and `match` methods.\n */\nexport function createMatcher<T>(options?: Options<T>): Matcher<T> {\n const root: Node<T> = options?.root ?? { children: new Map() }\n\n /**\n * Registers a route pattern by walking/creating trie nodes\n * for each segment and attaching the handler at the leaf.\n * Wildcard segments (`*param`) create a terminal wildcard\n * node — no further segments are allowed after a wildcard.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to store at the leaf node.\n */\n function register(pattern: string, handler: T) {\n const segments = pattern.split('/').filter(Boolean)\n let node = root\n\n for (const segment of segments) {\n if (segment.startsWith('*')) {\n const name = segment.length > 1 ? segment.slice(1) : '*'\n\n if (!node.wildcard) {\n node.wildcard = { children: new Map(), name }\n } else if (node.wildcard.name !== name) {\n throw new Error(\n `conflicting wildcard param name at \"${pattern}\": ` +\n `existing \"*${node.wildcard.name}\" vs new \"*${name}\"`\n )\n }\n\n node = node.wildcard\n continue\n }\n\n if (segment.startsWith(':')) {\n const name = segment.slice(1)\n\n if (!node.child) {\n node.child = { children: new Map(), name }\n } else if (node.child.name !== name) {\n throw new Error(\n `conflicting dynamic param name at \"${pattern}\": ` +\n `existing \":${node.child.name}\" vs new \":${name}\"`\n )\n }\n\n node = node.child\n continue\n }\n\n let next = node.children.get(segment)\n\n if (!next) {\n next = { children: new Map() }\n node.children.set(segment, next)\n }\n\n node = next\n }\n\n node.handler = handler\n }\n\n /**\n * Matches a URL path against the trie by splitting it into\n * segments and performing a depth-first search. Static\n * children are tried before the dynamic child, and dynamic\n * before the wildcard, at each level.\n *\n * @param path - The URL path to match.\n * @returns The resolved handler and params, or null.\n */\n function match(path: string): Resolved<T> | null {\n const segments = path.split('/').filter(Boolean)\n\n /**\n * Recursively searches the trie for a matching route.\n * Tries the static child first (exact segment match),\n * then falls back to the dynamic child, and finally\n * to the wildcard child which captures all remaining\n * segments.\n *\n * @param node - The current trie node being examined.\n * @param index - The current segment index in the path.\n * @param params - Accumulated dynamic parameters so far.\n * @returns The resolved match, or null if no match found.\n */\n function search(\n node: Node<T>,\n index: number,\n params: Record<string, string>\n ): Resolved<T> | null {\n if (index === segments.length) {\n return node.handler !== undefined ? { handler: node.handler, params } : null\n }\n\n const segment = segments[index]\n\n const child = node.children.get(segment)\n\n if (child) {\n const result = search(child, index + 1, params)\n\n if (result) {\n return result\n }\n }\n\n if (node.child && node.child.name) {\n const result = search(node.child, index + 1, {\n ...params,\n [node.child.name]: segment,\n })\n\n if (result) {\n return result\n }\n }\n\n if (node.wildcard && node.wildcard.name && node.wildcard.handler !== undefined) {\n const rest = segments.slice(index).join('/')\n\n return {\n handler: node.wildcard.handler,\n params: { ...params, [node.wildcard.name]: rest },\n }\n }\n\n return null\n }\n\n return search(root, 0, {})\n }\n\n return { register, match }\n}\n"],"mappings":"AAwIA,SAAgB,EAAiB,EAAkC,CACjE,IAAM,EAAgB,GAAS,MAAQ,CAAE,SAAU,IAAI,IAAO,CAW9D,SAAS,EAAS,EAAiB,EAAY,CAC7C,IAAM,EAAW,EAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ,CAC/C,EAAO,EAEX,IAAK,IAAM,KAAW,EAAU,CAC9B,GAAI,EAAQ,WAAW,IAAI,CAAE,CAC3B,IAAM,EAAO,EAAQ,OAAS,EAAI,EAAQ,MAAM,EAAE,CAAG,IAErD,GAAI,CAAC,EAAK,SACR,EAAK,SAAW,CAAE,SAAU,IAAI,IAAO,OAAM,SACpC,EAAK,SAAS,OAAS,EAChC,MAAU,MACR,uCAAuC,EAAQ,gBAC/B,EAAK,SAAS,KAAK,aAAa,EAAK,GACtD,CAGH,EAAO,EAAK,SACZ,SAGF,GAAI,EAAQ,WAAW,IAAI,CAAE,CAC3B,IAAM,EAAO,EAAQ,MAAM,EAAE,CAE7B,GAAI,CAAC,EAAK,MACR,EAAK,MAAQ,CAAE,SAAU,IAAI,IAAO,OAAM,SACjC,EAAK,MAAM,OAAS,EAC7B,MAAU,MACR,sCAAsC,EAAQ,gBAC9B,EAAK,MAAM,KAAK,aAAa,EAAK,GACnD,CAGH,EAAO,EAAK,MACZ,SAGF,IAAI,EAAO,EAAK,SAAS,IAAI,EAAQ,CAEhC,IACH,EAAO,CAAE,SAAU,IAAI,IAAO,CAC9B,EAAK,SAAS,IAAI,EAAS,EAAK,EAGlC,EAAO,EAGT,EAAK,QAAU,EAYjB,SAAS,EAAM,EAAkC,CAC/C,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAchD,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,IAAU,EAAS,OACrB,OAAO,EAAK,UAAY,IAAA,GAAgD,KAApC,CAAE,QAAS,EAAK,QAAS,SAAQ,CAGvE,IAAM,EAAU,EAAS,GAEnB,EAAQ,EAAK,SAAS,IAAI,EAAQ,CAExC,GAAI,EAAO,CACT,IAAM,EAAS,EAAO,EAAO,EAAQ,EAAG,EAAO,CAE/C,GAAI,EACF,OAAO,EAIX,GAAI,EAAK,OAAS,EAAK,MAAM,KAAM,CACjC,IAAM,EAAS,EAAO,EAAK,MAAO,EAAQ,EAAG,CAC3C,GAAG,GACF,EAAK,MAAM,MAAO,EACpB,CAAC,CAEF,GAAI,EACF,OAAO,EAIX,GAAI,EAAK,UAAY,EAAK,SAAS,MAAQ,EAAK,SAAS,UAAY,IAAA,GAAW,CAC9E,IAAM,EAAO,EAAS,MAAM,EAAM,CAAC,KAAK,IAAI,CAE5C,MAAO,CACL,QAAS,EAAK,SAAS,QACvB,OAAQ,CAAE,GAAG,GAAS,EAAK,SAAS,MAAO,EAAM,CAClD,CAGH,OAAO,KAGT,OAAO,EAAO,EAAM,EAAG,EAAE,CAAC,CAG5B,MAAO,CAAE,WAAU,QAAO"}
|
|
1
|
+
{"version":3,"file":"matcher-C4dv_pr6.cjs","names":[],"sources":["../src/router/matcher.ts"],"sourcesContent":["/**\n * Describes a route matcher that maps URL path patterns to\n * handlers. Supports static segments, dynamic `:param`\n * segments, and wildcard `*param` segments with a trie-based\n * lookup.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Matcher<T> {\n /**\n * Registers a route pattern with a corresponding handler.\n * Patterns use `/`-separated segments where `:name` denotes\n * a dynamic parameter (e.g. `/user/:id/posts`) and `*name`\n * denotes a wildcard that captures the rest of the path\n * (e.g. `/files/*path`). A bare `*` captures into a param\n * named `'*'`.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to associate with this pattern.\n */\n readonly register: (pattern: string, handler: T) => void\n\n /**\n * Attempts to match a URL path against registered routes.\n * Static segments take priority over dynamic ones, which\n * take priority over wildcard segments. Returns the matched\n * handler and extracted parameters, or `null` if no route\n * matches.\n *\n * @param path - The URL path to match (e.g. `/user/42`).\n * @returns The resolved match with handler and params, or null.\n */\n readonly match: (path: string) => Resolved<T> | null\n}\n\n/**\n * The result of a successful route match. Contains the handler\n * registered for the matched pattern and a record of extracted\n * dynamic parameters.\n *\n * @typeParam T - The handler type associated with the route.\n */\nexport interface Resolved<T> {\n /**\n * The handler that was registered for the matched route pattern.\n */\n readonly handler: T\n\n /**\n * Dynamic path parameters extracted from the URL. Keys are the\n * parameter names from the pattern (without the `:` prefix),\n * values are the corresponding URL segments.\n *\n * @example\n * Pattern `/user/:id` matched against `/user/42`\n * produces `{ id: \"42\" }`.\n */\n readonly params: Record<string, string>\n}\n\n/**\n * Configuration options for creating a new matcher instance.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Options<T> {\n /**\n * An existing trie root node to use instead of creating\n * an empty one. Useful for pre-built or shared route trees.\n */\n readonly root?: Node<T>\n}\n\n/**\n * A node in the route-matching trie. Each node represents a\n * single URL path segment and may hold a handler (indicating\n * a complete route), static children (keyed by segment string),\n * a single dynamic child (for `:param` segments), and/or a\n * wildcard child (for `*param` segments that capture the rest\n * of the path).\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Node<T> {\n /**\n * Map of static child segments. Each key is a literal path\n * segment string (e.g. `\"user\"`, `\"posts\"`).\n */\n readonly children: Map<string, Node<T>>\n\n /**\n * The handler registered at this node, or `undefined` if\n * this node is only an intermediate segment in a longer\n * pattern.\n */\n handler?: T\n\n /**\n * The single dynamic child node for `:param` segments.\n * Only one dynamic segment is allowed per trie level.\n */\n child?: Node<T>\n\n /**\n * The parameter name for this dynamic segment (without the\n * `:` prefix). Only set on nodes created from `:param`\n * patterns.\n */\n readonly name?: string\n\n /**\n * The wildcard child node for `*param` segments. Captures\n * all remaining path segments into a single parameter.\n * Only one wildcard is allowed per trie level and it must\n * be the last segment in the pattern.\n */\n wildcard?: Node<T>\n}\n\n/**\n * Creates a new trie-based route matcher. Routes are registered\n * with patterns containing static segments, dynamic (`:param`)\n * segments, and wildcard (`*param`) segments. Matching\n * prioritises static segments over dynamic ones, and dynamic\n * over wildcards, performing a depth-first search through the\n * trie.\n *\n * Wildcard segments capture all remaining path segments into a\n * single parameter joined by `/`. A bare `*` captures into\n * a param named `'*'`. Wildcards must be the last segment\n * in a pattern.\n *\n * @typeParam T - The handler type associated with each route.\n * @param options - Optional configuration with a pre-built root node.\n * @returns A matcher instance with `register` and `match` methods.\n */\nexport function createMatcher<T>(options?: Options<T>): Matcher<T> {\n const root: Node<T> = options?.root ?? { children: new Map() }\n\n /**\n * Registers a route pattern by walking/creating trie nodes\n * for each segment and attaching the handler at the leaf.\n * Wildcard segments (`*param`) create a terminal wildcard\n * node — no further segments are allowed after a wildcard.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to store at the leaf node.\n */\n function register(pattern: string, handler: T) {\n const segments = pattern.split('/').filter(Boolean)\n let node = root\n\n for (const segment of segments) {\n if (segment.startsWith('*')) {\n const name = segment.length > 1 ? segment.slice(1) : '*'\n\n if (!node.wildcard) {\n node.wildcard = { children: new Map(), name }\n } else if (node.wildcard.name !== name) {\n throw new Error(\n `conflicting wildcard param name at \"${pattern}\": ` +\n `existing \"*${node.wildcard.name}\" vs new \"*${name}\"`\n )\n }\n\n node = node.wildcard\n continue\n }\n\n if (segment.startsWith(':')) {\n const name = segment.slice(1)\n\n if (!node.child) {\n node.child = { children: new Map(), name }\n } else if (node.child.name !== name) {\n throw new Error(\n `conflicting dynamic param name at \"${pattern}\": ` +\n `existing \":${node.child.name}\" vs new \":${name}\"`\n )\n }\n\n node = node.child\n continue\n }\n\n let next = node.children.get(segment)\n\n if (!next) {\n next = { children: new Map() }\n node.children.set(segment, next)\n }\n\n node = next\n }\n\n if (node.handler !== undefined) {\n throw new Error(`duplicate route registration for pattern \"${pattern}\"`)\n }\n\n node.handler = handler\n }\n\n /**\n * Matches a URL path against the trie by splitting it into\n * segments and performing a depth-first search. Static\n * children are tried before the dynamic child, and dynamic\n * before the wildcard, at each level.\n *\n * @param path - The URL path to match.\n * @returns The resolved handler and params, or null.\n */\n function match(path: string): Resolved<T> | null {\n const segments = path.split('/').filter(Boolean)\n\n /**\n * Recursively searches the trie for a matching route.\n * Tries the static child first (exact segment match),\n * then falls back to the dynamic child, and finally\n * to the wildcard child which captures all remaining\n * segments.\n *\n * @param node - The current trie node being examined.\n * @param index - The current segment index in the path.\n * @param params - Accumulated dynamic parameters so far.\n * @returns The resolved match, or null if no match found.\n */\n function search(\n node: Node<T>,\n index: number,\n params: Record<string, string>\n ): Resolved<T> | null {\n if (index === segments.length) {\n return node.handler !== undefined ? { handler: node.handler, params } : null\n }\n\n const segment = segments[index]\n\n const child = node.children.get(segment)\n\n if (child) {\n const result = search(child, index + 1, params)\n\n if (result) {\n return result\n }\n }\n\n if (node.child && node.child.name) {\n const result = search(node.child, index + 1, {\n ...params,\n [node.child.name]: segment,\n })\n\n if (result) {\n return result\n }\n }\n\n if (node.wildcard && node.wildcard.name && node.wildcard.handler !== undefined) {\n const rest = segments.slice(index).join('/')\n\n return {\n handler: node.wildcard.handler,\n params: { ...params, [node.wildcard.name]: rest },\n }\n }\n\n return null\n }\n\n return search(root, 0, {})\n }\n\n return { register, match }\n}\n"],"mappings":"AAwIA,SAAgB,EAAiB,EAAkC,CACjE,IAAM,EAAgB,GAAS,MAAQ,CAAE,SAAU,IAAI,IAAO,CAW9D,SAAS,EAAS,EAAiB,EAAY,CAC7C,IAAM,EAAW,EAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ,CAC/C,EAAO,EAEX,IAAK,IAAM,KAAW,EAAU,CAC9B,GAAI,EAAQ,WAAW,IAAI,CAAE,CAC3B,IAAM,EAAO,EAAQ,OAAS,EAAI,EAAQ,MAAM,EAAE,CAAG,IAErD,GAAI,CAAC,EAAK,SACR,EAAK,SAAW,CAAE,SAAU,IAAI,IAAO,OAAM,SACpC,EAAK,SAAS,OAAS,EAChC,MAAU,MACR,uCAAuC,EAAQ,gBAC/B,EAAK,SAAS,KAAK,aAAa,EAAK,GACtD,CAGH,EAAO,EAAK,SACZ,SAGF,GAAI,EAAQ,WAAW,IAAI,CAAE,CAC3B,IAAM,EAAO,EAAQ,MAAM,EAAE,CAE7B,GAAI,CAAC,EAAK,MACR,EAAK,MAAQ,CAAE,SAAU,IAAI,IAAO,OAAM,SACjC,EAAK,MAAM,OAAS,EAC7B,MAAU,MACR,sCAAsC,EAAQ,gBAC9B,EAAK,MAAM,KAAK,aAAa,EAAK,GACnD,CAGH,EAAO,EAAK,MACZ,SAGF,IAAI,EAAO,EAAK,SAAS,IAAI,EAAQ,CAEhC,IACH,EAAO,CAAE,SAAU,IAAI,IAAO,CAC9B,EAAK,SAAS,IAAI,EAAS,EAAK,EAGlC,EAAO,EAGT,GAAI,EAAK,UAAY,IAAA,GACnB,MAAU,MAAM,6CAA6C,EAAQ,GAAG,CAG1E,EAAK,QAAU,EAYjB,SAAS,EAAM,EAAkC,CAC/C,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAchD,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,IAAU,EAAS,OACrB,OAAO,EAAK,UAAY,IAAA,GAAgD,KAApC,CAAE,QAAS,EAAK,QAAS,SAAQ,CAGvE,IAAM,EAAU,EAAS,GAEnB,EAAQ,EAAK,SAAS,IAAI,EAAQ,CAExC,GAAI,EAAO,CACT,IAAM,EAAS,EAAO,EAAO,EAAQ,EAAG,EAAO,CAE/C,GAAI,EACF,OAAO,EAIX,GAAI,EAAK,OAAS,EAAK,MAAM,KAAM,CACjC,IAAM,EAAS,EAAO,EAAK,MAAO,EAAQ,EAAG,CAC3C,GAAG,GACF,EAAK,MAAM,MAAO,EACpB,CAAC,CAEF,GAAI,EACF,OAAO,EAIX,GAAI,EAAK,UAAY,EAAK,SAAS,MAAQ,EAAK,SAAS,UAAY,IAAA,GAAW,CAC9E,IAAM,EAAO,EAAS,MAAM,EAAM,CAAC,KAAK,IAAI,CAE5C,MAAO,CACL,QAAS,EAAK,SAAS,QACvB,OAAQ,CAAE,GAAG,GAAS,EAAK,SAAS,MAAO,EAAM,CAClD,CAGH,OAAO,KAGT,OAAO,EAAO,EAAM,EAAG,EAAE,CAAC,CAG5B,MAAO,CAAE,WAAU,QAAO"}
|
|
@@ -27,6 +27,7 @@ function e(e) {
|
|
|
27
27
|
let n = i.children.get(t);
|
|
28
28
|
n || (n = { children: /* @__PURE__ */ new Map() }, i.children.set(t, n)), i = n;
|
|
29
29
|
}
|
|
30
|
+
if (i.handler !== void 0) throw Error(`duplicate route registration for pattern "${e}"`);
|
|
30
31
|
i.handler = n;
|
|
31
32
|
}
|
|
32
33
|
function r(e) {
|
|
@@ -70,4 +71,4 @@ function e(e) {
|
|
|
70
71
|
//#endregion
|
|
71
72
|
export { e as t };
|
|
72
73
|
|
|
73
|
-
//# sourceMappingURL=matcher-
|
|
74
|
+
//# sourceMappingURL=matcher-CQObVRFk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher-ehhvtyaT.js","names":[],"sources":["../src/router/matcher.ts"],"sourcesContent":["/**\n * Describes a route matcher that maps URL path patterns to\n * handlers. Supports static segments, dynamic `:param`\n * segments, and wildcard `*param` segments with a trie-based\n * lookup.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Matcher<T> {\n /**\n * Registers a route pattern with a corresponding handler.\n * Patterns use `/`-separated segments where `:name` denotes\n * a dynamic parameter (e.g. `/user/:id/posts`) and `*name`\n * denotes a wildcard that captures the rest of the path\n * (e.g. `/files/*path`). A bare `*` captures into a param\n * named `'*'`.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to associate with this pattern.\n */\n readonly register: (pattern: string, handler: T) => void\n\n /**\n * Attempts to match a URL path against registered routes.\n * Static segments take priority over dynamic ones, which\n * take priority over wildcard segments. Returns the matched\n * handler and extracted parameters, or `null` if no route\n * matches.\n *\n * @param path - The URL path to match (e.g. `/user/42`).\n * @returns The resolved match with handler and params, or null.\n */\n readonly match: (path: string) => Resolved<T> | null\n}\n\n/**\n * The result of a successful route match. Contains the handler\n * registered for the matched pattern and a record of extracted\n * dynamic parameters.\n *\n * @typeParam T - The handler type associated with the route.\n */\nexport interface Resolved<T> {\n /**\n * The handler that was registered for the matched route pattern.\n */\n readonly handler: T\n\n /**\n * Dynamic path parameters extracted from the URL. Keys are the\n * parameter names from the pattern (without the `:` prefix),\n * values are the corresponding URL segments.\n *\n * @example\n * Pattern `/user/:id` matched against `/user/42`\n * produces `{ id: \"42\" }`.\n */\n readonly params: Record<string, string>\n}\n\n/**\n * Configuration options for creating a new matcher instance.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Options<T> {\n /**\n * An existing trie root node to use instead of creating\n * an empty one. Useful for pre-built or shared route trees.\n */\n readonly root?: Node<T>\n}\n\n/**\n * A node in the route-matching trie. Each node represents a\n * single URL path segment and may hold a handler (indicating\n * a complete route), static children (keyed by segment string),\n * a single dynamic child (for `:param` segments), and/or a\n * wildcard child (for `*param` segments that capture the rest\n * of the path).\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Node<T> {\n /**\n * Map of static child segments. Each key is a literal path\n * segment string (e.g. `\"user\"`, `\"posts\"`).\n */\n readonly children: Map<string, Node<T>>\n\n /**\n * The handler registered at this node, or `undefined` if\n * this node is only an intermediate segment in a longer\n * pattern.\n */\n handler?: T\n\n /**\n * The single dynamic child node for `:param` segments.\n * Only one dynamic segment is allowed per trie level.\n */\n child?: Node<T>\n\n /**\n * The parameter name for this dynamic segment (without the\n * `:` prefix). Only set on nodes created from `:param`\n * patterns.\n */\n readonly name?: string\n\n /**\n * The wildcard child node for `*param` segments. Captures\n * all remaining path segments into a single parameter.\n * Only one wildcard is allowed per trie level and it must\n * be the last segment in the pattern.\n */\n wildcard?: Node<T>\n}\n\n/**\n * Creates a new trie-based route matcher. Routes are registered\n * with patterns containing static segments, dynamic (`:param`)\n * segments, and wildcard (`*param`) segments. Matching\n * prioritises static segments over dynamic ones, and dynamic\n * over wildcards, performing a depth-first search through the\n * trie.\n *\n * Wildcard segments capture all remaining path segments into a\n * single parameter joined by `/`. A bare `*` captures into\n * a param named `'*'`. Wildcards must be the last segment\n * in a pattern.\n *\n * @typeParam T - The handler type associated with each route.\n * @param options - Optional configuration with a pre-built root node.\n * @returns A matcher instance with `register` and `match` methods.\n */\nexport function createMatcher<T>(options?: Options<T>): Matcher<T> {\n const root: Node<T> = options?.root ?? { children: new Map() }\n\n /**\n * Registers a route pattern by walking/creating trie nodes\n * for each segment and attaching the handler at the leaf.\n * Wildcard segments (`*param`) create a terminal wildcard\n * node — no further segments are allowed after a wildcard.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to store at the leaf node.\n */\n function register(pattern: string, handler: T) {\n const segments = pattern.split('/').filter(Boolean)\n let node = root\n\n for (const segment of segments) {\n if (segment.startsWith('*')) {\n const name = segment.length > 1 ? segment.slice(1) : '*'\n\n if (!node.wildcard) {\n node.wildcard = { children: new Map(), name }\n } else if (node.wildcard.name !== name) {\n throw new Error(\n `conflicting wildcard param name at \"${pattern}\": ` +\n `existing \"*${node.wildcard.name}\" vs new \"*${name}\"`\n )\n }\n\n node = node.wildcard\n continue\n }\n\n if (segment.startsWith(':')) {\n const name = segment.slice(1)\n\n if (!node.child) {\n node.child = { children: new Map(), name }\n } else if (node.child.name !== name) {\n throw new Error(\n `conflicting dynamic param name at \"${pattern}\": ` +\n `existing \":${node.child.name}\" vs new \":${name}\"`\n )\n }\n\n node = node.child\n continue\n }\n\n let next = node.children.get(segment)\n\n if (!next) {\n next = { children: new Map() }\n node.children.set(segment, next)\n }\n\n node = next\n }\n\n node.handler = handler\n }\n\n /**\n * Matches a URL path against the trie by splitting it into\n * segments and performing a depth-first search. Static\n * children are tried before the dynamic child, and dynamic\n * before the wildcard, at each level.\n *\n * @param path - The URL path to match.\n * @returns The resolved handler and params, or null.\n */\n function match(path: string): Resolved<T> | null {\n const segments = path.split('/').filter(Boolean)\n\n /**\n * Recursively searches the trie for a matching route.\n * Tries the static child first (exact segment match),\n * then falls back to the dynamic child, and finally\n * to the wildcard child which captures all remaining\n * segments.\n *\n * @param node - The current trie node being examined.\n * @param index - The current segment index in the path.\n * @param params - Accumulated dynamic parameters so far.\n * @returns The resolved match, or null if no match found.\n */\n function search(\n node: Node<T>,\n index: number,\n params: Record<string, string>\n ): Resolved<T> | null {\n if (index === segments.length) {\n return node.handler !== undefined ? { handler: node.handler, params } : null\n }\n\n const segment = segments[index]\n\n const child = node.children.get(segment)\n\n if (child) {\n const result = search(child, index + 1, params)\n\n if (result) {\n return result\n }\n }\n\n if (node.child && node.child.name) {\n const result = search(node.child, index + 1, {\n ...params,\n [node.child.name]: segment,\n })\n\n if (result) {\n return result\n }\n }\n\n if (node.wildcard && node.wildcard.name && node.wildcard.handler !== undefined) {\n const rest = segments.slice(index).join('/')\n\n return {\n handler: node.wildcard.handler,\n params: { ...params, [node.wildcard.name]: rest },\n }\n }\n\n return null\n }\n\n return search(root, 0, {})\n }\n\n return { register, match }\n}\n"],"mappings":";AAwIA,SAAgB,EAAiB,GAAkC;CACjE,IAAM,IAAgB,GAAS,QAAQ,EAAE,0BAAU,IAAI,KAAK,EAAE;CAW9D,SAAS,EAAS,GAAiB,GAAY;EAC7C,IAAM,IAAW,EAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ,EAC/C,IAAO;AAEX,OAAK,IAAM,KAAW,GAAU;AAC9B,OAAI,EAAQ,WAAW,IAAI,EAAE;IAC3B,IAAM,IAAO,EAAQ,SAAS,IAAI,EAAQ,MAAM,EAAE,GAAG;AAErD,QAAI,CAAC,EAAK,SACR,GAAK,WAAW;KAAE,0BAAU,IAAI,KAAK;KAAE;KAAM;aACpC,EAAK,SAAS,SAAS,EAChC,OAAU,MACR,uCAAuC,EAAQ,gBAC/B,EAAK,SAAS,KAAK,aAAa,EAAK,GACtD;AAGH,QAAO,EAAK;AACZ;;AAGF,OAAI,EAAQ,WAAW,IAAI,EAAE;IAC3B,IAAM,IAAO,EAAQ,MAAM,EAAE;AAE7B,QAAI,CAAC,EAAK,MACR,GAAK,QAAQ;KAAE,0BAAU,IAAI,KAAK;KAAE;KAAM;aACjC,EAAK,MAAM,SAAS,EAC7B,OAAU,MACR,sCAAsC,EAAQ,gBAC9B,EAAK,MAAM,KAAK,aAAa,EAAK,GACnD;AAGH,QAAO,EAAK;AACZ;;GAGF,IAAI,IAAO,EAAK,SAAS,IAAI,EAAQ;AAOrC,GALK,MACH,IAAO,EAAE,0BAAU,IAAI,KAAK,EAAE,EAC9B,EAAK,SAAS,IAAI,GAAS,EAAK,GAGlC,IAAO;;AAGT,IAAK,UAAU;;CAYjB,SAAS,EAAM,GAAkC;EAC/C,IAAM,IAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;EAchD,SAAS,EACP,GACA,GACA,GACoB;AACpB,OAAI,MAAU,EAAS,OACrB,QAAO,EAAK,YAAY,KAAA,IAAgD,OAApC;IAAE,SAAS,EAAK;IAAS;IAAQ;GAGvE,IAAM,IAAU,EAAS,IAEnB,IAAQ,EAAK,SAAS,IAAI,EAAQ;AAExC,OAAI,GAAO;IACT,IAAM,IAAS,EAAO,GAAO,IAAQ,GAAG,EAAO;AAE/C,QAAI,EACF,QAAO;;AAIX,OAAI,EAAK,SAAS,EAAK,MAAM,MAAM;IACjC,IAAM,IAAS,EAAO,EAAK,OAAO,IAAQ,GAAG;KAC3C,GAAG;MACF,EAAK,MAAM,OAAO;KACpB,CAAC;AAEF,QAAI,EACF,QAAO;;AAIX,OAAI,EAAK,YAAY,EAAK,SAAS,QAAQ,EAAK,SAAS,YAAY,KAAA,GAAW;IAC9E,IAAM,IAAO,EAAS,MAAM,EAAM,CAAC,KAAK,IAAI;AAE5C,WAAO;KACL,SAAS,EAAK,SAAS;KACvB,QAAQ;MAAE,GAAG;OAAS,EAAK,SAAS,OAAO;MAAM;KAClD;;AAGH,UAAO;;AAGT,SAAO,EAAO,GAAM,GAAG,EAAE,CAAC;;AAG5B,QAAO;EAAE;EAAU;EAAO"}
|
|
1
|
+
{"version":3,"file":"matcher-CQObVRFk.js","names":[],"sources":["../src/router/matcher.ts"],"sourcesContent":["/**\n * Describes a route matcher that maps URL path patterns to\n * handlers. Supports static segments, dynamic `:param`\n * segments, and wildcard `*param` segments with a trie-based\n * lookup.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Matcher<T> {\n /**\n * Registers a route pattern with a corresponding handler.\n * Patterns use `/`-separated segments where `:name` denotes\n * a dynamic parameter (e.g. `/user/:id/posts`) and `*name`\n * denotes a wildcard that captures the rest of the path\n * (e.g. `/files/*path`). A bare `*` captures into a param\n * named `'*'`.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to associate with this pattern.\n */\n readonly register: (pattern: string, handler: T) => void\n\n /**\n * Attempts to match a URL path against registered routes.\n * Static segments take priority over dynamic ones, which\n * take priority over wildcard segments. Returns the matched\n * handler and extracted parameters, or `null` if no route\n * matches.\n *\n * @param path - The URL path to match (e.g. `/user/42`).\n * @returns The resolved match with handler and params, or null.\n */\n readonly match: (path: string) => Resolved<T> | null\n}\n\n/**\n * The result of a successful route match. Contains the handler\n * registered for the matched pattern and a record of extracted\n * dynamic parameters.\n *\n * @typeParam T - The handler type associated with the route.\n */\nexport interface Resolved<T> {\n /**\n * The handler that was registered for the matched route pattern.\n */\n readonly handler: T\n\n /**\n * Dynamic path parameters extracted from the URL. Keys are the\n * parameter names from the pattern (without the `:` prefix),\n * values are the corresponding URL segments.\n *\n * @example\n * Pattern `/user/:id` matched against `/user/42`\n * produces `{ id: \"42\" }`.\n */\n readonly params: Record<string, string>\n}\n\n/**\n * Configuration options for creating a new matcher instance.\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Options<T> {\n /**\n * An existing trie root node to use instead of creating\n * an empty one. Useful for pre-built or shared route trees.\n */\n readonly root?: Node<T>\n}\n\n/**\n * A node in the route-matching trie. Each node represents a\n * single URL path segment and may hold a handler (indicating\n * a complete route), static children (keyed by segment string),\n * a single dynamic child (for `:param` segments), and/or a\n * wildcard child (for `*param` segments that capture the rest\n * of the path).\n *\n * @typeParam T - The handler type associated with each route.\n */\nexport interface Node<T> {\n /**\n * Map of static child segments. Each key is a literal path\n * segment string (e.g. `\"user\"`, `\"posts\"`).\n */\n readonly children: Map<string, Node<T>>\n\n /**\n * The handler registered at this node, or `undefined` if\n * this node is only an intermediate segment in a longer\n * pattern.\n */\n handler?: T\n\n /**\n * The single dynamic child node for `:param` segments.\n * Only one dynamic segment is allowed per trie level.\n */\n child?: Node<T>\n\n /**\n * The parameter name for this dynamic segment (without the\n * `:` prefix). Only set on nodes created from `:param`\n * patterns.\n */\n readonly name?: string\n\n /**\n * The wildcard child node for `*param` segments. Captures\n * all remaining path segments into a single parameter.\n * Only one wildcard is allowed per trie level and it must\n * be the last segment in the pattern.\n */\n wildcard?: Node<T>\n}\n\n/**\n * Creates a new trie-based route matcher. Routes are registered\n * with patterns containing static segments, dynamic (`:param`)\n * segments, and wildcard (`*param`) segments. Matching\n * prioritises static segments over dynamic ones, and dynamic\n * over wildcards, performing a depth-first search through the\n * trie.\n *\n * Wildcard segments capture all remaining path segments into a\n * single parameter joined by `/`. A bare `*` captures into\n * a param named `'*'`. Wildcards must be the last segment\n * in a pattern.\n *\n * @typeParam T - The handler type associated with each route.\n * @param options - Optional configuration with a pre-built root node.\n * @returns A matcher instance with `register` and `match` methods.\n */\nexport function createMatcher<T>(options?: Options<T>): Matcher<T> {\n const root: Node<T> = options?.root ?? { children: new Map() }\n\n /**\n * Registers a route pattern by walking/creating trie nodes\n * for each segment and attaching the handler at the leaf.\n * Wildcard segments (`*param`) create a terminal wildcard\n * node — no further segments are allowed after a wildcard.\n *\n * @param pattern - The URL path pattern to register.\n * @param handler - The handler to store at the leaf node.\n */\n function register(pattern: string, handler: T) {\n const segments = pattern.split('/').filter(Boolean)\n let node = root\n\n for (const segment of segments) {\n if (segment.startsWith('*')) {\n const name = segment.length > 1 ? segment.slice(1) : '*'\n\n if (!node.wildcard) {\n node.wildcard = { children: new Map(), name }\n } else if (node.wildcard.name !== name) {\n throw new Error(\n `conflicting wildcard param name at \"${pattern}\": ` +\n `existing \"*${node.wildcard.name}\" vs new \"*${name}\"`\n )\n }\n\n node = node.wildcard\n continue\n }\n\n if (segment.startsWith(':')) {\n const name = segment.slice(1)\n\n if (!node.child) {\n node.child = { children: new Map(), name }\n } else if (node.child.name !== name) {\n throw new Error(\n `conflicting dynamic param name at \"${pattern}\": ` +\n `existing \":${node.child.name}\" vs new \":${name}\"`\n )\n }\n\n node = node.child\n continue\n }\n\n let next = node.children.get(segment)\n\n if (!next) {\n next = { children: new Map() }\n node.children.set(segment, next)\n }\n\n node = next\n }\n\n if (node.handler !== undefined) {\n throw new Error(`duplicate route registration for pattern \"${pattern}\"`)\n }\n\n node.handler = handler\n }\n\n /**\n * Matches a URL path against the trie by splitting it into\n * segments and performing a depth-first search. Static\n * children are tried before the dynamic child, and dynamic\n * before the wildcard, at each level.\n *\n * @param path - The URL path to match.\n * @returns The resolved handler and params, or null.\n */\n function match(path: string): Resolved<T> | null {\n const segments = path.split('/').filter(Boolean)\n\n /**\n * Recursively searches the trie for a matching route.\n * Tries the static child first (exact segment match),\n * then falls back to the dynamic child, and finally\n * to the wildcard child which captures all remaining\n * segments.\n *\n * @param node - The current trie node being examined.\n * @param index - The current segment index in the path.\n * @param params - Accumulated dynamic parameters so far.\n * @returns The resolved match, or null if no match found.\n */\n function search(\n node: Node<T>,\n index: number,\n params: Record<string, string>\n ): Resolved<T> | null {\n if (index === segments.length) {\n return node.handler !== undefined ? { handler: node.handler, params } : null\n }\n\n const segment = segments[index]\n\n const child = node.children.get(segment)\n\n if (child) {\n const result = search(child, index + 1, params)\n\n if (result) {\n return result\n }\n }\n\n if (node.child && node.child.name) {\n const result = search(node.child, index + 1, {\n ...params,\n [node.child.name]: segment,\n })\n\n if (result) {\n return result\n }\n }\n\n if (node.wildcard && node.wildcard.name && node.wildcard.handler !== undefined) {\n const rest = segments.slice(index).join('/')\n\n return {\n handler: node.wildcard.handler,\n params: { ...params, [node.wildcard.name]: rest },\n }\n }\n\n return null\n }\n\n return search(root, 0, {})\n }\n\n return { register, match }\n}\n"],"mappings":";AAwIA,SAAgB,EAAiB,GAAkC;CACjE,IAAM,IAAgB,GAAS,QAAQ,EAAE,0BAAU,IAAI,KAAK,EAAE;CAW9D,SAAS,EAAS,GAAiB,GAAY;EAC7C,IAAM,IAAW,EAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ,EAC/C,IAAO;AAEX,OAAK,IAAM,KAAW,GAAU;AAC9B,OAAI,EAAQ,WAAW,IAAI,EAAE;IAC3B,IAAM,IAAO,EAAQ,SAAS,IAAI,EAAQ,MAAM,EAAE,GAAG;AAErD,QAAI,CAAC,EAAK,SACR,GAAK,WAAW;KAAE,0BAAU,IAAI,KAAK;KAAE;KAAM;aACpC,EAAK,SAAS,SAAS,EAChC,OAAU,MACR,uCAAuC,EAAQ,gBAC/B,EAAK,SAAS,KAAK,aAAa,EAAK,GACtD;AAGH,QAAO,EAAK;AACZ;;AAGF,OAAI,EAAQ,WAAW,IAAI,EAAE;IAC3B,IAAM,IAAO,EAAQ,MAAM,EAAE;AAE7B,QAAI,CAAC,EAAK,MACR,GAAK,QAAQ;KAAE,0BAAU,IAAI,KAAK;KAAE;KAAM;aACjC,EAAK,MAAM,SAAS,EAC7B,OAAU,MACR,sCAAsC,EAAQ,gBAC9B,EAAK,MAAM,KAAK,aAAa,EAAK,GACnD;AAGH,QAAO,EAAK;AACZ;;GAGF,IAAI,IAAO,EAAK,SAAS,IAAI,EAAQ;AAOrC,GALK,MACH,IAAO,EAAE,0BAAU,IAAI,KAAK,EAAE,EAC9B,EAAK,SAAS,IAAI,GAAS,EAAK,GAGlC,IAAO;;AAGT,MAAI,EAAK,YAAY,KAAA,EACnB,OAAU,MAAM,6CAA6C,EAAQ,GAAG;AAG1E,IAAK,UAAU;;CAYjB,SAAS,EAAM,GAAkC;EAC/C,IAAM,IAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;EAchD,SAAS,EACP,GACA,GACA,GACoB;AACpB,OAAI,MAAU,EAAS,OACrB,QAAO,EAAK,YAAY,KAAA,IAAgD,OAApC;IAAE,SAAS,EAAK;IAAS;IAAQ;GAGvE,IAAM,IAAU,EAAS,IAEnB,IAAQ,EAAK,SAAS,IAAI,EAAQ;AAExC,OAAI,GAAO;IACT,IAAM,IAAS,EAAO,GAAO,IAAQ,GAAG,EAAO;AAE/C,QAAI,EACF,QAAO;;AAIX,OAAI,EAAK,SAAS,EAAK,MAAM,MAAM;IACjC,IAAM,IAAS,EAAO,EAAK,OAAO,IAAQ,GAAG;KAC3C,GAAG;MACF,EAAK,MAAM,OAAO;KACpB,CAAC;AAEF,QAAI,EACF,QAAO;;AAIX,OAAI,EAAK,YAAY,EAAK,SAAS,QAAQ,EAAK,SAAS,YAAY,KAAA,GAAW;IAC9E,IAAM,IAAO,EAAS,MAAM,EAAM,CAAC,KAAK,IAAI;AAE5C,WAAO;KACL,SAAS,EAAK,SAAS;KACvB,QAAQ;MAAE,GAAG;OAAS,EAAK,SAAS,OAAO;MAAM;KAClD;;AAGH,UAAO;;AAGT,SAAO,EAAO,GAAM,GAAG,EAAE,CAAC;;AAG5B,QAAO;EAAE;EAAU;EAAO"}
|
package/dist/router.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./matcher-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./matcher-C4dv_pr6.cjs`);exports.createMatcher=e.t;
|
package/dist/router.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "./matcher-
|
|
1
|
+
import { t as e } from "./matcher-CQObVRFk.js";
|
|
2
2
|
export { e as createMatcher };
|
package/dist/router_react.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);const t=require(`./matcher-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);const t=require(`./matcher-C4dv_pr6.cjs`);let n=require(`react/jsx-runtime`),r=require(`react`);function i({value:e,children:t}){return e?.reduceRight((e,t,r)=>(0,n.jsx)(t,{children:e},r),t)??t}var a=e((e=>{var t=require(`react`).__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;e.c=function(e){return t.H.useMemoCache(e)}})),o=e((e=>{process.env.NODE_ENV!==`production`&&(function(){var t=require(`react`).__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;e.c=function(e){var n=t.H;return n===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
|
|
2
2
|
1. You might have mismatching versions of React and the renderer (such as React DOM)
|
|
3
3
|
2. You might be breaking the Rules of Hooks
|
|
4
4
|
3. You might have more than one copy of React in the same app
|
|
5
|
-
See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),n.useMemoCache(e)}})()})),s=e(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=a():t.exports=o()}))(),c=(0,r.createContext)({}),l=(0,r.createContext)(null),u=(0,r.createContext)(null),d=(0,r.createContext)(null);function f(){let e=(0,s.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,n.jsx)(`div`,{children:`Not Found`}),e[0]=t):t=e[0],t}var p=(0,r.createContext)(null);function m(e){let t=e??(0,r.use)(p);if(t===null)throw Error(`useNavigationHandlers requires a <Router> or <TransitionContext> provider`);let[,n]=t;function i(e){if(e.prefetch===void 0)return;let t=e.prefetch;return async function(n){await t({params:e.params,url:e.url,controller:n})}}function a(e){return function(){return new Promise(function(t,r){n(async function(){try{await e(),t()}catch(e){r(e)}})})}}return{createPrecommitHandler:i,createHandler:a}}var h=(0,r.createContext)(t.t());function g(e){let t=e?.matcher??(0,r.use)(h);return function(e,n){let r={handler:{component:n},params:{}};return e?t.match(new URL(e,`http://localhost`).pathname)??r:r}}function _(e,t){let n=(0,r.useEffectEvent)(function(e){t.onNavigate?.(e)}),i=(0,r.useEffectEvent)(function(){t.onNavigateSuccess?.()}),a=(0,r.useEffectEvent)(function(e){t.onNavigateError?.(e.error)});(0,r.useEffect)(function(){return e.addEventListener(`navigate`,n),e.addEventListener(`navigatesuccess`,i),e.addEventListener(`navigateerror`,a),function(){e.removeEventListener(`navigate`,n),e.removeEventListener(`navigatesuccess`,i),e.removeEventListener(`navigateerror`,a)}},[e])}var v=(0,r.createContext)(`/`);function y(e){return e?new URL(e,`http://localhost`).pathname:`/`}function b(e){let t=(0,s.c)(44),a=(0,r.use)(l),o=e.navigation??a??(typeof window<`u`?window.navigation:void 0);if(o==null)throw Error(`Router requires a navigation prop, NavigationContext provider, or browser Navigation API support. Use createMemoryNavigation() for SSR or non-browser environments.`);let b=e.matcher??(0,r.use)(h),x=(0,r.useTransition)(),S=e.transition??x,C;t[0]===b?C=t[1]:(C={matcher:b},t[0]=b,t[1]=C);let w=g(C),T=e.notFound??f,E;t[2]!==o.currentEntry?.url||t[3]!==w||t[4]!==T?(E=function(){let e=o.currentEntry?.url??null;return{match:w(e,T),signal:null,navigationType:null,pathname:y(e)}},t[2]=o.currentEntry?.url,t[3]=w,t[4]=T,t[5]=E):E=t[5];let[D,O]=(0,r.useState)(E),{createPrecommitHandler:k,createHandler:A}=m(S),j;t[6]!==A||t[7]!==k||t[8]!==w||t[9]!==T?(j=function(e){if(!e.canIntercept||e.hashChange||e.downloadRequest!==null)return;let t=w(e.destination.url,T);if(e.formData!==null&&t.handler.formHandler!==void 0){e.intercept({scroll:t.handler.scroll,focusReset:t.handler.focusReset,async handler(){await t.handler.formHandler(e.formData,e)}});return}let n=k({prefetch:t.handler.prefetch,params:t.params,url:new URL(e.destination.url)}),r=A(function(){O({match:t,signal:e.signal,navigationType:e.navigationType,pathname:y(e.destination.url)})});e.intercept({handler:r,precommitHandler:n,scroll:t.handler.scroll,focusReset:t.handler.focusReset})},t[6]=A,t[7]=k,t[8]=w,t[9]=T,t[10]=j):j=t[10];let M=(0,r.useEffectEvent)(j),N;t[11]!==M||t[12]!==e.onNavigateError||t[13]!==e.onNavigateSuccess?(N={onNavigate:M,onNavigateSuccess:e.onNavigateSuccess,onNavigateError:e.onNavigateError},t[11]=M,t[12]=e.onNavigateError,t[13]=e.onNavigateSuccess,t[14]=N):N=t[14],_(o,N);let P=D.match.handler.component,F=D.match.handler.middlewares,I;t[15]===P?I=t[16]:(I=(0,n.jsx)(P,{}),t[15]=P,t[16]=I);let L;t[17]!==F||t[18]!==I?(L=(0,n.jsx)(i,{value:F,children:I}),t[17]=F,t[18]=I,t[19]=L):L=t[19];let R;t[20]!==e.fallback||t[21]!==L?(R=(0,n.jsx)(r.Suspense,{fallback:e.fallback,children:L}),t[20]=e.fallback,t[21]=L,t[22]=R):R=t[22];let z;t[23]!==D.match.params||t[24]!==R?(z=(0,n.jsx)(c,{value:D.match.params,children:R}),t[23]=D.match.params,t[24]=R,t[25]=z):z=t[25];let B;t[26]!==D.pathname||t[27]!==z?(B=(0,n.jsx)(v,{value:D.pathname,children:z}),t[26]=D.pathname,t[27]=z,t[28]=B):B=t[28];let V;t[29]!==D.signal||t[30]!==B?(V=(0,n.jsx)(u,{value:D.signal,children:B}),t[29]=D.signal,t[30]=B,t[31]=V):V=t[31];let H;t[32]!==D.navigationType||t[33]!==V?(H=(0,n.jsx)(d,{value:D.navigationType,children:V}),t[32]=D.navigationType,t[33]=V,t[34]=H):H=t[34];let U;t[35]!==b||t[36]!==H?(U=(0,n.jsx)(h,{value:b,children:H}),t[35]=b,t[36]=H,t[37]=U):U=t[37];let W;t[38]!==o||t[39]!==U?(W=(0,n.jsx)(l,{value:o,children:U}),t[38]=o,t[39]=U,t[40]=W):W=t[40];let G;return t[41]!==W||t[42]!==S?(G=(0,n.jsx)(p,{value:S,children:W}),t[41]=W,t[42]=S,t[43]=G):G=t[43],G}function x(e,t){let n=S(e,(0,r.use)(v),t?.exact??!0);return{isActive:n,props:{"data-active":n||void 0,"aria-current":n?`page`:void 0}}}function S(e,t,n){if(e===void 0)return!1;let r=y(e);return n?r===t:t===r||t.startsWith(r+`/`)}function C(e){let t=e?.matcher??(0,r.use)(h);return function(e){let n=new URL(e,`http://localhost`),r=t.match(n.pathname);if(r?.handler.prefetch===void 0)return;let i={params:r.params,url:n,controller:{redirect(){},addHandler(){}}};return r.handler.prefetch(i)}}function w(e,t){let{href:n,on:i,once:a=!0,matcher:o}=t,s=C({matcher:o}),c=(0,r.useEffectEvent)(function(e,t){for(let t of e)t.isIntersecting&&n!==void 0&&s(n);a&&t.disconnect()}),l=(0,r.useEffectEvent)(function(){n!==void 0&&s(n)});(0,r.useEffect)(function(){if(i===void 0)return;let t=e.current;if(t!==null)switch(i){case`hover`:return t.addEventListener(`mouseenter`,l,{once:a}),function(){t.removeEventListener(`mouseenter`,l)};case`viewport`:{let e=new IntersectionObserver(c);return e.observe(t),function(){e.disconnect()}}}},[i,a,n,e])}function T(e){let t=(0,s.c)(23),i,a,o,c,l,u,d;t[0]===e?(i=t[1],a=t[2],o=t[3],c=t[4],l=t[5],u=t[6],d=t[7]):({prefetch:c,once:u,href:a,matcher:o,className:i,activeExact:d,...l}=e,t[0]=e,t[1]=i,t[2]=a,t[3]=o,t[4]=c,t[5]=l,t[6]=u,t[7]=d);let f=u===void 0?!0:u,p=d===void 0?!0:d,m=(0,r.useRef)(null),h;t[8]===p?h=t[9]:(h={exact:p},t[8]=p,t[9]=h);let{isActive:g,props:_}=x(a,h),v;t[10]!==a||t[11]!==o||t[12]!==f||t[13]!==c?(v={href:a,on:c,once:f,matcher:o},t[10]=a,t[11]=o,t[12]=f,t[13]=c,t[14]=v):v=t[14],w(m,v);let y;t[15]!==i||t[16]!==g?(y=typeof i==`function`?i({isActive:g}):i,t[15]=i,t[16]=g,t[17]=y):y=t[17];let b=y,S;return t[18]!==_||t[19]!==a||t[20]!==l||t[21]!==b?(S=(0,n.jsx)(`a`,{ref:m,href:a,className:b,..._,...l}),t[18]=_,t[19]=a,t[20]=l,t[21]=b,t[22]=S):S=t[22],S}function E(){let e=(0,r.use)(l);if(e===null)throw Error(`useNavigation requires a <Router> or <NavigationContext> provider`);return e}function D(){let e=E();return function(t,n){return e.navigate(t,n)}}function O(){return(0,r.use)(u)}function k(){return(0,r.use)(d)}function A(){return(0,r.use)(c)}function j(){let e=(0,r.use)(p);if(e===null)throw Error(`useIsPending requires a <Router> or <TransitionContext> provider`);return e[0]}function M(){return(0,r.use)(v)}function N(){let e=E(),t=e.currentEntry?.url,n=t?new URL(t).searchParams:new URLSearchParams;function r(t,n){let r=e.currentEntry,i=new URL(r?.url??`/`,`http://localhost`),a=typeof t==`function`?t(i.searchParams):t,o=(a instanceof URLSearchParams?a:new URLSearchParams(a)).toString(),s=i.pathname+(o?`?`+o:``);return e.navigate(s,{history:n?.history??`replace`})}return[n,r]}function P(){let e=E();function t(t){return e.back(t)}return{back:t,canGoBack:e.canGoBack}}function F(){let e=E();function t(t){return e.forward(t)}return{forward:t,canGoForward:e.canGoForward}}function I(e){let t={url:e.url};function n(){}function r(){}function i(){return{committed:Promise.resolve(t),finished:Promise.resolve(t)}}function a(){return[t]}return{currentEntry:t,canGoBack:!1,canGoForward:!1,transition:null,addEventListener:n,removeEventListener:r,navigate:i,entries:a}}function L(e,t){return e===``&&t===``?``:e===``?t:t===``||t===`/`?e:(e.endsWith(`/`)?e.slice(0,-1):e)+(t.startsWith(`/`)?t:`/`+t)}function R(e){if(e.length!==0)return e.length===1?e[0]:async function(t){for(let n of e)await n(t)}}function z(){return null}function B(e,t){return function(n){let r={path:n,middlewares:[],prefetches:[],scroll:void 0,focusReset:void 0,formHandler:void 0};function i(){let e=L(t.prefix,r.path??``);if(e===``)throw Error(`cannot register a route without a path or group prefix`);return e}function a(){let e=[...t.middlewares,...r.middlewares];return e.length>0?e:void 0}function o(){return R([...t.prefetches,...r.prefetches])}let s={middleware(e){return r.middlewares.push(...e),s},prefetch(e){return r.prefetches.push(e),s},scroll(e){return r.scroll=e,s},focusReset(e){return r.focusReset=e,s},formHandler(e){return r.formHandler=e,s},render(t){let n=i(),s={component:t,middlewares:a(),prefetch:o(),scroll:r.scroll,focusReset:r.focusReset,formHandler:r.formHandler};e.register(n,s)},redirect(t){let n=i(),r={component:z,prefetch:function(e){let n=typeof t==`function`?t(e):t;e.controller.redirect(n)}};e.register(n,r)},group(){return B(e,{prefix:L(t.prefix,r.path??``),middlewares:[...t.middlewares,...r.middlewares],prefetches:[...t.prefetches,...r.prefetches]})}};return s}}function V(e){let n=t.t();return e(B(n,{prefix:``,middlewares:[],prefetches:[]})),n}exports.Link=T,exports.MatcherContext=h,exports.Middlewares=i,exports.NavigationContext=l,exports.NavigationSignalContext=u,exports.NavigationTypeContext=d,exports.NotFound=f,exports.ParamsContext=c,exports.PathnameContext=v,exports.Router=b,exports.TransitionContext=p,exports.createMemoryNavigation=I,exports.createRouter=V,exports.extractPathname=y,exports.useActiveLinkProps=x,exports.useBack=P,exports.useForward=F,exports.useIsPending=j,exports.useNavigate=D,exports.useNavigation=E,exports.useNavigationEvents=_,exports.useNavigationHandlers=m,exports.useNavigationSignal=O,exports.useNavigationType=k,exports.useNextMatch=g,exports.useParams=A,exports.usePathname=M,exports.usePrefetch=C,exports.usePrefetchEffect=w,exports.useSearchParams=N;
|
|
5
|
+
See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),n.useMemoCache(e)}})()})),s=e(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=a():t.exports=o()}))(),c=(0,r.createContext)(null),l=(0,r.createContext)(null),u=(0,r.createContext)(void 0),d=(0,r.createContext)(void 0);function f(){let e=(0,s.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,n.jsx)(`h1`,{children:`Not Found`}),e[0]=t):t=e[0],t}var p=(0,r.createContext)(null);function m(e){let t=e??(0,r.use)(p);if(t===null)throw Error(`useNavigationHandlers requires a <Router> or <TransitionContext> provider`);let[,n]=t;function i(e){if(e.prefetch===void 0)return;let t=e.prefetch;return async function(n){await t({params:e.params,url:e.url,controller:n})}}function a(e){return function(){return new Promise(function(t,r){n(async function(){try{await e(),t()}catch(e){r(e)}})})}}return{createPrecommitHandler:i,createHandler:a}}var h=(0,r.createContext)(t.t());function g(e){let t=e?.matcher??(0,r.use)(h);return function(e,n){let r={handler:{component:n},params:{}};return e?t.match(new URL(e,`http://localhost`).pathname)??r:r}}function _(e,t){let n=(0,r.useEffectEvent)(function(e){t.onNavigate?.(e)}),i=(0,r.useEffectEvent)(function(){t.onNavigateSuccess?.()}),a=(0,r.useEffectEvent)(function(e){t.onNavigateError?.(e.error)});(0,r.useEffect)(function(){return e.addEventListener(`navigate`,n),e.addEventListener(`navigatesuccess`,i),e.addEventListener(`navigateerror`,a),function(){e.removeEventListener(`navigate`,n),e.removeEventListener(`navigatesuccess`,i),e.removeEventListener(`navigateerror`,a)}},[e])}var v=(0,r.createContext)(null),y=(0,r.createContext)(null);function b(e){return e==null?`/`:new URL(e,`http://localhost`).pathname}function x(e){let t=(0,s.c)(47),a=(0,r.use)(l),o=e.navigation??a??(typeof window<`u`?window.navigation:void 0);if(o==null)throw Error(`Router requires a navigation prop, NavigationContext provider, or browser Navigation API support. Use createMemoryNavigation() for SSR or non-browser environments.`);let x=e.matcher??(0,r.use)(h),S=(0,r.useTransition)(),C=e.transition??S,w;t[0]===x?w=t[1]:(w={matcher:x},t[0]=x,t[1]=w);let T=g(w),E=e.notFound??f,D;t[2]!==o.currentEntry?.url||t[3]!==T||t[4]!==E?(D=function(){let e=o.currentEntry?.url??null;return{match:T(e,E),signal:null,navigationType:null,pathname:b(e),url:e}},t[2]=o.currentEntry?.url,t[3]=T,t[4]=E,t[5]=D):D=t[5];let[O,k]=(0,r.useState)(D),{createPrecommitHandler:A,createHandler:j}=m(C),M;t[6]!==j||t[7]!==A||t[8]!==T||t[9]!==E?(M=function(e){if(!e.canIntercept||e.hashChange||e.downloadRequest!==null)return;let t=T(e.destination.url,E);if(e.formData!==null&&t.handler.formHandler!==void 0){e.intercept({scroll:t.handler.scroll,focusReset:t.handler.focusReset,async handler(){await t.handler.formHandler(e.formData,e)}});return}let n=A({prefetch:t.handler.prefetch,params:t.params,url:new URL(e.destination.url)}),r=j(function(){k({match:t,signal:e.signal,navigationType:e.navigationType,pathname:b(e.destination.url),url:e.destination.url})});e.intercept({handler:r,precommitHandler:n,scroll:t.handler.scroll,focusReset:t.handler.focusReset})},t[6]=j,t[7]=A,t[8]=T,t[9]=E,t[10]=M):M=t[10];let N=(0,r.useEffectEvent)(M),P;t[11]!==N||t[12]!==e.onNavigateError||t[13]!==e.onNavigateSuccess?(P={onNavigate:N,onNavigateSuccess:e.onNavigateSuccess,onNavigateError:e.onNavigateError},t[11]=N,t[12]=e.onNavigateError,t[13]=e.onNavigateSuccess,t[14]=P):P=t[14],_(o,P);let F=O.match.handler.component,I=O.match.handler.middlewares,L;t[15]===F?L=t[16]:(L=(0,n.jsx)(F,{}),t[15]=F,t[16]=L);let R;t[17]!==I||t[18]!==L?(R=(0,n.jsx)(i,{value:I,children:L}),t[17]=I,t[18]=L,t[19]=R):R=t[19];let z;t[20]!==e.fallback||t[21]!==R?(z=(0,n.jsx)(r.Suspense,{fallback:e.fallback,children:R}),t[20]=e.fallback,t[21]=R,t[22]=z):z=t[22];let B;t[23]!==O.match.params||t[24]!==z?(B=(0,n.jsx)(c,{value:O.match.params,children:z}),t[23]=O.match.params,t[24]=z,t[25]=B):B=t[25];let V;t[26]!==O.url||t[27]!==B?(V=(0,n.jsx)(y,{value:O.url,children:B}),t[26]=O.url,t[27]=B,t[28]=V):V=t[28];let H;t[29]!==O.pathname||t[30]!==V?(H=(0,n.jsx)(v,{value:O.pathname,children:V}),t[29]=O.pathname,t[30]=V,t[31]=H):H=t[31];let U;t[32]!==O.signal||t[33]!==H?(U=(0,n.jsx)(u,{value:O.signal,children:H}),t[32]=O.signal,t[33]=H,t[34]=U):U=t[34];let W;t[35]!==O.navigationType||t[36]!==U?(W=(0,n.jsx)(d,{value:O.navigationType,children:U}),t[35]=O.navigationType,t[36]=U,t[37]=W):W=t[37];let G;t[38]!==x||t[39]!==W?(G=(0,n.jsx)(h,{value:x,children:W}),t[38]=x,t[39]=W,t[40]=G):G=t[40];let K;t[41]!==o||t[42]!==G?(K=(0,n.jsx)(l,{value:o,children:G}),t[41]=o,t[42]=G,t[43]=K):K=t[43];let q;return t[44]!==K||t[45]!==C?(q=(0,n.jsx)(p,{value:C,children:K}),t[44]=K,t[45]=C,t[46]=q):q=t[46],q}function S(e,t){let n=(0,r.use)(v);if(n===null)return{isActive:!1,props:{"data-active":void 0,"aria-current":void 0}};let i=C(e,n,t?.exact??!0);return{isActive:i,props:{"data-active":i||void 0,"aria-current":i?`page`:void 0}}}function C(e,t,n){if(e===void 0)return!1;let r=b(e);return n?r===t:t===r||t.startsWith(r+`/`)}var w=new WeakMap;function T(e){w.delete(e)}function E(e){let t=e?.matcher??(0,r.use)(h);return function(e){let n=new URL(e,`http://localhost`),r=t.match(n.pathname);if(r?.handler.prefetch===void 0)return;let i=w.get(t);if(i===void 0&&(i=new Set,w.set(t,i)),i.has(n.pathname))return;i.add(n.pathname);let a={params:r.params,url:n,controller:{redirect(){},addHandler(){}}};return r.handler.prefetch(a)}}function D(e,t){let{href:n,on:i,once:a=!0,matcher:o}=t,s=E({matcher:o}),c=(0,r.useEffectEvent)(function(e,t){for(let t of e)t.isIntersecting&&n!==void 0&&s(n);a&&t.disconnect()}),l=(0,r.useEffectEvent)(function(){n!==void 0&&s(n)});(0,r.useEffect)(function(){if(i===void 0)return;let t=e.current;if(t!==null)switch(i){case`hover`:return t.addEventListener(`mouseenter`,l,{once:a}),function(){t.removeEventListener(`mouseenter`,l)};case`viewport`:{let e=new IntersectionObserver(c);return e.observe(t),function(){e.disconnect()}}}},[i,a,n,e])}function O(e){let t=(0,s.c)(23),i,a,o,c,l,u,d;t[0]===e?(i=t[1],a=t[2],o=t[3],c=t[4],l=t[5],u=t[6],d=t[7]):({prefetch:c,once:u,href:a,matcher:o,className:i,activeExact:d,...l}=e,t[0]=e,t[1]=i,t[2]=a,t[3]=o,t[4]=c,t[5]=l,t[6]=u,t[7]=d);let f=u===void 0?!0:u,p=d===void 0?!0:d,m=(0,r.useRef)(null),h;t[8]===p?h=t[9]:(h={exact:p},t[8]=p,t[9]=h);let{isActive:g,props:_}=S(a,h),v;t[10]!==a||t[11]!==o||t[12]!==f||t[13]!==c?(v={href:a,on:c,once:f,matcher:o},t[10]=a,t[11]=o,t[12]=f,t[13]=c,t[14]=v):v=t[14],D(m,v);let y;t[15]!==i||t[16]!==g?(y=typeof i==`function`?i({isActive:g}):i,t[15]=i,t[16]=g,t[17]=y):y=t[17];let b=y,x;return t[18]!==_||t[19]!==a||t[20]!==l||t[21]!==b?(x=(0,n.jsx)(`a`,{ref:m,href:a,className:b,..._,...l}),t[18]=_,t[19]=a,t[20]=l,t[21]=b,t[22]=x):x=t[22],x}function k(){let e=(0,r.use)(l);if(e===null)throw Error(`useNavigation requires a <Router> or <NavigationContext> provider`);return e}function A(){let e=k();return function(t,n){return e.navigate(t,n)}}function j(){let e=(0,r.use)(u);if(e===void 0)throw Error(`useNavigationSignal requires a <Router> or <NavigationSignalContext> provider`);return e}function M(){let e=(0,r.use)(d);if(e===void 0)throw Error(`useNavigationType requires a <Router> or <NavigationTypeContext> provider`);return e}function N(){let e=(0,r.use)(c);if(e===null)throw Error(`useParams requires a <Router> or <ParamsContext> provider`);return e}function P(){let e=(0,r.use)(p);if(e===null)throw Error(`useIsPending requires a <Router> or <TransitionContext> provider`);return e[0]}function F(){let e=(0,r.use)(v);if(e===null)throw Error(`usePathname requires a <Router> or <PathnameContext> provider`);return e}function I(){let e=k(),t=(0,r.use)(y),n=t?new URL(t,`http://localhost`).searchParams:new URLSearchParams;function i(n,r){let i=new URL(t??`/`,`http://localhost`),a=typeof n==`function`?n(i.searchParams):n,o=(a instanceof URLSearchParams?a:new URLSearchParams(a)).toString(),s=i.pathname+(o?`?`+o:``)+i.hash;return e.navigate(s,{history:r?.history??`replace`})}return[n,i]}function L(){let e=k(),[t,n]=(0,r.useState)(e.canGoBack);(0,r.useEffect)(function(){function t(){n(e.canGoBack)}return e.addEventListener(`currententrychange`,t),function(){e.removeEventListener(`currententrychange`,t)}},[e]);function i(t){return e.back(t)}return{back:i,canGoBack:t}}function R(){let e=k(),[t,n]=(0,r.useState)(e.canGoForward);(0,r.useEffect)(function(){function t(){n(e.canGoForward)}return e.addEventListener(`currententrychange`,t),function(){e.removeEventListener(`currententrychange`,t)}},[e]);function i(t){return e.forward(t)}return{forward:i,canGoForward:t}}function z(e){let t={url:e.url},n=t,r={committed:Promise.resolve(n),finished:Promise.resolve(n)};function i(){}function a(){}function o(){return r}function s(){return r}function c(){return r}function l(){return r}function u(){}function d(){return[n]}return{currentEntry:t,canGoBack:!1,canGoForward:!1,transition:null,addEventListener:i,removeEventListener:a,navigate:o,back:s,forward:c,traverseTo:l,updateCurrentEntry:u,entries:d}}function B(e,t){return e===``&&t===``?``:e===``?t:t===``||t===`/`?e:(e.endsWith(`/`)?e.slice(0,-1):e)+(t.startsWith(`/`)?t:`/`+t)}function V(e){if(e.length!==0)return e.length===1?e[0]:async function(t){for(let n of e)await n(t)}}function H(){return null}function U(e,t,n){return function(r){let i={path:r,middlewares:[],prefetches:[],scroll:void 0,focusReset:void 0,formHandler:void 0},a=!1;function o(e){if(a)throw Error(`cannot call .${e}() on a route builder that has already been consumed by .render(), .redirect(), or .group()`)}function s(){let e=B(t.prefix,i.path??``);if(e===``)throw Error(`cannot register a route without a path or group prefix`);return e}function c(){let e=[...t.middlewares,...i.middlewares];return e.length>0?e:void 0}function l(){return V([...t.prefetches,...i.prefetches])}let u={middleware(e){return o(`middleware`),i.middlewares.push(...e),u},prefetch(e){return o(`prefetch`),i.prefetches.push(e),u},scroll(e){return o(`scroll`),i.scroll=e,u},focusReset(e){return o(`focusReset`),i.focusReset=e,u},formHandler(e){return o(`formHandler`),i.formHandler=e,u},render(t){o(`render`),a=!0;let n=s(),r={component:t,middlewares:c(),prefetch:l(),scroll:i.scroll,focusReset:i.focusReset,formHandler:i.formHandler};e.register(n,r)},redirect(t){o(`redirect`),a=!0;let r=s();typeof t==`string`&&n.set(r,t);let i={component:H,prefetch:function(e){let n=typeof t==`function`?t(e):t;e.controller.redirect(n)}};e.register(r,i)},group(){return o(`group`),a=!0,U(e,{prefix:B(t.prefix,i.path??``),middlewares:[...t.middlewares,...i.middlewares],prefetches:[...t.prefetches,...i.prefetches]},n)}};return u}}function W(e){for(let[t]of e){let n=new Set,r=t;for(;e.has(r);){if(n.has(r)){let e=[...n,r].join(` -> `);throw Error(`redirect cycle detected: ${e}`)}n.add(r),r=e.get(r)}}}function G(e){let n=t.t(),r=new Map;return e(U(n,{prefix:``,middlewares:[],prefetches:[]},r)),W(r),n}exports.Link=O,exports.MatcherContext=h,exports.Middlewares=i,exports.NavigationContext=l,exports.NavigationSignalContext=u,exports.NavigationTypeContext=d,exports.NotFound=f,exports.ParamsContext=c,exports.PathnameContext=v,exports.Router=x,exports.TransitionContext=p,exports.UrlContext=y,exports.clearPrefetchCache=T,exports.createMemoryNavigation=z,exports.createRouter=G,exports.extractPathname=b,exports.useActiveLinkProps=S,exports.useBack=L,exports.useForward=R,exports.useIsPending=P,exports.useNavigate=A,exports.useNavigation=k,exports.useNavigationEvents=_,exports.useNavigationHandlers=m,exports.useNavigationSignal=j,exports.useNavigationType=M,exports.useNextMatch=g,exports.useParams=N,exports.usePathname=F,exports.usePrefetch=E,exports.usePrefetchEffect=D,exports.useSearchParams=I;
|
|
6
6
|
//# sourceMappingURL=router_react.cjs.map
|