@real-router/core 0.52.0 → 0.54.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +22 -10
  2. package/dist/cjs/Router-CJihdrWA.d.ts +67 -0
  3. package/dist/cjs/Router-CJihdrWA.d.ts.map +1 -0
  4. package/dist/cjs/Router-D8Awa7bY.js +6 -0
  5. package/dist/cjs/Router-D8Awa7bY.js.map +1 -0
  6. package/dist/cjs/RouterError-Bm9YnZ6e.d.ts +310 -0
  7. package/dist/cjs/RouterError-Bm9YnZ6e.d.ts.map +1 -0
  8. package/dist/cjs/api.d.ts +2 -1
  9. package/dist/cjs/api.d.ts.map +1 -1
  10. package/dist/cjs/api.js +1 -1
  11. package/dist/cjs/api.js.map +1 -1
  12. package/dist/cjs/cloneRouter-q-jHlBiv.js +2 -0
  13. package/dist/cjs/cloneRouter-q-jHlBiv.js.map +1 -0
  14. package/dist/cjs/index-8oPDJBQc.d.ts +306 -0
  15. package/dist/cjs/index-8oPDJBQc.d.ts.map +1 -0
  16. package/dist/cjs/{Router-DrBkBdZ5.d.ts → index-EwbhzRQw.d.ts} +4 -69
  17. package/dist/cjs/index-EwbhzRQw.d.ts.map +1 -0
  18. package/dist/cjs/index.d.ts +4 -197
  19. package/dist/cjs/index.d.ts.map +1 -1
  20. package/dist/cjs/index.js +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/{internals-na15rxo_.js → internals-CM6oaz9n.js} +1 -1
  23. package/dist/cjs/internals-CM6oaz9n.js.map +1 -0
  24. package/dist/cjs/utils.d.ts +2 -91
  25. package/dist/cjs/utils.js +1 -1
  26. package/dist/cjs/utils.js.map +1 -1
  27. package/dist/cjs/validation.d.ts +55 -44
  28. package/dist/cjs/validation.d.ts.map +1 -1
  29. package/dist/cjs/validation.js +1 -1
  30. package/dist/esm/Router-BeMyxy_V.mjs +6 -0
  31. package/dist/esm/Router-BeMyxy_V.mjs.map +1 -0
  32. package/dist/esm/Router-BmhiDQUJ.d.mts +67 -0
  33. package/dist/esm/Router-BmhiDQUJ.d.mts.map +1 -0
  34. package/dist/esm/RouterError-hhfSVGtY.d.mts +310 -0
  35. package/dist/esm/RouterError-hhfSVGtY.d.mts.map +1 -0
  36. package/dist/esm/api.d.mts +2 -1
  37. package/dist/esm/api.d.mts.map +1 -1
  38. package/dist/esm/api.mjs +1 -1
  39. package/dist/esm/api.mjs.map +1 -1
  40. package/dist/esm/cloneRouter-C_ULpzHM.mjs +2 -0
  41. package/dist/esm/cloneRouter-C_ULpzHM.mjs.map +1 -0
  42. package/dist/esm/{Router-BeXr2zW4.d.mts → index-DNjaY7KH.d.mts} +4 -69
  43. package/dist/esm/index-DNjaY7KH.d.mts.map +1 -0
  44. package/dist/esm/index-r_JTvSBH.d.mts +306 -0
  45. package/dist/esm/index-r_JTvSBH.d.mts.map +1 -0
  46. package/dist/esm/index.d.mts +4 -197
  47. package/dist/esm/index.d.mts.map +1 -1
  48. package/dist/esm/index.mjs +1 -1
  49. package/dist/esm/index.mjs.map +1 -1
  50. package/dist/esm/{internals-CCymabFj.mjs → internals-C59msvHY.mjs} +1 -1
  51. package/dist/esm/internals-C59msvHY.mjs.map +1 -0
  52. package/dist/esm/utils.d.mts +2 -91
  53. package/dist/esm/utils.mjs +1 -1
  54. package/dist/esm/utils.mjs.map +1 -1
  55. package/dist/esm/validation.d.mts +56 -43
  56. package/dist/esm/validation.d.mts.map +1 -1
  57. package/dist/esm/validation.mjs +1 -1
  58. package/package.json +1 -1
  59. package/src/Router.ts +13 -16
  60. package/src/api/getDependenciesApi.ts +3 -11
  61. package/src/api/getPluginApi.ts +3 -3
  62. package/src/api/getRoutesApi.ts +4 -2
  63. package/src/internals.ts +13 -1
  64. package/src/namespaces/DependenciesNamespace/dependenciesStore.ts +1 -1
  65. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +8 -4
  66. package/src/namespaces/NavigationNamespace/transition/completeTransition.ts +4 -0
  67. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -3
  68. package/src/namespaces/StateNamespace/StateNamespace.ts +2 -2
  69. package/src/utils/createRequestScope.ts +174 -0
  70. package/src/utils/hydrateRouter.ts +68 -12
  71. package/src/utils/index.ts +17 -1
  72. package/src/utils/serializeRouterState.ts +51 -4
  73. package/src/utils/serializeState.ts +46 -5
  74. package/dist/cjs/Router-DrBkBdZ5.d.ts.map +0 -1
  75. package/dist/cjs/Router-Pztue5fk.js +0 -6
  76. package/dist/cjs/Router-Pztue5fk.js.map +0 -1
  77. package/dist/cjs/RouterError-BmvAyBlx.js +0 -2
  78. package/dist/cjs/RouterError-BmvAyBlx.js.map +0 -1
  79. package/dist/cjs/RouterValidator-DLy_W2du.d.ts +0 -114
  80. package/dist/cjs/RouterValidator-DLy_W2du.d.ts.map +0 -1
  81. package/dist/cjs/getPluginApi-CUcFDzuA.js +0 -2
  82. package/dist/cjs/getPluginApi-CUcFDzuA.js.map +0 -1
  83. package/dist/cjs/internals-na15rxo_.js.map +0 -1
  84. package/dist/cjs/utils.d.ts.map +0 -1
  85. package/dist/esm/Router-BeXr2zW4.d.mts.map +0 -1
  86. package/dist/esm/Router-CK8U23pP.mjs +0 -6
  87. package/dist/esm/Router-CK8U23pP.mjs.map +0 -1
  88. package/dist/esm/RouterError-D-Zjbdv9.mjs +0 -2
  89. package/dist/esm/RouterError-D-Zjbdv9.mjs.map +0 -1
  90. package/dist/esm/RouterValidator-C-PvV00i.d.mts +0 -114
  91. package/dist/esm/RouterValidator-C-PvV00i.d.mts.map +0 -1
  92. package/dist/esm/getPluginApi-CsTfDB-O.mjs +0 -2
  93. package/dist/esm/getPluginApi-CsTfDB-O.mjs.map +0 -1
  94. package/dist/esm/internals-CCymabFj.mjs.map +0 -1
  95. package/dist/esm/utils.d.mts.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{m as e,n as t,t as n,u as r}from"./Router-BeMyxy_V.mjs";import{r as i}from"./internals-C59msvHY.mjs";function a(n){if(n())throw new t(e.ROUTER_DISPOSED)}const o=new WeakMap;function s(n){let r=o.get(n);if(r)return r;let s=i(n),c={makeState:(e,t,n,r)=>(s.validator?.state.validateMakeStateArgs(e,t,n),s.makeState(e,t,n,r?.params)),buildState:(e,t)=>{s.validator?.routes.validateStateBuilderArgs(e,t,`buildState`);let{name:n,params:r}=s.forwardState(e,t);return s.buildStateResolved(n,r)},forwardState:(e,t)=>(s.validator?.routes.validateStateBuilderArgs(e,t,`forwardState`),s.forwardState(e,t)),matchPath:e=>(s.validator?.routes.validateMatchPathArgs(e),s.matchPath(e,s.getOptions())),navigateToState:(e,t)=>(a(s.isDisposed),s.validator?.navigation.validateNavigateToStateArgs(e),t!==void 0&&s.validator?.navigation.validateNavigationOptions(t,`navigateToState`),s.navigateToState(e,t)),setRootPath:e=>{a(s.isDisposed),s.validator?.routes.validateSetRootPathArgs(e),s.setRootPath(e)},getRootPath:s.getRootPath,addEventListener:(e,t)=>(a(s.isDisposed),s.validator?.eventBus.validateListenerArgs(e,t),s.addEventListener(e,t)),buildNavigationState:(e,t={})=>{s.validator?.routes.validateStateBuilderArgs(e,t,`buildNavigationState`);let{name:n,params:r}=s.forwardState(e,t),i=s.buildStateResolved(n,r);if(i)return s.makeState(i.name,i.params,s.buildPath(i.name,i.params),i.meta)},getOptions:s.getOptions,getTree:s.getTree,addInterceptor:(e,t)=>{a(s.isDisposed),s.validator?.plugins.validateAddInterceptorArgs(e,t);let n=s.interceptors.get(e);return n||(n=[],s.interceptors.set(e,n)),n.push(t),()=>{let e=n.indexOf(t);e!==-1&&n.splice(e,1)}},getRouteConfig:e=>{let t=s.routeGetStore();if(t.matcher.hasRoute(e))return t.routeCustomFields[e]},extendRouter:r=>{a(s.isDisposed);let i=Object.keys(r);for(let r of i)if(r in n)throw new t(e.PLUGIN_CONFLICT,{message:`Cannot extend router: property "${r}" already exists`});for(let e of i)n[e]=r[e];let o={keys:i};s.routerExtensions.push(o);let c=!1;return()=>{if(c)return;c=!0;for(let e of o.keys)delete n[e];let e=s.routerExtensions.indexOf(o);e!==-1&&s.routerExtensions.splice(e,1)}},emitTransitionError:e=>{a(s.isDisposed),s.emitTransitionError(e)},claimContextNamespace:n=>{if(a(s.isDisposed),s.contextClaimRecords.has(n))throw new t(e.CONTEXT_NAMESPACE_ALREADY_CLAIMED,{message:`Cannot claim context namespace: "${n}" is already claimed by another plugin`});return s.contextClaimRecords.add(n),{write(e,t){e.context[n]=t},release(){s.contextClaimRecords.delete(n)}}}};return o.set(n,c),c}function c(e){let t=i(e),n=t.routeGetStore().lifecycleNamespace;return{addActivateGuard(e,r){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`addActivateGuard`),t.validator?.lifecycle.validateHandler(r,`addActivateGuard`);let i=n.getHandlerCount(`activate`);t.validator?.lifecycle.validateHandlerLimit(i,t.dependenciesGetStore().limits,`canActivate`),n.addCanActivate(e,r)},addDeactivateGuard(e,r){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`addDeactivateGuard`),t.validator?.lifecycle.validateHandler(r,`addDeactivateGuard`);let i=n.getHandlerCount(`deactivate`);t.validator?.lifecycle.validateHandlerLimit(i,t.dependenciesGetStore().limits,`canDeactivate`),n.addCanDeactivate(e,r)},removeActivateGuard(e){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeActivateGuard`),n.clearCanActivate(e)},removeDeactivateGuard(e){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeDeactivateGuard`),n.clearCanDeactivate(e)}}}function l(a,o){let s=i(a);if(s.isDisposed())throw new t(e.ROUTER_DISPOSED);s.validator?.dependencies.validateCloneArgs(o);let l=s.routeGetStore(),u=r(l.tree),d=l.config,f=l.resolvedForwardMap,p=l.routeCustomFields,m=s.cloneOptions(),h=s.cloneDependencies(),[g,_]=s.getLifecycleFactories(),v=s.getPluginFactories(),y=new n(u,m,{...h,...o}),b=c(y);for(let[e,t]of Object.entries(g))b.addDeactivateGuard(e,t);for(let[e,t]of Object.entries(_))b.addActivateGuard(e,t);v.length>0&&y.usePlugin(...v);let x=i(y).routeGetStore();return Object.assign(x.config.decoders,d.decoders),Object.assign(x.config.encoders,d.encoders),Object.assign(x.config.defaultParams,d.defaultParams),Object.assign(x.config.forwardMap,d.forwardMap),Object.assign(x.config.forwardFnMap,d.forwardFnMap),Object.assign(x.resolvedForwardMap,f),Object.assign(x.routeCustomFields,p),y}export{a as i,c as n,s as r,l as t};
2
+ //# sourceMappingURL=cloneRouter-C_ULpzHM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloneRouter-C_ULpzHM.mjs","names":["routeTreeToDefinitions","RouterClass"],"sources":["../../src/api/helpers.ts","../../src/api/getPluginApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"sourcesContent":["// packages/core/src/api/helpers.ts\n\nimport { errorCodes } from \"../constants\";\nimport { RouterError } from \"../RouterError\";\n\nexport function throwIfDisposed(isDisposed: () => boolean): void {\n if (isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { RouterError } from \"../RouterError\";\n\nimport type { PluginApi } from \"./types\";\nimport type {\n ContextNamespaceClaim,\n DefaultDependencies,\n Params,\n Router,\n State,\n} from \"@real-router/types\";\n\n// Cache the assembled PluginApi per router — mirrors getNavigator() (#525):\n// avoids re-allocating the closure-bag on each call (plugins call this once\n// at init, but tests + nested plugins poll it), and gives spy/stub helpers\n// a stable object identity to attach to (e.g. spying on\n// `getPluginApi(router).navigateToState` to inject errors in popstate\n// recovery tests).\nconst cache = new WeakMap<object, PluginApi>();\n\nexport function getPluginApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): PluginApi {\n const cached = cache.get(router);\n\n if (cached) {\n return cached;\n }\n\n const ctx = getInternals(router);\n const api: PluginApi = {\n makeState: (name, params, path, meta) => {\n ctx.validator?.state.validateMakeStateArgs(name, params, path);\n\n return ctx.makeState(\n name,\n params,\n path,\n meta?.params as\n | Record<string, Record<string, \"url\" | \"query\">>\n | undefined,\n );\n },\n buildState: (routeName, routeParams) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n\n const { name, params } = ctx.forwardState(routeName, routeParams);\n\n return ctx.buildStateResolved(name, params);\n },\n forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n\n return ctx.forwardState(routeName, routeParams);\n },\n matchPath: (path) => {\n ctx.validator?.routes.validateMatchPathArgs(path);\n\n return ctx.matchPath(path, ctx.getOptions());\n },\n navigateToState: (state, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.navigation.validateNavigateToStateArgs(state);\n\n if (options !== undefined) {\n ctx.validator?.navigation.validateNavigationOptions(\n options,\n \"navigateToState\",\n );\n }\n\n return ctx.navigateToState(state, options);\n },\n setRootPath: (rootPath) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateSetRootPathArgs(rootPath);\n\n ctx.setRootPath(rootPath);\n },\n getRootPath: ctx.getRootPath,\n addEventListener: (eventName, cb) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.eventBus.validateListenerArgs(eventName, cb);\n\n return ctx.addEventListener(eventName, cb);\n },\n buildNavigationState: (name, params = {}) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params,\n );\n const routeInfo = ctx.buildStateResolved(resolvedName, resolvedParams);\n\n if (!routeInfo) {\n return;\n }\n\n return ctx.makeState(\n routeInfo.name,\n routeInfo.params,\n ctx.buildPath(routeInfo.name, routeInfo.params),\n routeInfo.meta,\n );\n },\n getOptions: ctx.getOptions,\n getTree: ctx.getTree,\n addInterceptor: (method, fn) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.validator?.plugins.validateAddInterceptorArgs(method, fn);\n let list = ctx.interceptors.get(method);\n\n if (!list) {\n list = [];\n ctx.interceptors.set(method, list);\n }\n\n list.push(fn);\n\n return () => {\n const index = list.indexOf(fn);\n\n if (index !== -1) {\n list.splice(index, 1);\n }\n };\n },\n getRouteConfig: (name) => {\n const store = ctx.routeGetStore();\n\n if (!store.matcher.hasRoute(name)) {\n return;\n }\n\n return store.routeCustomFields[name];\n },\n extendRouter: (extensions: Record<string, unknown>) => {\n throwIfDisposed(ctx.isDisposed);\n\n const keys = Object.keys(extensions);\n\n for (const key of keys) {\n if (key in router) {\n throw new RouterError(errorCodes.PLUGIN_CONFLICT, {\n message: `Cannot extend router: property \"${key}\" already exists`,\n });\n }\n }\n\n for (const key of keys) {\n (router as Record<string, unknown>)[key] = extensions[key];\n }\n\n const extensionRecord = { keys };\n\n ctx.routerExtensions.push(extensionRecord);\n\n let removed = false;\n\n return () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n for (const key of extensionRecord.keys) {\n delete (router as Record<string, unknown>)[key];\n }\n\n const idx = ctx.routerExtensions.indexOf(extensionRecord);\n\n if (idx !== -1) {\n ctx.routerExtensions.splice(idx, 1);\n }\n };\n },\n emitTransitionError: (error) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.emitTransitionError(error);\n },\n claimContextNamespace: (namespace: string) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (ctx.contextClaimRecords.has(namespace)) {\n throw new RouterError(errorCodes.CONTEXT_NAMESPACE_ALREADY_CLAIMED, {\n message: `Cannot claim context namespace: \"${namespace}\" is already claimed by another plugin`,\n });\n }\n\n ctx.contextClaimRecords.add(namespace);\n\n return {\n write(state: State, value: unknown) {\n state.context[namespace] = value;\n },\n release() {\n ctx.contextClaimRecords.delete(namespace);\n },\n } satisfies ContextNamespaceClaim;\n },\n };\n\n cache.set(router, api);\n\n return api;\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { LifecycleApi } from \"./types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function getLifecycleApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): LifecycleApi<Dependencies> {\n const ctx = getInternals(router);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const lifecycleNamespace = ctx.routeGetStore().lifecycleNamespace!;\n\n return {\n addActivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addActivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addActivateGuard\");\n\n const activateCount = lifecycleNamespace.getHandlerCount(\"activate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n activateCount,\n ctx.dependenciesGetStore().limits,\n \"canActivate\",\n );\n\n lifecycleNamespace.addCanActivate(name, handler);\n },\n\n addDeactivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addDeactivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addDeactivateGuard\");\n\n const deactivateCount = lifecycleNamespace.getHandlerCount(\"deactivate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n deactivateCount,\n ctx.dependenciesGetStore().limits,\n \"canDeactivate\",\n );\n\n lifecycleNamespace.addCanDeactivate(name, handler);\n },\n\n removeActivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeActivateGuard\");\n\n lifecycleNamespace.clearCanActivate(name);\n },\n\n removeDeactivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeDeactivateGuard\");\n\n lifecycleNamespace.clearCanDeactivate(name);\n },\n };\n}\n","import { routeTreeToDefinitions } from \"route-tree\";\n\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { Router as RouterClass } from \"../Router\";\nimport { RouterError } from \"../RouterError\";\nimport { getLifecycleApi } from \"./getLifecycleApi\";\n\nimport type { Route } from \"../types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function cloneRouter<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n dependencies?: Dependencies,\n): RouterClass<Dependencies> {\n const ctx = getInternals(router);\n\n if (ctx.isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n\n ctx.validator?.dependencies.validateCloneArgs(dependencies);\n\n // Get source store directly\n const sourceStore = ctx.routeGetStore();\n const routes = routeTreeToDefinitions(sourceStore.tree);\n const routeConfig = sourceStore.config;\n const resolvedForwardMap = sourceStore.resolvedForwardMap;\n const routeCustomFields = sourceStore.routeCustomFields;\n\n const options = ctx.cloneOptions();\n const sourceDeps = ctx.cloneDependencies();\n const [canDeactivateFactories, canActivateFactories] =\n ctx.getLifecycleFactories();\n const pluginFactories = ctx.getPluginFactories();\n\n const mergedDeps = {\n ...sourceDeps,\n ...dependencies,\n } as Dependencies;\n\n const newRouter = new RouterClass<Dependencies>(\n routes as Route<Dependencies>[],\n options,\n mergedDeps,\n );\n\n const lifecycle = getLifecycleApi(newRouter);\n\n for (const [name, handler] of Object.entries(canDeactivateFactories)) {\n lifecycle.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(canActivateFactories)) {\n lifecycle.addActivateGuard(name, handler);\n }\n\n if (pluginFactories.length > 0) {\n newRouter.usePlugin(...pluginFactories);\n }\n\n const newCtx = getInternals(newRouter);\n const newStore = newCtx.routeGetStore();\n\n // Apply cloned config directly to new store\n Object.assign(newStore.config.decoders, routeConfig.decoders);\n Object.assign(newStore.config.encoders, routeConfig.encoders);\n Object.assign(newStore.config.defaultParams, routeConfig.defaultParams);\n Object.assign(newStore.config.forwardMap, routeConfig.forwardMap);\n Object.assign(newStore.config.forwardFnMap, routeConfig.forwardFnMap);\n Object.assign(newStore.resolvedForwardMap, resolvedForwardMap);\n Object.assign(newStore.routeCustomFields, routeCustomFields);\n\n return newRouter;\n}\n"],"mappings":"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"}
@@ -1,5 +1,3 @@
1
- import { DefaultDependencies, EventMethodMap, GuardFnFactory, LeaveFn, LimitsConfig, NavigationOptions, Options, Params, PluginFactory, Route, RouteConfigUpdate, RouteTreeState, Router, State, SubscribeFn, Unsubscribe } from "@real-router/types";
2
-
3
1
  //#region ../path-matcher/dist/esm/index.d.mts
4
2
  //#region src/types.d.ts
5
3
  /**
@@ -232,7 +230,7 @@ type NumberFormat = "none" | "auto";
232
230
  /**
233
231
  * Options for search-params parsing and building.
234
232
  */
235
- interface Options$1 {
233
+ interface Options {
236
234
  /** Array parameter encoding format. @default "none" */
237
235
  arrayFormat?: ArrayFormat;
238
236
  /** Boolean parameter encoding format. @default "auto" */
@@ -309,7 +307,7 @@ interface RouteTree {
309
307
  *
310
308
  * Controls how arrays, booleans, nulls, and numbers are serialized in query strings.
311
309
  */
312
- type QueryParamsConfig = Readonly<Options$1>;
310
+ type QueryParamsConfig = Readonly<Options>;
313
311
  /**
314
312
  * Options for creating a path matcher.
315
313
  */
@@ -344,68 +342,5 @@ type Matcher = SegmentMatcher;
344
342
  * ```
345
343
  */
346
344
  //#endregion
347
- //#region src/types.d.ts
348
- /**
349
- * Immutable limits configuration type.
350
- */
351
- type Limits = Readonly<LimitsConfig>;
352
- /**
353
- * Extended build result that includes segments for path building.
354
- * Used internally to avoid duplicate getSegmentsByName calls.
355
- *
356
- * @param segments - Route segments from getSegmentsByName (typed as unknown[] for cross-package compatibility)
357
- * @internal
358
- */
359
- interface BuildStateResultWithSegments<P extends Params = Params> {
360
- readonly state: RouteTreeState<P>;
361
- readonly segments: readonly unknown[];
362
- }
363
- //#endregion
364
- //#region src/Router.d.ts
365
- /**
366
- * Router class with integrated namespace architecture.
367
- *
368
- * All functionality is provided by namespace classes:
369
- * - OptionsNamespace: getOptions (immutable)
370
- * - DependenciesStore: get/set/remove dependencies
371
- * - EventEmitter: subscribe
372
- * - StateNamespace: state storage (getState, setState, getPreviousState)
373
- * - RoutesNamespace: route tree operations
374
- * - RouteLifecycleNamespace: canActivate/canDeactivate guards
375
- * - PluginsNamespace: plugin lifecycle
376
- * - NavigationNamespace: navigate
377
- * - RouterLifecycleNamespace: start, stop, isStarted
378
- *
379
- * @internal This class implementation is internal. Use createRouter() instead.
380
- */
381
- declare class Router$1<Dependencies extends DefaultDependencies = DefaultDependencies> implements Router<Dependencies> {
382
- #private;
383
- [key: string]: unknown;
384
- /**
385
- * @param routes - Route definitions
386
- * @param options - Router options
387
- * @param dependencies - DI dependencies
388
- */
389
- constructor(routes?: Route<Dependencies>[], options?: Partial<Options>, dependencies?: Dependencies);
390
- isActiveRoute(name: string, params?: Params, strictEquality?: boolean, ignoreQueryParams?: boolean): boolean;
391
- buildPath(route: string, params?: Params): string;
392
- getState<P extends Params = Params>(): State<P> | undefined;
393
- getPreviousState(): State | undefined;
394
- areStatesEqual(state1: State | undefined, state2: State | undefined, ignoreQueryParams?: boolean): boolean;
395
- shouldUpdateNode(nodeName: string): (toState: State, fromState?: State) => boolean;
396
- isActive(): boolean;
397
- start(startPath: string): Promise<State>;
398
- stop(): this;
399
- dispose(): void;
400
- canNavigateTo(name: string, params?: Params): boolean;
401
- usePlugin(...plugins: (PluginFactory<Dependencies> | false | null | undefined)[]): Unsubscribe;
402
- subscribe(listener: SubscribeFn): Unsubscribe;
403
- subscribeLeave(listener: LeaveFn): Unsubscribe;
404
- isLeaveApproved(): boolean;
405
- navigate(routeName: string, routeParams?: Params, options?: NavigationOptions): Promise<State>;
406
- navigateToDefault(options?: NavigationOptions): Promise<State>;
407
- navigateToNotFound(path?: string): State;
408
- }
409
- //#endregion
410
- export { Limits as a, RouteConfigUpdate as c, RouteDefinition as d, RouteTree as f, GuardFnFactory as i, CreateMatcherOptions as l, BuildStateResultWithSegments as n, PluginFactory as o, EventMethodMap as r, Route as s, Router$1 as t, Matcher as u };
411
- //# sourceMappingURL=Router-BeXr2zW4.d.mts.map
345
+ export { RouteTree as i, Matcher as n, RouteDefinition as r, CreateMatcherOptions as t };
346
+ //# sourceMappingURL=index-DNjaY7KH.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DNjaY7KH.d.mts","names":["ConstraintPattern","RegExp","pattern","constraint","ParamMeta","Record","Readonly","ReadonlyMap","urlParams","queryParams","spatParams","paramTypeMap","constraintPatterns","pathPattern","URLParamsEncodingType","MatcherInputNode","name","path","fullName","absolute","children","nonAbsoluteChildren","paramMeta","staticPath","CompiledRoute","ReadonlySet","BuildParamSlot","MatchResult","parent","depth","matchSegments","meta","declaredQueryParams","declaredQueryParamsSet","hasTrailingSlash","hasConstraints","buildStaticParts","buildParamSlots","buildParamNamesSet","cachedResult","forwardTo","defaultParams","paramName","encoder","value","isOptional","BuildPathOptions","queryParamsMode","trailingSlash","SegmentNode","staticChildren","hasChildren","paramChild","node","splatChild","route","slashChildRoute","segments","params","SegmentMatcherOptions","caseSensitive","strictTrailingSlash","strictQueryParams","urlParamsEncoding","parseQueryString","queryString","buildQueryString","ResolvedMatcherOptions","buildParamMeta","validateConstraints","encodeURIComponentExcludingSubDelims","segment","ENCODING_METHODS","param","DECODING_METHODS","encodeParam","encoding","isSpatParam","createSegmentNode","SegmentMatcher","private","options","constructor","registerTree","match","buildPath","getSegmentsByName","getMetaByName","hasRoute","setRootPath","rootPath","ArrayFormat","BooleanFormat","NullFormat","NumberFormat","Options","arrayFormat","booleanFormat","nullFormat","numberFormat","FinalOptions","QueryParamPrimitive","QueryParamValue","SearchParams","Record","OmitResponse","querystring","removedParams","KeepResponse","keptParams","DecodeResult","parse","path","opts","parseInto","queryString","target","build","params","omit","paramsToOmit","keep","paramsToKeep","DEFAULT_QUERY_PARAMS","ParamMeta","SegmentMatcher","URLParamsEncodingType","DEFAULT_QUERY_PARAMS","Options","RouteDefinition","key","name","path","children","RouteTree","ReadonlyMap","Record","Readonly","absolute","paramMeta","parent","nonAbsoluteChildren","fullName","staticPath","paramTypeMap","TreeBuildOptions","skipFreeze","QueryParamsMode","TrailingSlashMode","BasePathOptions","trailingSlashMode","queryParamsMode","queryParams","urlParamsEncoding","BuildOptions","ignoreConstraints","MatchOptions","strictTrailingSlash","strongMatching","ParamSource","ParamTypeMap","RouteTreeStateMeta","MatchResult","P","RouteParams","segments","params","meta","RouteTreeState","createRouteTree","routes","options","getSegmentsByName","tree","routeName","nodeToDefinition","node","routeTreeToDefinitions","QueryParamsConfig","CreateMatcherOptions","caseSensitive","strictQueryParams","Matcher","createMatcher","validateRoute","Set","Map","route","methodName","rootNode","parentName","seenNames","seenPathsByParent"],"sources":["../../../path-matcher/dist/esm/index.d.mts","../../../search-params/dist/esm/index.d.mts","../../../route-tree/dist/esm/index.d.mts"],"mappings":"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"}
@@ -0,0 +1,306 @@
1
+ import { t as Router$1 } from "./Router-BmhiDQUJ.mjs";
2
+ import { DefaultDependencies, Params, Router, State } from "@real-router/types";
3
+
4
+ //#region src/utils/createRequestScope.d.ts
5
+ /**
6
+ * Subset of Node's `http.IncomingMessage` that `createRequestScope` relies on:
7
+ * a `"close"` event indicating that the client disconnected (or the response
8
+ * was fully sent) and the standard `removeListener` cleanup hook.
9
+ */
10
+ interface IncomingMessageLike {
11
+ on: (event: "close", listener: () => void) => unknown;
12
+ removeListener?: (event: "close", listener: () => void) => unknown;
13
+ }
14
+ /**
15
+ * Web `Request`-shaped object — anything carrying an `AbortSignal`. Web
16
+ * runtimes (Bun, Cloudflare Workers, Vite RSC) surface client-disconnect via
17
+ * `request.signal` directly, so no listener attachment is needed.
18
+ */
19
+ interface RequestLike {
20
+ signal: AbortSignal;
21
+ }
22
+ type RequestScopeSource = IncomingMessageLike | RequestLike;
23
+ interface RequestScope<Dependencies extends DefaultDependencies = DefaultDependencies> extends AsyncDisposable {
24
+ /**
25
+ * Per-request router clone. Carries `abortSignal` injected into its
26
+ * dependencies — loaders can `getDep("abortSignal")` and pass it to fetch /
27
+ * `withTimeout` for cooperative cancellation when the client disconnects.
28
+ */
29
+ readonly router: Router$1<Dependencies>;
30
+ /**
31
+ * Aborts when the request closes (Node `IncomingMessage`'s `"close"` event)
32
+ * or when the upstream Web `Request.signal` aborts.
33
+ */
34
+ readonly signal: AbortSignal;
35
+ /**
36
+ * Detach the close listener (if attached to a Node `IncomingMessage`) and
37
+ * dispose the cloned router. Idempotent — safe to call multiple times or in
38
+ * combination with `Symbol.asyncDispose`.
39
+ */
40
+ dispose: () => Promise<void>;
41
+ }
42
+ /**
43
+ * Build a per-request router scope: clones `base`, attaches an `AbortSignal`
44
+ * tied to the request's lifetime, and exposes `dispose()` (plus
45
+ * `Symbol.asyncDispose` for `await using` declarations).
46
+ *
47
+ * Replaces the four-step boilerplate that every server entry repeats:
48
+ *
49
+ * 1. `new AbortController()` per request
50
+ * 2. `req.on("close", () => controller.abort())`
51
+ * 3. `cloneRouter(base, { ...deps, abortSignal: signal })`
52
+ * 4. `try { ... } finally { router.dispose() }`
53
+ *
54
+ * The signal is injected into the router clone under `abortSignal` so existing
55
+ * loaders that read `getDep("abortSignal")` keep working without changes.
56
+ *
57
+ * ## `await using` compatibility
58
+ *
59
+ * The scope implements `Symbol.asyncDispose`, so `await using scope = …` is
60
+ * supported on runtimes that ship the well-known `Symbol.asyncDispose`:
61
+ *
62
+ * - **Node.js 24+** (full support; partial in 20.4–20.17 only for `fs`/`stream`)
63
+ * - **Bun 1.0.23+**, **Deno 1.37+**
64
+ * - **Chrome / Edge 127+**, **Firefox 141+**
65
+ * - **Safari**: not yet supported (irrelevant in practice — this helper is
66
+ * server-side only and never reaches the browser)
67
+ *
68
+ * On Node.js 22 LTS the well-known symbol is unavailable, so `await using`
69
+ * fails. **The bundled SSR examples therefore use the explicit
70
+ * `try/finally` + `await scope.dispose()` form**, which works on every
71
+ * runtime. Use `await using` only when you control the deployment target and
72
+ * know it ships the symbol.
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * // Explicit dispose — works on Node 18+, all browsers, every CI image
77
+ * export async function render(url: string, req: IncomingMessage) {
78
+ * const scope = createRequestScope(req, baseRouter, { currentUser });
79
+ * try {
80
+ * scope.router.usePlugin(ssrDataPluginFactory(loaders));
81
+ * return await renderShell(scope.router, url);
82
+ * } finally {
83
+ * await scope.dispose();
84
+ * }
85
+ * }
86
+ *
87
+ * // `await using` — Node 24+, Bun, Deno, modern browsers
88
+ * export async function render(url: string, req: IncomingMessage) {
89
+ * await using scope = createRequestScope(req, baseRouter, { currentUser });
90
+ * scope.router.usePlugin(ssrDataPluginFactory(loaders));
91
+ * return await renderShell(scope.router, url);
92
+ * }
93
+ *
94
+ * // Web runtime (signal already on the request)
95
+ * async function handler(request: Request) {
96
+ * const scope = createRequestScope(request, baseRouter, { db });
97
+ * try {
98
+ * scope.router.usePlugin(rscServerPluginFactory(loaders));
99
+ * return await render(scope.router, request.url);
100
+ * } finally {
101
+ * await scope.dispose();
102
+ * }
103
+ * }
104
+ * ```
105
+ */
106
+ declare function createRequestScope<Dependencies extends DefaultDependencies = DefaultDependencies>(request: RequestScopeSource, base: Router<Dependencies>, deps?: Partial<Dependencies>): RequestScope<Dependencies>;
107
+ //#endregion
108
+ //#region src/utils/getStaticPaths.d.ts
109
+ type StaticPathEntries = Record<string, () => Promise<Record<string, string>[]>>;
110
+ declare function getStaticPaths<Dependencies extends DefaultDependencies = DefaultDependencies>(router: Router<Dependencies>, entries?: StaticPathEntries): Promise<string[]>;
111
+ //#endregion
112
+ //#region src/utils/hydrateRouter.d.ts
113
+ /**
114
+ * Custom deserializer signature for {@link hydrateRouter} (#606). Compatible
115
+ * with `JSON.parse` (default), `devalue.parse`, `superjson.parse`, or any
116
+ * user-supplied function.
117
+ */
118
+ type Deserialize = (json: string) => unknown;
119
+ interface HydrateRouterOptions {
120
+ /**
121
+ * Custom deserializer (e.g., `devalue.parse` / `superjson.parse`) for
122
+ * matching the `serialize` passed to {@link serializeRouterState}. Defaults
123
+ * to `JSON.parse`. Ignored when `source` is already an object.
124
+ *
125
+ * @default JSON.parse
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * import * as devalue from "devalue";
130
+ * await hydrateRouter(router, ssrJson, { deserialize: devalue.parse });
131
+ * ```
132
+ */
133
+ deserialize?: Deserialize;
134
+ }
135
+ /**
136
+ * Hydrate a fresh router from server-serialized State (#563, #596).
137
+ *
138
+ * Accepts either a JSON string (parsed via `JSON.parse` by default, or
139
+ * `options.deserialize` when provided) or a State-shaped object. Extracts
140
+ * `state.path` and delegates to `router.start(state.path)` — the canonical
141
+ * URL is the source of truth for the router on hydration.
142
+ *
143
+ * The full parsed state (incl. `state.context.<namespace>` payloads) is
144
+ * deposited into a one-shot scratchpad on `RouterInternals.hydrationState`
145
+ * before `start()` is invoked and cleared in the matching `finally`. SSR
146
+ * loader plugins (`@real-router/ssr-data-plugin`,
147
+ * `@real-router/rsc-server-plugin`) read this scratchpad to skip their loader
148
+ * call when the server-resolved namespace value is already present — avoiding
149
+ * the post-hydration loader re-run on first paint.
150
+ *
151
+ * Single-shot semantics: the scratchpad is consumed during the first `start()`
152
+ * triggered by `hydrateRouter` regardless of route mismatch; subsequent
153
+ * `start()` calls run loaders normally.
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * // Client
158
+ * const router = createAppRouter();
159
+ * router.usePlugin(browserPluginFactory());
160
+ * await hydrateRouter(router, window.__SSR_STATE__);
161
+ * ```
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * // With non-JSON types (Date / Map / Set / RegExp / BigInt) via devalue (#606)
166
+ * import * as devalue from "devalue";
167
+ *
168
+ * await hydrateRouter(router, window.__SSR_STATE__, {
169
+ * deserialize: devalue.parse,
170
+ * });
171
+ * ```
172
+ */
173
+ declare function hydrateRouter(router: Router, source: string | {
174
+ path: string;
175
+ }, options?: HydrateRouterOptions): Promise<State>;
176
+ //#endregion
177
+ //#region src/utils/serializeState.d.ts
178
+ /**
179
+ * Custom serializer signature for {@link serializeState} (#606).
180
+ *
181
+ * Compatible with `JSON.stringify` (default) as well as `devalue.stringify`,
182
+ * `superjson.stringify`, or any user-supplied function that returns a JSON
183
+ * string. The output is run through XSS-safe character escapes regardless
184
+ * of which serializer produced it.
185
+ */
186
+ type Serialize = (data: unknown) => string;
187
+ interface SerializeStateOptions {
188
+ /**
189
+ * Custom serializer (e.g., `devalue.stringify` / `superjson.stringify`) to
190
+ * support non-JSON types (Date / Map / Set / RegExp / BigInt). Defaults to
191
+ * `JSON.stringify`. Output is still XSS-escaped.
192
+ *
193
+ * @default JSON.stringify
194
+ */
195
+ serialize?: Serialize;
196
+ }
197
+ /**
198
+ * XSS-safe JSON serialization for embedding data in HTML `<script>` tags.
199
+ *
200
+ * Escapes `<`, `>`, and `&` to their Unicode equivalents to prevent
201
+ * injection via `</script>` or HTML entities inside inline scripts.
202
+ *
203
+ * Pass `options.serialize` to use a custom serializer such as `devalue` or
204
+ * `superjson` for non-JSON types (Date/Map/Set/RegExp/BigInt). The serializer
205
+ * must return a string; XSS-escape is applied to its output.
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * const json = serializeState({ name: "home", path: "/" });
210
+ * const html = `<script>window.__STATE__=${json}</script>`;
211
+ * ```
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * import * as devalue from "devalue";
216
+ *
217
+ * const json = serializeState(
218
+ * { date: new Date(), tags: new Set(["a", "b"]) },
219
+ * { serialize: devalue.stringify },
220
+ * );
221
+ * ```
222
+ */
223
+ declare function serializeState(data: unknown, options?: SerializeStateOptions): string;
224
+ //#endregion
225
+ //#region src/utils/serializeRouterState.d.ts
226
+ /**
227
+ * Parsed shape produced by {@link serializeRouterState} (after `JSON.parse`).
228
+ *
229
+ * Identical to {@link State} minus `transition` (per-navigation `TransitionMeta`
230
+ * is meaningless after hydration; the client builds its own on commit). Used as
231
+ * the input shape for {@link hydrateRouter} and as the type of the one-shot
232
+ * hydration scratchpad consumed by SSR loader plugins.
233
+ */
234
+ type SerializedRouterState<P extends Params = Params> = Omit<State<P>, "transition">;
235
+ interface SerializeRouterStateOptions {
236
+ /**
237
+ * Plugin context namespaces to strip from the serialized output.
238
+ * Use when a plugin populates `state.context.<ns>` with non-JSON-serializable
239
+ * values (e.g., RSC payload: ReactNode trees containing functions/symbols).
240
+ *
241
+ * @default []
242
+ */
243
+ excludeContext?: readonly string[];
244
+ /**
245
+ * Custom serializer (e.g., `devalue.stringify` / `superjson.stringify`) to
246
+ * support non-JSON types in `state.params` and `state.context.<ns>` payloads
247
+ * (Date / Map / Set / RegExp / BigInt). Defaults to `JSON.stringify`.
248
+ *
249
+ * Pair with the matching `deserialize` on `hydrateRouter` to round-trip the
250
+ * extended types on the client.
251
+ *
252
+ * @default JSON.stringify
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * import * as devalue from "devalue";
257
+ *
258
+ * const json = serializeRouterState(state, { serialize: devalue.stringify });
259
+ * ```
260
+ */
261
+ serialize?: Serialize;
262
+ }
263
+ /**
264
+ * XSS-safe JSON serialization of router State for SSR → client transport (#563).
265
+ *
266
+ * Strips `state.transition` (per-navigation `TransitionMeta` — meaningless after
267
+ * hydration; the client's hydration commit produces its own `transition`).
268
+ * Keeps `name`, `params`, `path`, and `context` (plugin context namespaces are
269
+ * preserved as-is — server's `state.context.data` from `ssr-data-plugin` and
270
+ * any other plugin claims travel to the client untouched).
271
+ *
272
+ * Pass `options.excludeContext` to strip specific namespaces from the output —
273
+ * required for plugins that publish non-JSON-serializable values (e.g., RSC
274
+ * `ReactNode` trees from `@real-router/rsc-server-plugin`).
275
+ *
276
+ * @example
277
+ * ```typescript
278
+ * // Server
279
+ * const state = await router.start(req.url);
280
+ * const html = `<script>window.__SSR_STATE__=${serializeRouterState(state)}</script>`;
281
+ *
282
+ * // Client
283
+ * await hydrateRouter(router, window.__SSR_STATE__);
284
+ * ```
285
+ *
286
+ * @example
287
+ * ```typescript
288
+ * // With RSC plugin: strip the "rsc" namespace before transport
289
+ * const state = await router.start(url);
290
+ * const json = serializeRouterState(state, { excludeContext: ["rsc"] });
291
+ * ```
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * // Non-JSON types (Date / Map / Set / RegExp / BigInt) via devalue (#606)
296
+ * import * as devalue from "devalue";
297
+ *
298
+ * const json = serializeRouterState(state, { serialize: devalue.stringify });
299
+ * // On the client:
300
+ * await hydrateRouter(router, json, { deserialize: devalue.parse });
301
+ * ```
302
+ */
303
+ declare function serializeRouterState(state: State, options?: SerializeRouterStateOptions): string;
304
+ //#endregion
305
+ export { SerializeStateOptions as a, HydrateRouterOptions as c, getStaticPaths as d, IncomingMessageLike as f, createRequestScope as g, RequestScopeSource as h, Serialize as i, hydrateRouter as l, RequestScope as m, SerializedRouterState as n, serializeState as o, RequestLike as p, serializeRouterState as r, Deserialize as s, SerializeRouterStateOptions as t, StaticPathEntries as u };
306
+ //# sourceMappingURL=index-r_JTvSBH.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-r_JTvSBH.d.mts","names":[],"sources":["../../src/utils/createRequestScope.ts","../../src/utils/getStaticPaths.ts","../../src/utils/hydrateRouter.ts","../../src/utils/serializeState.ts","../../src/utils/serializeRouterState.ts"],"mappings":";;;;;;AAUA;;;UAAiB,mBAAA;EACf,EAAA,GAAK,KAAA,WAAgB,QAAA;EACrB,cAAA,IAAkB,KAAA,WAAgB,QAAA;AAAA;;;;;AAAoB;UAQvC,WAAA;EACf,MAAA,EAAQ,WAAW;AAAA;AAAA,KAGT,kBAAA,GAAqB,mBAAA,GAAsB,WAAW;AAAA,UAEjD,YAAA,sBACM,mBAAA,GAAsB,mBAAA,UACnC,eAAA;EAJE;;;;AAAsD;EAAtD,SAUD,MAAA,EAAQ,QAAA,CAAY,YAAA;EARF;;;;EAAA,SAclB,MAAA,EAAQ,WAAA;EANA;;;;;EAajB,OAAA,QAAe,OAAA;AAAA;;;;;;;;;;;;AAAO;AA4ExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAM4B;;;;AC5H5B;;;;;;;;;;;;AAEsB;AAiBtB;;;;;;;iBDmGgB,kBAAA,sBACO,mBAAA,GAAsB,mBAAA,CAAA,CAE3C,OAAA,EAAS,kBAAA,EACT,IAAA,EAAM,MAAA,CAAO,YAAA,GACb,IAAA,GAAO,OAAA,CAAQ,YAAA,IACd,YAAA,CAAa,YAAA;;;KC5HJ,iBAAA,GAAoB,MAAA,eAExB,OAAA,CAAQ,MAAA;AAAA,iBAiBM,cAAA,sBACC,mBAAA,GAAsB,mBAAA,CAAA,CAE3C,MAAA,EAAQ,MAAA,CAAO,YAAA,GACf,OAAA,GAAU,iBAAA,GACT,OAAA;;;;;;ADnBH;;KEAY,WAAA,IAAe,IAAY;AAAA,UAEtB,oBAAA;EFDf;;;;;;;AACsD;AAQxD;;;;AACqB;EEKnB,WAAA,GAAc,WAAW;AAAA;;;AFFuC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;AAqBwB;AA4ExB;;;;;;;;;;iBExDsB,aAAA,CACpB,MAAA,EAAQ,MAAA,EACR,MAAA;EAAmB,IAAA;AAAA,GACnB,OAAA,GAAU,oBAAA,GACT,OAAA,CAAQ,KAAA;;;;;;;AF7DX;;;;KGFY,SAAA,IAAa,IAAa;AAAA,UAErB,qBAAA;EHCM;;;;;AACiC;AAQxD;EGFE,SAAA,GAAY,SAAS;AAAA;;AHGF;AAGrB;;;;AAAkE;AAElE;;;;;;;;;;;;;;;;;;;iBGqBgB,cAAA,CACd,IAAA,WACA,OAAA,GAAU,qBAAqB;;;;;AHvCjC;;;;;;KIGY,qBAAA,WAAgC,MAAA,GAAS,MAAA,IAAU,IAAA,CAC7D,KAAA,CAAM,CAAA;AAAA,UAIS,2BAAA;EJNG;;;AAAoC;AAQxD;;;EIME,cAAA;EJLmB;AAGrB;;;;AAAkE;AAElE;;;;;;;;;;;EImBE,SAAA,GAAY,SAAS;AAAA;;;;;;;;;;;;AJEC;AA4ExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBInCgB,oBAAA,CACd,KAAA,EAAO,KAAA,EACP,OAAA,GAAU,2BAA2B"}