mobx-route 1.3.4 → 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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <img src="docs/public/logo.png" align="right" width="156" alt="logo" />
2
2
 
3
- # mobx-route
3
+ # mobx-route
4
4
 
5
5
  [![NPM version][npm-image]][npm-url] [![build status][github-build-actions-image]][github-actions-url] [![npm download][download-image]][download-url] [![bundle size][bundlephobia-image]][bundlephobia-url]
6
6
 
@@ -14,23 +14,189 @@
14
14
  [bundlephobia-url]: https://bundlephobia.com/result?p=mobx-route
15
15
  [bundlephobia-image]: https://badgen.net/bundlephobia/minzip/mobx-route
16
16
 
17
+ 🚀 Simple and lightweight **typed** MobX router 🚀
18
+ _Uses [`path-to-regexp`](https://www.npmjs.com/package/path-to-regexp) power for path matching_
17
19
 
18
- 🚀 Simple and lightweight typed MobX router 🚀
19
- _Uses [`path-to-regexp` power](https://www.npmjs.com/package/path-to-regexp)_
20
+ ### [📖 Read the docs →](https://js2me.github.io/mobx-route/)
20
21
 
21
- ### [Read the docs →](https://js2me.github.io/mobx-route/)
22
+ ---
22
23
 
24
+ ## Quick Start
23
25
 
24
26
  ```ts
25
27
  import { createRoute } from "mobx-route";
26
28
 
27
29
  const userDetails = createRoute("/users/:id");
28
30
 
29
- await userDetails.open({ id: 1 }); // path params are required
31
+ // Path params are required TypeScript enforces it
32
+ await userDetails.open({ id: 1 });
30
33
 
31
- userDetails.isOpened; // true;
34
+ userDetails.isOpened; // true
35
+ userDetails.params; // { id: "1" } — fully typed
32
36
  ```
33
37
 
34
- ## Contribution Guide
38
+ ---
35
39
 
36
- Want to contribute ? [Follow this guide](https://github.com/js2me/mobx-route/blob/master/CONTRIBUTING.md)
40
+ ## Features
41
+
42
+ ### 🔗 Nested Routes with `.extend()`
43
+
44
+ Build route trees naturally — no config arrays, no `<Routes>` wrappers:
45
+
46
+ ```ts
47
+ const users = createRoute("/users");
48
+ const userDetails = users.extend("/:userId");
49
+ const userPhotos = userDetails.extend("/photos");
50
+
51
+ // Path is auto-concatenated: /users/:userId/photos
52
+ await userPhotos.open({ userId: 42 });
53
+ // → /users/42/photos
54
+
55
+ users.isOpened; // true (parent is open too)
56
+ users.hasOpenedChildren; // true
57
+ ```
58
+
59
+ ### 🛡️ Route Guards & Redirects
60
+
61
+ Protect routes with `beforeOpen` — cancel navigation or redirect:
62
+
63
+ ```ts
64
+ const dashboard = createRoute("/dashboard", {
65
+ beforeOpen: async () => {
66
+ if (!await isAuthenticated()) {
67
+ return { url: "/login", replace: true }; // redirect
68
+ }
69
+ // return undefined → proceed
70
+ },
71
+ checkOpened: () => currentUser.isAuthorized, // reactive predicate
72
+ });
73
+ ```
74
+
75
+ ### 🔮 Virtual Routes for Modals & Drawers
76
+
77
+ Same `.open()` / `.close()` / `.isOpened` API — but no URL involved:
78
+
79
+ ```ts
80
+ const authModal = createVirtualRoute({
81
+ checkOpened: (route) => route.query.data.modal === "auth",
82
+ open: (_, route) => route.query.update({ modal: "auth" }),
83
+ close: (route) => route.query.update({ modal: undefined }),
84
+ beforeClose: () => !hasUnsavedChanges, // prevent closing
85
+ });
86
+
87
+ authModal.isOpened; // reactive — auto-updates from query
88
+ authModal.isClosing; // for exit animations
89
+ ```
90
+
91
+ ### 🎯 Typed Query Params
92
+
93
+ ```ts
94
+ const search = createRoute<
95
+ "/search",
96
+ {},
97
+ {},
98
+ { q: string; page?: number; sort?: "asc" | "desc" }
99
+ >("/search");
100
+
101
+ // TQueryParams types the INPUT — what you pass to open()
102
+ await search.open({}, { query: { q: "mobx", page: 1 } });
103
+
104
+ // query.data is always Record<string, string> at runtime (values come from URL)
105
+ search.query.data.q; // string
106
+ search.query.data.page; // string | undefined — use Number() or QueryParam for typed access
107
+ ```
108
+
109
+ ### 🔄 `update()` for In-Place Changes
110
+
111
+ Replace params without polluting browser history:
112
+
113
+ ```ts
114
+ await userRoute.open({ userId: 1 }, { query: { tab: "profile" } });
115
+ await userRoute.update({ userId: 2 });
116
+ // → /users/2?tab=profile (replace: true, mergeQuery: true by default)
117
+ ```
118
+
119
+ ### 🧩 React Integration
120
+
121
+ ```tsx
122
+ import { RouteView, RouteViewGroup, Link } from "mobx-route/react";
123
+
124
+ // Declarative route rendering
125
+ <RouteView route={userRoute} view={UserPage} fallback={<Loading />} />
126
+
127
+ // Route switching with fallback
128
+ <RouteViewGroup otherwise={notFoundRoute}>
129
+ <RouteView route={homeRoute} view={HomePage} />
130
+ <RouteView route={userRoute} view={UserPage} />
131
+ <div>Not found</div>
132
+ </RouteViewGroup>
133
+
134
+ // Type-safe links
135
+ <Link to={userRoute} params={{ userId: 42 }}>Profile</Link>
136
+ ```
137
+
138
+ ### 🧠 View Model Integration
139
+
140
+ ```ts
141
+ import { RouteViewModel } from "mobx-route/view-model";
142
+
143
+ class UserPageVM extends RouteViewModel<typeof userRoute> {
144
+ route = userRoute;
145
+ // payload, pathParams, query, isMounted — all built-in
146
+ }
147
+ ```
148
+
149
+ ### 🌍 Optional Path Segments & Wildcards
150
+
151
+ ```ts
152
+ // Optional segment
153
+ const route = createRoute("/users{/:tab}");
154
+ route.open(); // → /users
155
+ route.open({ tab: 1 }); // → /users/1
156
+
157
+ // Wildcard/rest params
158
+ const docs = createRoute("/docs/*rest");
159
+ docs.open({ rest: ["api", "v2", "auth"] }); // → /docs/api/v2/auth
160
+ ```
161
+
162
+ ### 📦 Tree-Shakeable Subpath Exports
163
+
164
+ Only pay for what you use:
165
+
166
+ ```ts
167
+ import { createRoute } from "mobx-route"; // core only
168
+ import { RouteView, Link } from "mobx-route/react"; // + React
169
+ import { RouteViewModel } from "mobx-route/view-model"; // + VM
170
+ ```
171
+
172
+ ---
173
+
174
+ ## Installation
175
+
176
+ ```bash
177
+ npm install mobx-route
178
+ # or
179
+ pnpm add mobx-route
180
+ # or
181
+ yarn add mobx-route
182
+ ```
183
+
184
+ Peer dependencies (React integration is optional):
185
+
186
+ ```bash
187
+ npm install mobx
188
+ # For React:
189
+ npm install mobx-react-lite react react-dom
190
+ ```
191
+
192
+ ---
193
+
194
+ ## Contribution Guide
195
+
196
+ Want to contribute? [Follow this guide](https://github.com/js2me/mobx-route/blob/master/CONTRIBUTING.md)
197
+
198
+ ---
199
+
200
+ ## License
201
+
202
+ [MIT](https://github.com/js2me/mobx-route/blob/master/LICENSE)
package/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mobxLocationHistory = require("mobx-location-history");
4
- const virtualRoute = require("./virtual-route-B_X_wClE.cjs");
4
+ const virtualRoute = require("./virtual-route-DCnOqDz5.cjs");
5
5
  const isRouteEntity = (route) => route && "isOpened" in route;
6
6
  exports.Route = virtualRoute.Route;
7
7
  exports.RouteGroup = virtualRoute.RouteGroup;
package/index.d.ts CHANGED
@@ -19,12 +19,12 @@ interface AbstractVirtualRoute<TParams extends AnyObject | EmptyObject = EmptyOb
19
19
  extraParams?: VirtualOpenExtraParams<TQueryParams>
20
20
  ] : [params: TParams, extraParams?: VirtualOpenExtraParams<TQueryParams>]): Promise<void>;
21
21
  }
22
- interface VirtualRouteConfiguration<TParams extends AnyObject | EmptyObject = EmptyObject, TQueryParams extends Record<string, any> = AnyObject> {
22
+ interface VirtualRouteConfiguration<TParams extends AnyObject | EmptyObject = EmptyObject> {
23
23
  /**
24
24
  * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#abortsignal)
25
25
  */
26
26
  abortSignal?: AbortSignal;
27
- queryParams?: IQueryParams<TQueryParams>;
27
+ queryParams?: IQueryParams;
28
28
  /**
29
29
  * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#initialparams)
30
30
  */
@@ -88,10 +88,10 @@ interface VirtualRouteTrx<TQueryParams extends Record<string, any> = AnyObject>
88
88
  * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html)
89
89
  */
90
90
  declare class VirtualRoute<TParams extends AnyObject | EmptyObject = EmptyObject, TQueryParams extends Record<string, any> = AnyObject> implements AbstractVirtualRoute<TParams, TQueryParams> {
91
- protected config: VirtualRouteConfiguration<TParams, TQueryParams>;
91
+ protected config: VirtualRouteConfiguration<TParams>;
92
92
  private isDestroyed?;
93
93
  private disposer?;
94
- query: IQueryParams<TQueryParams>;
94
+ query: IQueryParams;
95
95
  params: TParams | null;
96
96
  protected status: 'opening' | 'open-rejected' | 'opened' | 'closing' | 'closed' | 'unknown';
97
97
  private openChecker;
@@ -103,7 +103,7 @@ declare class VirtualRoute<TParams extends AnyObject | EmptyObject = EmptyObject
103
103
  * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isouteropened)
104
104
  */
105
105
  isOuterOpened: boolean | undefined;
106
- constructor(config?: VirtualRouteConfiguration<TParams, TQueryParams>);
106
+ constructor(config?: VirtualRouteConfiguration<TParams>);
107
107
  /**
108
108
  * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopened)
109
109
  */
@@ -135,7 +135,7 @@ declare class VirtualRoute<TParams extends AnyObject | EmptyObject = EmptyObject
135
135
  private confirmClosing;
136
136
  destroy(): void;
137
137
  }
138
- declare const createVirtualRoute: <TParams extends AnyObject | EmptyObject = EmptyObject, TQueryParams extends Record<string, any> = AnyObject>(config?: VirtualRouteConfiguration<TParams, TQueryParams>) => VirtualRoute<TParams, TQueryParams>;
138
+ declare const createVirtualRoute: <TParams extends AnyObject | EmptyObject = EmptyObject, TQueryParams extends Record<string, any> = AnyObject>(config?: VirtualRouteConfiguration<TParams>) => VirtualRoute<TParams, TQueryParams>;
139
139
 
140
140
  /**
141
141
  * Class for grouping related routes and managing their state.
@@ -224,7 +224,7 @@ interface CreatedUrlOutputParams {
224
224
  /** @see [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl) */
225
225
  omitQuery?: boolean;
226
226
  }
227
- interface RouteConfiguration<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TParentRoute extends Route<string, any, any, any, any> | null = null, TQueryParams extends Record<string, any> = AnyObject> extends Omit<Partial<RouteGlobalConfig>, 'createUrl'> {
227
+ interface RouteConfiguration<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TQueryParams extends Record<string, any> = AnyObject> extends Omit<Partial<RouteGlobalConfig>, 'createUrl'> {
228
228
  /**
229
229
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#abortsignal)
230
230
  */
@@ -242,7 +242,7 @@ interface RouteConfiguration<TPath extends string, TInputParams extends InputPat
242
242
  meta?: AnyObject;
243
243
  parseOptions?: ParseOptions;
244
244
  matchOptions?: MatchOptions & ParseOptions;
245
- parent?: TParentRoute;
245
+ parent?: AnyRoute | null;
246
246
  children?: AnyRoute[];
247
247
  /**
248
248
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#params)
@@ -263,17 +263,17 @@ interface RouteConfiguration<TPath extends string, TInputParams extends InputPat
263
263
  /**
264
264
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#afteropen)
265
265
  */
266
- afterOpen?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TParentRoute>, NoInfer<TQueryParams>>) => void;
266
+ afterOpen?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TQueryParams>>) => void;
267
267
  /**
268
268
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#afterupdate)
269
269
  */
270
- afterUpdate?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TParentRoute>, NoInfer<TQueryParams>>) => void;
270
+ afterUpdate?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TQueryParams>>) => void;
271
271
  /**
272
272
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl)
273
273
  */
274
274
  createUrl?: UrlCreateParamsFn<TInputParams, TQueryParams>;
275
275
  }
276
- type AnyRoute = Route<any, any, any, any, any>;
276
+ type AnyRoute = Route<any, any, any, any>;
277
277
  type InputPathParam = string | number | boolean | null;
278
278
  type ParsedPathParam = string;
279
279
  type Simplify<T> = T extends infer U ? {
@@ -303,18 +303,24 @@ interface ParsedPathData<TPath extends string> {
303
303
  path: string;
304
304
  params: ParsedPathParams<TPath>;
305
305
  }
306
- type InferPath<T extends AnyRoute> = T extends Route<infer TPath, any, any, any, any> ? TPath : never;
307
- type InferInputParams<T extends AnyRoute> = T extends VirtualRoute<infer TParams> ? TParams : T extends Route<any, infer TInputParams, any, any, any> ? TInputParams : never;
308
- type InferParams<T extends AnyRoute> = T extends VirtualRoute<infer TParams> ? TParams : T extends Route<any, any, infer TParams, any, any> ? TParams : never;
309
- type InferQueryParams<T extends AnyRoute> = T extends Route<any, any, any, any, infer TQueryParams> ? TQueryParams : never;
306
+ type InferPath<T extends AnyRoute> = T extends Route<infer TPath, any, any, any> ? TPath : never;
307
+ type InferInputParams<T extends AnyRoute> = T extends VirtualRoute<infer TParams> ? TParams : T extends Route<any, infer TInputParams, any, any> ? TInputParams : never;
308
+ type InferParams<T extends AnyRoute> = T extends VirtualRoute<infer TParams> ? TParams : T extends Route<any, any, infer TParams, any> ? TParams : never;
309
+ /**
310
+ * Extracts the query params input type from a route.
311
+ *
312
+ * Note: this represents the INPUT shape used in `open()`, `createUrl()`, etc.
313
+ * The actual `route.query.data` values are always `Record<string, string>` at runtime.
314
+ */
315
+ type InferQueryParams<T extends AnyRoute> = T extends Route<any, any, any, infer TQueryParams> ? TQueryParams : never;
310
316
 
311
317
  /**
312
318
  * Class for creating path based route.
313
319
  *
314
320
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html)
315
321
  */
316
- declare class Route<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TParentRoute extends Route<any, any, any, any, any> | null = null, TQueryParams extends Record<string, any> = AnyObject> {
317
- protected config: RouteConfiguration<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>;
322
+ declare class Route<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TQueryParams extends Record<string, any> = AnyObject> {
323
+ protected config: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>;
318
324
  private isDestroyed?;
319
325
  private disposer?;
320
326
  protected history: History;
@@ -323,8 +329,8 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
323
329
  *
324
330
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#parent)
325
331
  */
326
- parent: TParentRoute;
327
- query: IQueryParams<TQueryParams>;
332
+ parent: AnyRoute | null;
333
+ query: IQueryParams;
328
334
  private _tokenData;
329
335
  private _matcher?;
330
336
  private _compiler?;
@@ -357,7 +363,7 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
357
363
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#children)
358
364
  */
359
365
  children: AnyRoute[];
360
- constructor(pathDeclaration: TPath, config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>);
366
+ constructor(pathDeclaration: TPath, config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>);
361
367
  protected get baseUrl(): string | undefined;
362
368
  /**
363
369
  * Checks whether current route matches provided path.
@@ -404,7 +410,7 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
404
410
  *
405
411
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#extend)
406
412
  */
407
- extend<TExtendedPath extends string, TExtendedInputParams extends InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>, TExtendedOutputParams extends AnyObject = TInputParams & ParsedPathParams<`${TPath}${TExtendedPath}`>, TExtendedQueryParams extends Record<string, any> = TQueryParams>(pathDeclaration: TExtendedPath, config?: Omit<RouteConfiguration<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, any, TExtendedQueryParams>, 'parent'>): Route<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, this, TExtendedQueryParams>;
413
+ extend<TExtendedPath extends string, TExtendedInputParams extends InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>, TExtendedOutputParams extends AnyObject = TInputParams & ParsedPathParams<`${TPath}${TExtendedPath}`>, TExtendedQueryParams extends Record<string, any> = TQueryParams>(pathDeclaration: TExtendedPath, config?: Omit<RouteConfiguration<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, TExtendedQueryParams>, 'parent'>): Route<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, TExtendedQueryParams>;
408
414
  /**
409
415
  * Manually add child routes.
410
416
  *
@@ -484,7 +490,7 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
484
490
  */
485
491
  destroy(): void;
486
492
  }
487
- declare const createRoute: <TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TParentRoute extends Route<any, any, any, any, any> | null = null, TQueryParams extends Record<string, any> = AnyObject>(path: TPath, config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>) => Route<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>;
493
+ declare const createRoute: <TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TQueryParams extends Record<string, any> = AnyObject>(path: TPath, config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>) => Route<TPath, TInputParams, TOutputParams, TQueryParams>;
488
494
 
489
495
  /**
490
496
  * Global configuration for routes and router.
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from "mobx-location-history";
2
- import { R, a, b, V, c, d, e, g, r } from "./virtual-route-C7NPJx5y.js";
2
+ import { R, a, b, V, c, d, e, g, r } from "./virtual-route-C21P-S6I.js";
3
3
  const isRouteEntity = (route) => route && "isOpened" in route;
4
4
  export {
5
5
  R as Route,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobx-route",
3
- "version": "1.3.4",
3
+ "version": "2.0.0",
4
4
  "keywords": [
5
5
  "mobx",
6
6
  "react",
@@ -67,13 +67,13 @@
67
67
  "require": "./view-model.cjs",
68
68
  "default": "./view-model.js"
69
69
  },
70
- "./virtual-route-B_X_wClE": {
71
- "require": "./virtual-route-B_X_wClE.cjs",
72
- "default": "./virtual-route-B_X_wClE.cjs"
70
+ "./virtual-route-C21P-S6I": {
71
+ "import": "./virtual-route-C21P-S6I.js",
72
+ "default": "./virtual-route-C21P-S6I.js"
73
73
  },
74
- "./virtual-route-C7NPJx5y": {
75
- "import": "./virtual-route-C7NPJx5y.js",
76
- "default": "./virtual-route-C7NPJx5y.js"
74
+ "./virtual-route-DCnOqDz5": {
75
+ "require": "./virtual-route-DCnOqDz5.cjs",
76
+ "default": "./virtual-route-DCnOqDz5.cjs"
77
77
  }
78
78
  },
79
79
  "files": [
package/view-model.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mobx = require("mobx");
4
4
  const mobxViewModel = require("mobx-view-model");
5
- const virtualRoute = require("./virtual-route-B_X_wClE.cjs");
5
+ const virtualRoute = require("./virtual-route-DCnOqDz5.cjs");
6
6
  const annotations = [
7
7
  [mobx.computed.struct, "pathParams"],
8
8
  [mobx.computed, "query"]
package/view-model.d.ts CHANGED
@@ -63,7 +63,7 @@ interface CreatedUrlOutputParams {
63
63
  /** @see [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl) */
64
64
  omitQuery?: boolean;
65
65
  }
66
- interface RouteConfiguration<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TParentRoute extends Route<string, any, any, any, any> | null = null, TQueryParams extends Record<string, any> = AnyObject> extends Omit<Partial<RouteGlobalConfig>, 'createUrl'> {
66
+ interface RouteConfiguration<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TQueryParams extends Record<string, any> = AnyObject> extends Omit<Partial<RouteGlobalConfig>, 'createUrl'> {
67
67
  /**
68
68
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#abortsignal)
69
69
  */
@@ -81,7 +81,7 @@ interface RouteConfiguration<TPath extends string, TInputParams extends InputPat
81
81
  meta?: AnyObject;
82
82
  parseOptions?: ParseOptions;
83
83
  matchOptions?: MatchOptions & ParseOptions;
84
- parent?: TParentRoute;
84
+ parent?: AnyRoute | null;
85
85
  children?: AnyRoute[];
86
86
  /**
87
87
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#params)
@@ -102,17 +102,17 @@ interface RouteConfiguration<TPath extends string, TInputParams extends InputPat
102
102
  /**
103
103
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#afteropen)
104
104
  */
105
- afterOpen?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TParentRoute>, NoInfer<TQueryParams>>) => void;
105
+ afterOpen?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TQueryParams>>) => void;
106
106
  /**
107
107
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#afterupdate)
108
108
  */
109
- afterUpdate?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TParentRoute>, NoInfer<TQueryParams>>) => void;
109
+ afterUpdate?: (data: ParsedPathData<NoInfer<TPath>>, route: Route<NoInfer<TPath>, NoInfer<TInputParams>, NoInfer<TOutputParams>, NoInfer<TQueryParams>>) => void;
110
110
  /**
111
111
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl)
112
112
  */
113
113
  createUrl?: UrlCreateParamsFn<TInputParams, TQueryParams>;
114
114
  }
115
- type AnyRoute = Route<any, any, any, any, any>;
115
+ type AnyRoute = Route<any, any, any, any>;
116
116
  type InputPathParam = string | number | boolean | null;
117
117
  type ParsedPathParam = string;
118
118
  type Simplify<T> = T extends infer U ? {
@@ -148,8 +148,8 @@ interface ParsedPathData<TPath extends string> {
148
148
  *
149
149
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html)
150
150
  */
151
- declare class Route<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TParentRoute extends Route<any, any, any, any, any> | null = null, TQueryParams extends Record<string, any> = AnyObject> {
152
- protected config: RouteConfiguration<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>;
151
+ declare class Route<TPath extends string, TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>, TOutputParams extends AnyObject = ParsedPathParams<TPath>, TQueryParams extends Record<string, any> = AnyObject> {
152
+ protected config: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>;
153
153
  private isDestroyed?;
154
154
  private disposer?;
155
155
  protected history: History;
@@ -158,8 +158,8 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
158
158
  *
159
159
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#parent)
160
160
  */
161
- parent: TParentRoute;
162
- query: IQueryParams<TQueryParams>;
161
+ parent: AnyRoute | null;
162
+ query: IQueryParams;
163
163
  private _tokenData;
164
164
  private _matcher?;
165
165
  private _compiler?;
@@ -192,7 +192,7 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
192
192
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#children)
193
193
  */
194
194
  children: AnyRoute[];
195
- constructor(pathDeclaration: TPath, config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>);
195
+ constructor(pathDeclaration: TPath, config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>);
196
196
  protected get baseUrl(): string | undefined;
197
197
  /**
198
198
  * Checks whether current route matches provided path.
@@ -239,7 +239,7 @@ declare class Route<TPath extends string, TInputParams extends InputPathParams<T
239
239
  *
240
240
  * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#extend)
241
241
  */
242
- extend<TExtendedPath extends string, TExtendedInputParams extends InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>, TExtendedOutputParams extends AnyObject = TInputParams & ParsedPathParams<`${TPath}${TExtendedPath}`>, TExtendedQueryParams extends Record<string, any> = TQueryParams>(pathDeclaration: TExtendedPath, config?: Omit<RouteConfiguration<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, any, TExtendedQueryParams>, 'parent'>): Route<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, this, TExtendedQueryParams>;
242
+ extend<TExtendedPath extends string, TExtendedInputParams extends InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>, TExtendedOutputParams extends AnyObject = TInputParams & ParsedPathParams<`${TPath}${TExtendedPath}`>, TExtendedQueryParams extends Record<string, any> = TQueryParams>(pathDeclaration: TExtendedPath, config?: Omit<RouteConfiguration<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, TExtendedQueryParams>, 'parent'>): Route<`${TPath}${TExtendedPath}`, TInputParams & TExtendedInputParams, TExtendedOutputParams, TExtendedQueryParams>;
243
243
  /**
244
244
  * Manually add child routes.
245
245
  *
package/view-model.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { computed } from "mobx";
2
2
  import { ViewModelBase, applyObservable } from "mobx-view-model";
3
- import { r as routeConfig } from "./virtual-route-C7NPJx5y.js";
3
+ import { r as routeConfig } from "./virtual-route-C21P-S6I.js";
4
4
  const annotations = [
5
5
  [computed.struct, "pathParams"],
6
6
  [computed, "query"]
@@ -510,10 +510,7 @@ class Route {
510
510
  this.updateDisposer = void 0;
511
511
  }
512
512
  }
513
- const createRoute = (path, config) => new Route(
514
- path,
515
- config
516
- );
513
+ const createRoute = (path, config) => new Route(path, config);
517
514
  const annotations$2 = [
518
515
  [computed, "isOpened", "indexRoute", "canNavigate"],
519
516
  [observable.shallow, "routes"]
@@ -824,4 +821,4 @@ export {
824
821
  groupRoutes as g,
825
822
  routeConfig as r
826
823
  };
827
- //# sourceMappingURL=virtual-route-C7NPJx5y.js.map
824
+ //# sourceMappingURL=virtual-route-C21P-S6I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-route-C21P-S6I.js","sources":["../src/core/config/config.ts","../src/core/route/route.ts","../src/core/route-group/route-group.ts","../src/core/router/router.ts","../src/core/virtual-route/virtual-route.ts"],"sourcesContent":["import {\n createBrowserHistory,\n createQueryParams,\n type History,\n type IQueryParams,\n isObservableHistory,\n} from 'mobx-location-history';\nimport { createGlobalDynamicConfig } from 'yummies/complex';\n\nimport type { RouteGlobalConfig } from './config.types.js';\n\nexport const routeConfig = createGlobalDynamicConfig<RouteGlobalConfig>(\n (update, current) => {\n let history: History;\n let queryParams: IQueryParams | undefined;\n\n if (update?.history) {\n history = update.history;\n queryParams = update.queryParams;\n\n if (current?.history && isObservableHistory(current.history)) {\n current.history.destroy();\n }\n } else if (current?.history) {\n history = current.history;\n queryParams = update?.queryParams ?? current.queryParams;\n } else {\n history = createBrowserHistory();\n }\n\n queryParams ??= createQueryParams({ history });\n\n return {\n ...update,\n history,\n queryParams,\n };\n },\n Symbol.for('MOBX_ROUTE_CONFIG'),\n);\n","import { comparer, computed, observable, reaction, runInAction } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport {\n compile,\n match,\n type ParamData,\n parse,\n type TokenData,\n} from 'path-to-regexp';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AnyRoute,\n CreatedUrlOutputParams,\n InputPathParams,\n NavigationTrx,\n ParsedPathData,\n ParsedPathParams,\n RouteConfiguration,\n RouteNavigateParams,\n UrlCreateParams,\n} from './route.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<Route<any, any, any, any>> = [\n [\n computed,\n 'isPathMatched',\n 'isOpened',\n 'isOpening',\n 'path',\n 'absolutePath',\n 'hasOpenedChildren',\n 'isAbleToMergeQuery',\n 'baseUrl',\n ],\n [computed.struct, 'parsedPathData', 'params'],\n [observable, 'children'],\n [observable.ref, 'parent', 'status'],\n];\n\n/**\n * Class for creating path based route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html)\n */\nexport class Route<\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TQueryParams extends Record<string, any> = AnyObject,\n> {\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n protected history: History;\n\n /**\n * Parent route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#parent)\n */\n parent: AnyRoute | null;\n\n query: IQueryParams;\n\n private _tokenData: TokenData | undefined;\n private _matcher?: ReturnType<typeof match>;\n private _compiler?: ReturnType<typeof compile>;\n private ignoreOpenByPathMatch = false;\n private isUpdate = false;\n private updateDisposer?: VoidFunction;\n\n protected status:\n | 'opening'\n | 'closed'\n | 'open-rejected'\n | 'open-confirmed'\n | 'unknown';\n\n meta?: AnyObject;\n\n /**\n * Route path pattern declaration.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#pathdeclaration)\n */\n pathDeclaration: TPath;\n\n /**\n * Indicates if this route is an index route. Index routes activate when parent route path matches exactly.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isindex)\n */\n isIndex: boolean;\n\n /**\n * Indicates if this route is an hash route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#ishash)\n */\n isHash: boolean;\n\n /**\n * Array of child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#children)\n */\n children: AnyRoute[] = [];\n\n constructor(\n pathDeclaration: TPath,\n protected config: RouteConfiguration<\n TPath,\n TInputParams,\n TOutputParams,\n TQueryParams\n > = {},\n ) {\n this.history = config.history ?? routeConfig.get().history;\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n this.pathDeclaration = pathDeclaration;\n this.isIndex = !!this.config.index;\n this.isHash = !!this.config.hash;\n this.meta = this.config.meta;\n this.status = 'unknown';\n this.parent = config.parent ?? null;\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(() => this.isPathMatched, this.checkPathMatch, {\n fireImmediately: true,\n });\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'open-confirmed') return undefined;\n return [this.parsedPathData, this.query.data] as const;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n if (!this.parsedPathData) return;\n this.config.afterUpdate?.(this.parsedPathData, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n this.config.abortSignal?.addEventListener('abort', () => this.destroy(), {\n once: true,\n });\n }\n }\n\n protected get baseUrl() {\n const baseUrl = this.config.baseUrl ?? routeConfig.get().baseUrl;\n return baseUrl?.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n }\n\n /**\n * Checks whether current route matches provided path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#matchpath)\n */\n matchPath(path?: Maybe<string>): ParsedPathData<TPath> | null {\n let pathnameToCheck: string;\n\n if (path != null) {\n pathnameToCheck = path;\n } else if (this.isHash) {\n pathnameToCheck = this.history.location.hash.slice(1);\n } else {\n pathnameToCheck = this.history.location.pathname;\n }\n\n if (this.baseUrl) {\n if (!pathnameToCheck.startsWith(this.baseUrl)) {\n return null;\n }\n\n pathnameToCheck = pathnameToCheck.replace(this.baseUrl, '');\n }\n\n if (\n (this.pathDeclaration === '' || this.pathDeclaration === '/') &&\n (pathnameToCheck === '/' || pathnameToCheck === '')\n ) {\n return { params: {} as any, path: pathnameToCheck };\n }\n\n this._matcher ??= match(this.tokenData, {\n end: this.config.exact ?? false,\n ...this.config.matchOptions,\n });\n const parsed = this._matcher(pathnameToCheck);\n\n if (parsed === false) {\n return null;\n }\n\n return parsed as ParsedPathData<TPath>;\n }\n\n protected get parsedPathData(): ParsedPathData<TPath> | null {\n return this.matchPath();\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopening)\n *\n * Also true in the short gap after history already matches this route but\n * `confirmOpening` has not started yet (e.g. browser Back) — otherwise every\n * route looks closed for one tick and RouteViewGroup unmounts the page.\n */\n get isOpening() {\n if (this.status === 'opening') {\n return true;\n }\n\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status === 'open-confirmed' ||\n this.status === 'open-rejected'\n ) {\n return false;\n }\n\n return this.status === 'closed' || this.status === 'unknown';\n }\n\n /**\n * Matched path segment for current URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#path)\n */\n get path(): string | null {\n return this.parsedPathData?.path ?? null;\n }\n\n /**\n * Matched path segment for current URL with base URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#absolutepath)\n */\n get absolutePath(): string | null {\n const path = this.path;\n\n if (path === null) {\n return null;\n }\n\n return `${this.baseUrl || ''}${path}`;\n }\n\n /**\n * Current parsed path parameters.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#params)\n */\n get params(): TOutputParams | null {\n if (!this.parsedPathData?.params) {\n return null;\n }\n\n if (this.config.params) {\n const result = this.config.params(\n this.parsedPathData.params,\n this.config.meta,\n );\n return result || null;\n }\n\n return (\n (this.parsedPathData?.params as unknown as Maybe<TOutputParams>) ?? null\n );\n }\n\n protected get isPathMatched() {\n return this.parsedPathData !== null;\n }\n\n /**\n * Defines the \"open\" state for this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopened)\n */\n get isOpened() {\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status !== 'open-confirmed'\n ) {\n return false;\n }\n\n return (\n // this.parsedPathData is defined because this.params !== null\n !this.config.checkOpened || this.config.checkOpened(this.parsedPathData!)\n );\n }\n\n /**\n * Allows to create child route based on this route with merging this route path and extending path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#extend)\n */\n extend<\n TExtendedPath extends string,\n TExtendedInputParams extends\n InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedOutputParams extends AnyObject = TInputParams &\n ParsedPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedQueryParams extends Record<string, any> = TQueryParams,\n >(\n pathDeclaration: TExtendedPath,\n config?: Omit<\n RouteConfiguration<\n `${TPath}${TExtendedPath}`,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n TExtendedQueryParams\n >,\n 'parent'\n >,\n ) {\n type ExtendedRoutePath = `${TPath}${TExtendedPath}`;\n const { index, params, exact, ...configFromCurrentRoute } = this.config;\n\n const extendedChild = new Route<\n ExtendedRoutePath,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n TExtendedQueryParams\n >(`${this.pathDeclaration}${pathDeclaration}`, {\n ...configFromCurrentRoute,\n ...config,\n parent: this,\n } as any);\n\n this.addChildren(extendedChild as any);\n\n return extendedChild;\n }\n\n /**\n * Manually add child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#addchildren)\n */\n addChildren(...routes: AnyRoute[]) {\n this.children.push(...routes);\n }\n\n /**\n * Remove specified routes from children.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#removechildren)\n */\n removeChildren(...routes: AnyRoute[]) {\n this.children = this.children.filter((child) => !routes.includes(child));\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#hasopenedchildren)\n */\n get hasOpenedChildren(): boolean {\n return this.children.some(\n (child) => child.isOpened || child.hasOpenedChildren,\n );\n }\n\n protected processParams(\n params?: TInputParams | null | undefined,\n ): ParamData | undefined {\n if (params == null) return undefined;\n\n const result: ParamData = {};\n for (const [key, value] of Object.entries(params)) {\n if (value != null) {\n result[key] = Array.isArray(value) ? value.map(String) : String(value);\n }\n }\n return result;\n }\n\n /**\n * Generates full route URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl)\n */\n createUrl(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: Maybe<TInputParams>,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n : [\n params: TInputParams,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n ) {\n const params = args[0];\n const rawQuery = args[1];\n const mergeQueryOrOutputParams = args[2] ?? this.isAbleToMergeQuery;\n const outputParams: Maybe<CreatedUrlOutputParams> =\n typeof mergeQueryOrOutputParams === 'boolean'\n ? { mergeQuery: mergeQueryOrOutputParams }\n : mergeQueryOrOutputParams;\n\n const query = outputParams?.mergeQuery\n ? ({ ...this.query.data, ...rawQuery } as Partial<TQueryParams>)\n : ((rawQuery ?? {}) as Partial<TQueryParams>);\n\n this._compiler ??= compile(this.tokenData);\n\n const defaultUrlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n {\n baseUrl: this.baseUrl,\n params: params as TInputParams,\n query,\n };\n const urlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n this.config.createUrl?.(defaultUrlCreateParams, this.query.data) ??\n routeConfig.get().createUrl?.(defaultUrlCreateParams, this.query.data) ??\n defaultUrlCreateParams;\n\n let path: string;\n\n try {\n path = this._compiler(this.processParams(urlCreateParams.params));\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'Error #1: Route path compilation failed\\n' +\n 'The path pattern could not be built into a URL (often missing or invalid params for a `:param` segment). Using fallbackPath or \"/\".\\n' +\n 'See docs: https://js2me.github.io/mobx-route/errors/1',\n e,\n );\n } else {\n console.error('minified error #1;see mobx-route docs', e);\n }\n path = this.config.fallbackPath ?? routeConfig.get().fallbackPath ?? '/';\n }\n\n const url = `${urlCreateParams.baseUrl || ''}${this.isHash ? '#' : ''}${path}`;\n\n if (outputParams?.omitQuery) {\n return url;\n }\n\n return `${url}${buildSearchString(urlCreateParams.query)}`;\n }\n\n /**\n * Navigates to this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#open)\n */\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n : [\n params: TInputParams,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n ): Promise<void>;\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n : [\n params: TInputParams,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n ): Promise<void>;\n open(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n open(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async open(...args: any[]) {\n const {\n replace,\n state: rawState,\n query: rawQuery,\n mergeQuery: rawMergeQuery,\n } = typeof args[1] === 'boolean' || args.length > 2\n ? ({\n replace: args[1],\n query: args[2],\n } as RouteNavigateParams<TQueryParams>)\n : ((args[1] ?? {}) as RouteNavigateParams<TQueryParams>);\n\n const mergeQuery = rawMergeQuery ?? this.isAbleToMergeQuery;\n const query = (\n mergeQuery ? { ...this.query.data, ...rawQuery } : rawQuery\n ) as Partial<TQueryParams> | undefined;\n\n const params = typeof args[0] === 'string' ? undefined : args[0];\n const url =\n typeof args[0] === 'string' ? args[0] : this.createUrl(args[0], query);\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url,\n params: params as TInputParams,\n replace,\n state: rawState ?? null,\n query,\n };\n\n this.isUpdate = this.status === 'open-confirmed';\n this.ignoreOpenByPathMatch = true;\n const isConfirmed = await this.confirmOpening(trx);\n\n if (isConfirmed !== true) {\n this.ignoreOpenByPathMatch = false;\n this.isUpdate = false;\n }\n }\n\n /**\n * Updates the current route if it is already open.\n * Unlike `open`, this is a no-op if the route is not open,\n * defaults to `replace: true` instead of push,\n * and defaults to `mergeQuery: true` when no query params are provided.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#update)\n */\n update(\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n update(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async update(...args: any[]) {\n if (this.status !== 'open-confirmed') {\n return;\n }\n\n // Reuse current path params when omitted\n if (args[0] == null) {\n args[0] = this.parsedPathData?.params;\n }\n\n const secondArg = args[1];\n const isObjectParams = typeof secondArg === 'object' && secondArg !== null;\n\n if (isObjectParams) {\n args[1] = {\n replace: true,\n ...('query' in secondArg ? {} : { mergeQuery: true }),\n ...secondArg,\n };\n } else if (typeof secondArg === 'boolean') {\n if (args[2] === undefined) {\n args[1] = { replace: secondArg, mergeQuery: true };\n args.length = 2;\n }\n } else if (args.length === 1) {\n args[1] = { replace: true, mergeQuery: true };\n }\n\n return (this.open as (...args: any[]) => Promise<void>)(...args);\n }\n\n protected get tokenData() {\n if (!this._tokenData) {\n this._tokenData = parse(this.pathDeclaration, this.config.parseOptions);\n }\n return this._tokenData;\n }\n\n protected async confirmOpening(\n trx: NavigationTrx<TInputParams, TQueryParams>,\n ) {\n if (!this.isUpdate) {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n let skipHistoryUpdate = !!trx.preferSkipHistoryUpdate;\n\n if (skipHistoryUpdate) {\n this.ignoreOpenByPathMatch = false;\n }\n\n if (this.config.beforeOpen) {\n const feedback = await this.config.beforeOpen(trx);\n\n if (feedback === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n });\n\n return;\n }\n\n // Rebuild URL if beforeOpen mutated trx.params\n const newUrl = this.createUrl(\n trx.params as TInputParams,\n trx.query as AnyObject,\n );\n if (newUrl !== trx.url) {\n trx.url = newUrl;\n skipHistoryUpdate = false;\n }\n\n if (typeof feedback === 'object') {\n skipHistoryUpdate = false;\n Object.assign(trx, feedback);\n }\n }\n\n if (this.isDestroyed) {\n return;\n }\n\n if (!skipHistoryUpdate) {\n if (trx.replace) {\n this.history.replace(trx.url, trx.state);\n } else {\n this.history.push(trx.url, trx.state);\n }\n }\n\n if (this.isPathMatched) {\n const wasAlreadyConfirmed = this.status === 'open-confirmed';\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n\n if (this.isUpdate) {\n this.isUpdate = false;\n // afterUpdate handled by updateDisposer reaction\n } else if (!wasAlreadyConfirmed) {\n this.config.afterOpen?.(this.parsedPathData!, this);\n }\n }\n\n return true;\n }\n\n protected confirmClosing() {\n runInAction(() => {\n this.status = 'closed';\n });\n return true;\n }\n\n private firstPathMatchingRun = true;\n\n private checkPathMatch = async (isPathMathched: boolean) => {\n if (this.firstPathMatchingRun) {\n this.firstPathMatchingRun = false;\n // ignore first 'afterClose' callback call\n if (!isPathMathched) {\n return;\n }\n }\n\n if (isPathMathched) {\n // after manual open call\n if (this.ignoreOpenByPathMatch) {\n this.ignoreOpenByPathMatch = false;\n if (this.status === 'opening' && this.parsedPathData) {\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.parsedPathData, this);\n } else {\n this.config.afterOpen?.(this.parsedPathData, this);\n }\n }\n // update() delegates to confirmOpening\n return;\n }\n\n // Set opening sync to avoid isOpened/isOpening flicker\n if (this.status !== 'opening' && this.status !== 'open-confirmed') {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n // already confirmed\n if (this.status === 'open-confirmed') {\n return;\n }\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url: `${this.parsedPathData!.path}${buildSearchString(this.query.data)}`,\n params: this.parsedPathData!.params as TInputParams,\n state: this.history.location.state,\n query: this.query.data as Partial<TQueryParams>,\n preferSkipHistoryUpdate: true,\n };\n\n await this.confirmOpening(trx);\n } else {\n this.ignoreOpenByPathMatch = false;\n\n const isConfirmed = this.confirmClosing();\n\n if (isConfirmed) {\n this.config.afterClose?.();\n }\n }\n };\n\n private get isAbleToMergeQuery() {\n return this.config.mergeQuery ?? routeConfig.get().mergeQuery;\n }\n\n /**\n * Destroys route subscriptions and reactions.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#destroy)\n */\n destroy() {\n this.isDestroyed = true;\n this.disposer?.();\n this.disposer = undefined;\n this.updateDisposer?.();\n this.updateDisposer = undefined;\n }\n}\n\nexport const createRoute = <\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n path: TPath,\n config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>,\n) => new Route<TPath, TInputParams, TOutputParams, TQueryParams>(path, config);\n","import { computed, observable } from 'mobx';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type {\n AbstractRouteGroup,\n AnyRouteEntity,\n RoutesCollection,\n} from './route-group.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<RouteGroup<any>> = [\n [computed, 'isOpened', 'indexRoute', 'canNavigate'],\n [observable.shallow, 'routes'],\n];\n\n/**\n * Class for grouping related routes and managing their state.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport class RouteGroup<TRoutesCollection extends RoutesCollection>\n implements AbstractRouteGroup<TRoutesCollection>\n{\n routes: TRoutesCollection;\n\n constructor(\n routes: TRoutesCollection,\n private _indexRoute?: AnyRouteEntity,\n ) {\n this.routes = routes;\n\n applyObservable(this, annotations);\n }\n\n /**\n * Returns true if at least one route in the group is open.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#isopened)\n */\n get isOpened(): boolean {\n const routes = Object.values(this.routes);\n return routes.some(\n (route) =>\n route.isOpened ||\n ('hasOpenedChildren' in route && route.hasOpenedChildren),\n );\n }\n\n /**\n * First found index route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#indexroute)\n */\n get indexRoute(): AnyRouteEntity | undefined {\n return (this._indexRoute ??\n Object.values(this.routes).find(\n (route) => 'isIndex' in route && route.isIndex,\n )) as unknown as AnyRouteEntity;\n }\n\n /**\n * `true` if `open()` has a target to navigate to —\n * either an own index route or a nested `RouteGroup` that itself can navigate.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#cannavigate)\n */\n get canNavigate(): boolean {\n if (this.indexRoute) return true;\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Main navigation method for the group.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#open)\n */\n open(...args: any[]) {\n if (this.indexRoute && 'open' in this.indexRoute) {\n this.indexRoute.open(...args);\n return;\n }\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n route.open(...args);\n return;\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Warning #1: RouteGroup.open() cannot navigate\\n' +\n 'This group has no index route (`index: true` or `groupRoutes(routes, indexRoute)`) and no navigable nested RouteGroup, so open() does nothing.\\n' +\n 'See docs: https://js2me.github.io/mobx-route/warnings/1',\n );\n } else {\n console.warn('minified warning #1;see mobx-route docs');\n }\n }\n}\n\n/**\n * Helper for creating route groups.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport const groupRoutes = <TRoutesCollection extends RoutesCollection>(\n routes: TRoutesCollection,\n indexRoute?: AnyRouteEntity,\n) => new RouteGroup<TRoutesCollection>(routes, indexRoute);\n","import { computed } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport { routeConfig } from '../config/index.js';\nimport type { RoutesCollection } from '../route-group/index.js';\nimport type {\n RouterConfiguration,\n RouterNavigateOptions,\n} from './router.types.js';\n\nconst annotations: ObservableAnnotationsArray<Router<any>> = [\n [computed.struct, 'location'],\n];\n\n/**\n * Class for centralized routing management.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Router.html)\n */\nexport class Router<TRoutesCollection extends RoutesCollection> {\n routes: TRoutesCollection;\n history: History;\n query: IQueryParams;\n\n constructor(config: RouterConfiguration<TRoutesCollection>) {\n this.routes = config.routes;\n this.history = config.history ?? routeConfig.get().history;\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n\n applyObservable(this, annotations);\n }\n\n get location() {\n return this.history.location;\n }\n\n navigate(url: string, options?: RouterNavigateOptions) {\n const query =\n (options?.mergeQuery ?? routeConfig.get().mergeQuery)\n ? { ...this.query.data, ...options?.query }\n : { ...options?.query };\n\n const searchString = buildSearchString(query);\n const navigationUrl = `${url}${searchString}`;\n\n if (options?.replace) {\n this.history.replace(navigationUrl, options?.state);\n } else {\n this.history.push(navigationUrl, options?.state);\n }\n }\n}\n\nexport const createRouter = <TRoutesCollection extends RoutesCollection>(\n config: RouterConfiguration<TRoutesCollection>,\n) => new Router(config);\n","import {\n action,\n comparer,\n computed,\n observable,\n reaction,\n runInAction,\n} from 'mobx';\nimport type { IQueryParams } from 'mobx-location-history';\nimport { callFunction } from 'yummies/common';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, EmptyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AbstractVirtualRoute,\n VirtualOpenExtraParams,\n VirtualRouteConfiguration,\n VirtualRouteTrx,\n} from './virtual-route.types.js';\n\nconst annotations: ObservableAnnotationsArray<VirtualRoute<any>> = [\n [observable, 'params'],\n [observable.ref, 'status', 'trx', 'openChecker', 'isOuterOpened'],\n [computed, 'isOpened', 'isOpening', 'isClosing'],\n [action, 'setOpenChecker', 'open', 'close', 'destroy'],\n];\n\n/**\n * Class for creating routes with custom activation logic\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html)\n */\nexport class VirtualRoute<\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n> implements AbstractVirtualRoute<TParams, TQueryParams>\n{\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n query: IQueryParams;\n params: TParams | null;\n\n protected status:\n | 'opening'\n | 'open-rejected'\n | 'opened'\n | 'closing'\n | 'closed'\n | 'unknown';\n\n private openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>;\n\n private trx: Maybe<VirtualRouteTrx>;\n\n private skipAutoOpenClose: boolean;\n\n private isUpdate = false;\n\n private updateDisposer?: VoidFunction;\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isouteropened)\n */\n isOuterOpened: boolean | undefined;\n\n constructor(protected config: VirtualRouteConfiguration<TParams> = {}) {\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n this.params = callFunction(config.initialParams, this) ?? null;\n this.openChecker = config.checkOpened;\n this.skipAutoOpenClose = false;\n this.isOuterOpened = this.openChecker?.(this);\n this.status = this.isOuterOpened ? 'opened' : 'unknown';\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(\n () => this.openChecker?.(this),\n action((isOuterOpened) => {\n this.isOuterOpened = isOuterOpened;\n\n if (\n this.skipAutoOpenClose ||\n this.status === 'closing' ||\n this.status === 'opening'\n ) {\n return;\n }\n\n if (this.isOuterOpened) {\n if (this.status === 'opened') {\n return;\n }\n void this.confirmOpening({\n params: this.params ?? null,\n ...this.config.getAutoOpenParams?.(this),\n });\n } else {\n if (this.status === 'closed' || this.status === 'unknown') {\n return;\n }\n void this.confirmClosing();\n }\n }),\n { signal: this.config.abortSignal, fireImmediately: true },\n );\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'opened') return undefined;\n return this.query.data;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n this.config.afterUpdate?.(this.params, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n }\n\n if (this.status === 'opened') {\n this.config.afterOpen?.(this.params, this);\n }\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopened)\n */\n get isOpened() {\n return (\n !this.isDestroyed &&\n this.status === 'opened' &&\n this.isOuterOpened !== false\n );\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopening)\n */\n get isOpening() {\n return this.status === 'opening';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isclosing)\n */\n get isClosing() {\n return this.status === 'closing';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#setopenchecker)\n */\n setOpenChecker(\n openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>,\n ) {\n this.openChecker = openChecker;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#open)\n */\n open(\n ...args: IsPartial<TParams> extends true\n ? [\n params?: Maybe<TParams>,\n extraParams?: VirtualOpenExtraParams<TQueryParams>,\n ]\n : [params: TParams, extraParams?: VirtualOpenExtraParams<TQueryParams>]\n ): Promise<void>;\n async open(...args: any[]) {\n const params = (args[0] ?? null) as unknown as TParams;\n const extra: Maybe<VirtualOpenExtraParams> = args[1];\n\n this.isUpdate = this.status === 'opened';\n this.skipAutoOpenClose = true;\n\n this.trx = {\n params,\n extra,\n manual: true,\n };\n\n await this.confirmOpening(this.trx);\n\n this.skipAutoOpenClose = false;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#close)\n */\n async close() {\n this.skipAutoOpenClose = true;\n const result = await this.confirmClosing();\n this.skipAutoOpenClose = false;\n return result;\n }\n\n private async confirmOpening(trx: VirtualRouteTrx) {\n runInAction(() => {\n this.trx = undefined;\n this.status = 'opening';\n });\n\n if ((await this.config.beforeOpen?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n if ((await this.config.open?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n runInAction(() => {\n if (trx.extra?.query) {\n this.query.update(trx.extra.query, trx.extra.replace);\n }\n\n this.trx = undefined;\n this.params = trx.params;\n this.status = 'opened';\n\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.params!, this);\n } else {\n this.config.afterOpen?.(this.params!, this);\n }\n });\n\n return true;\n }\n\n private async confirmClosing() {\n if (this.status === 'closed') {\n return true;\n }\n\n const lastStatus = this.status;\n\n runInAction(() => {\n this.status = 'closing';\n });\n\n if ((await this.config.beforeClose?.()) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n if (this.config.close?.(this) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n runInAction(() => {\n this.status = 'closed';\n this.params = null;\n });\n\n this.config.afterClose?.();\n\n return true;\n }\n\n destroy() {\n this.isDestroyed = true;\n this.status = 'unknown';\n this.disposer?.();\n this.updateDisposer?.();\n }\n}\n\nexport const createVirtualRoute = <\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n config?: VirtualRouteConfiguration<TParams>,\n) => new VirtualRoute<TParams, TQueryParams>(config);\n"],"names":["annotations"],"mappings":";;;;;;AAWO,MAAM,cAAc;AAAA,EACzB,CAAC,QAAQ,YAAY;AACnB,QAAI;AACJ,QAAI;AAEJ,QAAI,QAAQ,SAAS;AACnB,gBAAU,OAAO;AACjB,oBAAc,OAAO;AAErB,UAAI,SAAS,WAAW,oBAAoB,QAAQ,OAAO,GAAG;AAC5D,gBAAQ,QAAQ,QAAA;AAAA,MAClB;AAAA,IACF,WAAW,SAAS,SAAS;AAC3B,gBAAU,QAAQ;AAClB,oBAAc,QAAQ,eAAe,QAAQ;AAAA,IAC/C,OAAO;AACL,gBAAU,qBAAA;AAAA,IACZ;AAEA,oBAAgB,kBAAkB,EAAE,SAAS;AAE7C,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,uBAAO,IAAI,mBAAmB;AAChC;ACTA,MAAMA,gBAAqE;AAAA,EACzE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,CAAC,SAAS,QAAQ,kBAAkB,QAAQ;AAAA,EAC5C,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,WAAW,KAAK,UAAU,QAAQ;AACrC;AAOO,MAAM,MAKX;AAAA,EA2DA,YACE,iBACU,SAKN,IACJ;AANU,SAAA,SAAA;AAOV,SAAK,UAAU,OAAO,WAAW,YAAY,MAAM;AACnD,SAAK,QAAQ,OAAO,eAAe,YAAY,MAAM;AACrD,SAAK,kBAAkB;AACvB,SAAK,UAAU,CAAC,CAAC,KAAK,OAAO;AAC7B,SAAK,SAAS,CAAC,CAAC,KAAK,OAAO;AAC5B,SAAK,OAAO,KAAK,OAAO;AACxB,SAAK,SAAS;AACd,SAAK,SAAS,OAAO,UAAU;AAE/B,oBAAgB,MAAMA,aAAW;AAEjC,QAAI,KAAK,OAAO,aAAa,SAAS;AACpC,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,WAAW,SAAS,MAAM,KAAK,eAAe,KAAK,gBAAgB;AAAA,QACtE,iBAAiB;AAAA,MAAA,CAClB;AACD,WAAK,iBAAiB;AAAA,QACpB,MAAM;AACJ,cAAI,KAAK,WAAW,iBAAkB,QAAO;AAC7C,iBAAO,CAAC,KAAK,gBAAgB,KAAK,MAAM,IAAI;AAAA,QAC9C;AAAA,QACA,CAAC,OAAO,cAAc;AACpB,cAAI,cAAc,OAAW;AAC7B,cAAI,UAAU,OAAW;AACzB,cAAI,CAAC,KAAK,eAAgB;AAC1B,eAAK,OAAO,cAAc,KAAK,gBAAgB,IAAI;AAAA,QACrD;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,QAAQ,KAAK,OAAO;AAAA,UACpB,QAAQ,SAAS;AAAA,QAAA;AAAA,MACnB;AAEF,WAAK,OAAO,aAAa,iBAAiB,SAAS,MAAM,KAAK,WAAW;AAAA,QACvE,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAAA,EACF;AAAA,EA7CY;AAAA,EA5DJ;AAAA,EACA;AAAA,EAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV;AAAA,EAEA;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX;AAAA,EAEE;AAAA,EAOV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAuB,CAAA;AAAA,EAmDvB,IAAc,UAAU;AACtB,UAAM,UAAU,KAAK,OAAO,WAAW,YAAY,MAAM;AACzD,WAAO,SAAS,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAoD;AAC5D,QAAI;AAEJ,QAAI,QAAQ,MAAM;AAChB,wBAAkB;AAAA,IACpB,WAAW,KAAK,QAAQ;AACtB,wBAAkB,KAAK,QAAQ,SAAS,KAAK,MAAM,CAAC;AAAA,IACtD,OAAO;AACL,wBAAkB,KAAK,QAAQ,SAAS;AAAA,IAC1C;AAEA,QAAI,KAAK,SAAS;AAChB,UAAI,CAAC,gBAAgB,WAAW,KAAK,OAAO,GAAG;AAC7C,eAAO;AAAA,MACT;AAEA,wBAAkB,gBAAgB,QAAQ,KAAK,SAAS,EAAE;AAAA,IAC5D;AAEA,SACG,KAAK,oBAAoB,MAAM,KAAK,oBAAoB,SACxD,oBAAoB,OAAO,oBAAoB,KAChD;AACA,aAAO,EAAE,QAAQ,IAAW,MAAM,gBAAA;AAAA,IACpC;AAEA,SAAK,aAAa,MAAM,KAAK,WAAW;AAAA,MACtC,KAAK,KAAK,OAAO,SAAS;AAAA,MAC1B,GAAG,KAAK,OAAO;AAAA,IAAA,CAChB;AACD,UAAM,SAAS,KAAK,SAAS,eAAe;AAE5C,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAc,iBAA+C;AAC3D,WAAO,KAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,YAAY;AACd,QAAI,KAAK,WAAW,WAAW;AAC7B,aAAO;AAAA,IACT;AAEA,QACE,KAAK,eACL,CAAC,KAAK,iBACN,KAAK,WAAW,QAChB,KAAK,WAAW,oBAChB,KAAK,WAAW,iBAChB;AACA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,WAAW,YAAY,KAAK,WAAW;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAsB;AACxB,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,eAA8B;AAChC,UAAM,OAAO,KAAK;AAElB,QAAI,SAAS,MAAM;AACjB,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,KAAK,WAAW,EAAE,GAAG,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,SAA+B;AACjC,QAAI,CAAC,KAAK,gBAAgB,QAAQ;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,YAAM,SAAS,KAAK,OAAO;AAAA,QACzB,KAAK,eAAe;AAAA,QACpB,KAAK,OAAO;AAAA,MAAA;AAEd,aAAO,UAAU;AAAA,IACnB;AAEA,WACG,KAAK,gBAAgB,UAA8C;AAAA,EAExE;AAAA,EAEA,IAAc,gBAAgB;AAC5B,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAW;AACb,QACE,KAAK,eACL,CAAC,KAAK,iBACN,KAAK,WAAW,QAChB,KAAK,WAAW,kBAChB;AACA,aAAO;AAAA,IACT;AAEA;AAAA;AAAA,MAEE,CAAC,KAAK,OAAO,eAAe,KAAK,OAAO,YAAY,KAAK,cAAe;AAAA;AAAA,EAE5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAQE,iBACA,QASA;AAEA,UAAM,EAAE,OAAO,QAAQ,OAAO,GAAG,uBAAA,IAA2B,KAAK;AAEjE,UAAM,gBAAgB,IAAI,MAKxB,GAAG,KAAK,eAAe,GAAG,eAAe,IAAI;AAAA,MAC7C,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,IAAA,CACF;AAER,SAAK,YAAY,aAAoB;AAErC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,QAAoB;AACjC,SAAK,SAAS,KAAK,GAAG,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,QAAoB;AACpC,SAAK,WAAW,KAAK,SAAS,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,KAAK,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,oBAA6B;AAC/B,WAAO,KAAK,SAAS;AAAA,MACnB,CAAC,UAAU,MAAM,YAAY,MAAM;AAAA,IAAA;AAAA,EAEvC;AAAA,EAEU,cACR,QACuB;AACvB,QAAI,UAAU,KAAM,QAAO;AAE3B,UAAM,SAAoB,CAAA;AAC1B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,SAAS,MAAM;AACjB,eAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,KAAK;AAAA,MACvE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aACK,MAWH;AACA,UAAM,SAAS,KAAK,CAAC;AACrB,UAAM,WAAW,KAAK,CAAC;AACvB,UAAM,2BAA2B,KAAK,CAAC,KAAK,KAAK;AACjD,UAAM,eACJ,OAAO,6BAA6B,YAChC,EAAE,YAAY,6BACd;AAEN,UAAM,QAAQ,cAAc,aACvB,EAAE,GAAG,KAAK,MAAM,MAAM,GAAG,SAAA,IACxB,YAAY,CAAA;AAElB,SAAK,cAAc,QAAQ,KAAK,SAAS;AAEzC,UAAM,yBACJ;AAAA,MACE,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,IAAA;AAEJ,UAAM,kBACJ,KAAK,OAAO,YAAY,wBAAwB,KAAK,MAAM,IAAI,KAC/D,YAAY,MAAM,YAAY,wBAAwB,KAAK,MAAM,IAAI,KACrE;AAEF,QAAI;AAEJ,QAAI;AACF,aAAO,KAAK,UAAU,KAAK,cAAc,gBAAgB,MAAM,CAAC;AAAA,IAClE,SAAS,GAAG;AACV,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,gBAAQ;AAAA,UACN;AAAA,UAGA;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL,gBAAQ,MAAM,yCAAyC,CAAC;AAAA,MAC1D;AACA,aAAO,KAAK,OAAO,gBAAgB,YAAY,IAAA,EAAM,gBAAgB;AAAA,IACvE;AAEA,UAAM,MAAM,GAAG,gBAAgB,WAAW,EAAE,GAAG,KAAK,SAAS,MAAM,EAAE,GAAG,IAAI;AAE5E,QAAI,cAAc,WAAW;AAC3B,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,GAAG,GAAG,kBAAkB,gBAAgB,KAAK,CAAC;AAAA,EAC1D;AAAA,EAyCA,MAAM,QAAQ,MAAa;AACzB,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IAAA,IACV,OAAO,KAAK,CAAC,MAAM,aAAa,KAAK,SAAS,IAC7C;AAAA,MACC,SAAS,KAAK,CAAC;AAAA,MACf,OAAO,KAAK,CAAC;AAAA,IAAA,IAEb,KAAK,CAAC,KAAK,CAAA;AAEjB,UAAM,aAAa,iBAAiB,KAAK;AACzC,UAAM,QACJ,aAAa,EAAE,GAAG,KAAK,MAAM,MAAM,GAAG,SAAA,IAAa;AAGrD,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,WAAW,SAAY,KAAK,CAAC;AAC/D,UAAM,MACJ,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC,GAAG,KAAK;AAEvE,UAAM,MAAiD;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,YAAY;AAAA,MACnB;AAAA,IAAA;AAGF,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,wBAAwB;AAC7B,UAAM,cAAc,MAAM,KAAK,eAAe,GAAG;AAEjD,QAAI,gBAAgB,MAAM;AACxB,WAAK,wBAAwB;AAC7B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EA6BA,MAAM,UAAU,MAAa;AAC3B,QAAI,KAAK,WAAW,kBAAkB;AACpC;AAAA,IACF;AAGA,QAAI,KAAK,CAAC,KAAK,MAAM;AACnB,WAAK,CAAC,IAAI,KAAK,gBAAgB;AAAA,IACjC;AAEA,UAAM,YAAY,KAAK,CAAC;AACxB,UAAM,iBAAiB,OAAO,cAAc,YAAY,cAAc;AAEtE,QAAI,gBAAgB;AAClB,WAAK,CAAC,IAAI;AAAA,QACR,SAAS;AAAA,QACT,GAAI,WAAW,YAAY,CAAA,IAAK,EAAE,YAAY,KAAA;AAAA,QAC9C,GAAG;AAAA,MAAA;AAAA,IAEP,WAAW,OAAO,cAAc,WAAW;AACzC,UAAI,KAAK,CAAC,MAAM,QAAW;AACzB,aAAK,CAAC,IAAI,EAAE,SAAS,WAAW,YAAY,KAAA;AAC5C,aAAK,SAAS;AAAA,MAChB;AAAA,IACF,WAAW,KAAK,WAAW,GAAG;AAC5B,WAAK,CAAC,IAAI,EAAE,SAAS,MAAM,YAAY,KAAA;AAAA,IACzC;AAEA,WAAQ,KAAK,KAA2C,GAAG,IAAI;AAAA,EACjE;AAAA,EAEA,IAAc,YAAY;AACxB,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,MAAM,KAAK,iBAAiB,KAAK,OAAO,YAAY;AAAA,IACxE;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAgB,eACd,KACA;AACA,QAAI,CAAC,KAAK,UAAU;AAClB,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,QAAI,oBAAoB,CAAC,CAAC,IAAI;AAE9B,QAAI,mBAAmB;AACrB,WAAK,wBAAwB;AAAA,IAC/B;AAEA,QAAI,KAAK,OAAO,YAAY;AAC1B,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,GAAG;AAEjD,UAAI,aAAa,OAAO;AACtB,oBAAY,MAAM;AAChB,eAAK,SAAS;AAAA,QAChB,CAAC;AAED;AAAA,MACF;AAGA,YAAM,SAAS,KAAK;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAEN,UAAI,WAAW,IAAI,KAAK;AACtB,YAAI,MAAM;AACV,4BAAoB;AAAA,MACtB;AAEA,UAAI,OAAO,aAAa,UAAU;AAChC,4BAAoB;AACpB,eAAO,OAAO,KAAK,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,QAAI,CAAC,mBAAmB;AACtB,UAAI,IAAI,SAAS;AACf,aAAK,QAAQ,QAAQ,IAAI,KAAK,IAAI,KAAK;AAAA,MACzC,OAAO;AACL,aAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,KAAK,eAAe;AACtB,YAAM,sBAAsB,KAAK,WAAW;AAC5C,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AAED,UAAI,KAAK,UAAU;AACjB,aAAK,WAAW;AAAA,MAElB,WAAW,CAAC,qBAAqB;AAC/B,aAAK,OAAO,YAAY,KAAK,gBAAiB,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,iBAAiB;AACzB,gBAAY,MAAM;AAChB,WAAK,SAAS;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB;AAAA,EAEvB,iBAAiB,OAAO,mBAA4B;AAC1D,QAAI,KAAK,sBAAsB;AAC7B,WAAK,uBAAuB;AAE5B,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,gBAAgB;AAElB,UAAI,KAAK,uBAAuB;AAC9B,aAAK,wBAAwB;AAC7B,YAAI,KAAK,WAAW,aAAa,KAAK,gBAAgB;AACpD,sBAAY,MAAM;AAChB,iBAAK,SAAS;AAAA,UAChB,CAAC;AACD,cAAI,KAAK,UAAU;AACjB,iBAAK,WAAW;AAChB,iBAAK,OAAO,cAAc,KAAK,gBAAgB,IAAI;AAAA,UACrD,OAAO;AACL,iBAAK,OAAO,YAAY,KAAK,gBAAgB,IAAI;AAAA,UACnD;AAAA,QACF;AAEA;AAAA,MACF;AAGA,UAAI,KAAK,WAAW,aAAa,KAAK,WAAW,kBAAkB;AACjE,oBAAY,MAAM;AAChB,eAAK,SAAS;AAAA,QAChB,CAAC;AAAA,MACH;AAGA,UAAI,KAAK,WAAW,kBAAkB;AACpC;AAAA,MACF;AAEA,YAAM,MAAiD;AAAA,QACrD,KAAK,GAAG,KAAK,eAAgB,IAAI,GAAG,kBAAkB,KAAK,MAAM,IAAI,CAAC;AAAA,QACtE,QAAQ,KAAK,eAAgB;AAAA,QAC7B,OAAO,KAAK,QAAQ,SAAS;AAAA,QAC7B,OAAO,KAAK,MAAM;AAAA,QAClB,yBAAyB;AAAA,MAAA;AAG3B,YAAM,KAAK,eAAe,GAAG;AAAA,IAC/B,OAAO;AACL,WAAK,wBAAwB;AAE7B,YAAM,cAAc,KAAK,eAAA;AAEzB,UAAI,aAAa;AACf,aAAK,OAAO,aAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAY,qBAAqB;AAC/B,WAAO,KAAK,OAAO,cAAc,YAAY,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AACR,SAAK,cAAc;AACnB,SAAK,WAAA;AACL,SAAK,WAAW;AAChB,SAAK,iBAAA;AACL,SAAK,iBAAiB;AAAA,EACxB;AACF;AAEO,MAAM,cAAc,CAMzB,MACA,WACG,IAAI,MAAwD,MAAM,MAAM;ACjwB7E,MAAMA,gBAA2D;AAAA,EAC/D,CAAC,UAAU,YAAY,cAAc,aAAa;AAAA,EAClD,CAAC,WAAW,SAAS,QAAQ;AAC/B;AAOO,MAAM,WAEb;AAAA,EAGE,YACE,QACQ,aACR;AADQ,SAAA,cAAA;AAER,SAAK,SAAS;AAEd,oBAAgB,MAAMA,aAAW;AAAA,EACnC;AAAA,EALU;AAAA,EAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,WAAoB;AACtB,UAAM,SAAS,OAAO,OAAO,KAAK,MAAM;AACxC,WAAO,OAAO;AAAA,MACZ,CAAC,UACC,MAAM,YACL,uBAAuB,SAAS,MAAM;AAAA,IAAA;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,aAAyC;AAC3C,WAAQ,KAAK,eACX,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MACzB,CAAC,UAAU,aAAa,SAAS,MAAM;AAAA,IAAA;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAuB;AACzB,QAAI,KAAK,WAAY,QAAO;AAE5B,eAAW,aAAa,KAAK,QAAQ;AACnC,YAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,UAAI,iBAAiB,cAAc,MAAM,aAAa;AACpD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,MAAa;AACnB,QAAI,KAAK,cAAc,UAAU,KAAK,YAAY;AAChD,WAAK,WAAW,KAAK,GAAG,IAAI;AAC5B;AAAA,IACF;AAEA,eAAW,aAAa,KAAK,QAAQ;AACnC,YAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,UAAI,iBAAiB,cAAc,MAAM,aAAa;AACpD,cAAM,KAAK,GAAG,IAAI;AAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,cAAQ;AAAA,QACN;AAAA,MAAA;AAAA,IAIJ,OAAO;AACL,cAAQ,KAAK,yCAAyC;AAAA,IACxD;AAAA,EACF;AACF;AAOO,MAAM,cAAc,CACzB,QACA,eACG,IAAI,WAA8B,QAAQ,UAAU;ACxGzD,MAAMA,gBAAuD;AAAA,EAC3D,CAAC,SAAS,QAAQ,UAAU;AAC9B;AAOO,MAAM,OAAmD;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAgD;AAC1D,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,WAAW,YAAY,MAAM;AACnD,SAAK,QAAQ,OAAO,eAAe,YAAY,MAAM;AAErD,oBAAgB,MAAMA,aAAW;AAAA,EACnC;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,SAAS,KAAa,SAAiC;AACrD,UAAM,QACH,SAAS,cAAc,YAAY,IAAA,EAAM,aACtC,EAAE,GAAG,KAAK,MAAM,MAAM,GAAG,SAAS,MAAA,IAClC,EAAE,GAAG,SAAS,MAAA;AAEpB,UAAM,eAAe,kBAAkB,KAAK;AAC5C,UAAM,gBAAgB,GAAG,GAAG,GAAG,YAAY;AAE3C,QAAI,SAAS,SAAS;AACpB,WAAK,QAAQ,QAAQ,eAAe,SAAS,KAAK;AAAA,IACpD,OAAO;AACL,WAAK,QAAQ,KAAK,eAAe,SAAS,KAAK;AAAA,IACjD;AAAA,EACF;AACF;AAEO,MAAM,eAAe,CAC1B,WACG,IAAI,OAAO,MAAM;ACvCtB,MAAM,cAA6D;AAAA,EACjE,CAAC,YAAY,QAAQ;AAAA,EACrB,CAAC,WAAW,KAAK,UAAU,OAAO,eAAe,eAAe;AAAA,EAChE,CAAC,UAAU,YAAY,aAAa,WAAW;AAAA,EAC/C,CAAC,QAAQ,kBAAkB,QAAQ,SAAS,SAAS;AACvD;AAOO,MAAM,aAIb;AAAA,EA8BE,YAAsB,SAA6C,IAAI;AAAjD,SAAA,SAAA;AACpB,SAAK,QAAQ,OAAO,eAAe,YAAY,MAAM;AACrD,SAAK,SAAS,aAAa,OAAO,eAAe,IAAI,KAAK;AAC1D,SAAK,cAAc,OAAO;AAC1B,SAAK,oBAAoB;AACzB,SAAK,gBAAgB,KAAK,cAAc,IAAI;AAC5C,SAAK,SAAS,KAAK,gBAAgB,WAAW;AAE9C,oBAAgB,MAAM,WAAW;AAEjC,QAAI,KAAK,OAAO,aAAa,SAAS;AACpC,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,WAAW;AAAA,QACd,MAAM,KAAK,cAAc,IAAI;AAAA,QAC7B,OAAO,CAAC,kBAAkB;AACxB,eAAK,gBAAgB;AAErB,cACE,KAAK,qBACL,KAAK,WAAW,aAChB,KAAK,WAAW,WAChB;AACA;AAAA,UACF;AAEA,cAAI,KAAK,eAAe;AACtB,gBAAI,KAAK,WAAW,UAAU;AAC5B;AAAA,YACF;AACA,iBAAK,KAAK,eAAe;AAAA,cACvB,QAAQ,KAAK,UAAU;AAAA,cACvB,GAAG,KAAK,OAAO,oBAAoB,IAAI;AAAA,YAAA,CACxC;AAAA,UACH,OAAO;AACL,gBAAI,KAAK,WAAW,YAAY,KAAK,WAAW,WAAW;AACzD;AAAA,YACF;AACA,iBAAK,KAAK,eAAA;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,QACD,EAAE,QAAQ,KAAK,OAAO,aAAa,iBAAiB,KAAA;AAAA,MAAK;AAE3D,WAAK,iBAAiB;AAAA,QACpB,MAAM;AACJ,cAAI,KAAK,WAAW,SAAU,QAAO;AACrC,iBAAO,KAAK,MAAM;AAAA,QACpB;AAAA,QACA,CAAC,OAAO,cAAc;AACpB,cAAI,cAAc,OAAW;AAC7B,cAAI,UAAU,OAAW;AACzB,eAAK,OAAO,cAAc,KAAK,QAAQ,IAAI;AAAA,QAC7C;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,QAAQ,KAAK,OAAO;AAAA,UACpB,QAAQ,SAAS;AAAA,QAAA;AAAA,MACnB;AAAA,IAEJ;AAEA,QAAI,KAAK,WAAW,UAAU;AAC5B,WAAK,OAAO,YAAY,KAAK,QAAQ,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA,EAhEsB;AAAA,EA7Bd;AAAA,EACA;AAAA,EAER;AAAA,EACA;AAAA,EAEU;AAAA,EAQF;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,WAAW;AAAA,EAEX;AAAA;AAAA;AAAA;AAAA,EAKR;AAAA;AAAA;AAAA;AAAA,EAuEA,IAAI,WAAW;AACb,WACE,CAAC,KAAK,eACN,KAAK,WAAW,YAChB,KAAK,kBAAkB;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,aACA;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAaA,MAAM,QAAQ,MAAa;AACzB,UAAM,SAAU,KAAK,CAAC,KAAK;AAC3B,UAAM,QAAuC,KAAK,CAAC;AAEnD,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,oBAAoB;AAEzB,SAAK,MAAM;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IAAA;AAGV,UAAM,KAAK,eAAe,KAAK,GAAG;AAElC,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ;AACZ,SAAK,oBAAoB;AACzB,UAAM,SAAS,MAAM,KAAK,eAAA;AAC1B,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,KAAsB;AACjD,gBAAY,MAAM;AAChB,WAAK,MAAM;AACX,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,QAAK,MAAM,KAAK,OAAO,aAAa,IAAI,QAAQ,IAAI,MAAO,OAAO;AAChE,kBAAY,MAAM;AAChB,aAAK,SAAS;AACd,aAAK,MAAM;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,QAAK,MAAM,KAAK,OAAO,OAAO,IAAI,QAAQ,IAAI,MAAO,OAAO;AAC1D,kBAAY,MAAM;AAChB,aAAK,SAAS;AACd,aAAK,MAAM;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,gBAAY,MAAM;AAChB,UAAI,IAAI,OAAO,OAAO;AACpB,aAAK,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO;AAAA,MACtD;AAEA,WAAK,MAAM;AACX,WAAK,SAAS,IAAI;AAClB,WAAK,SAAS;AAEd,UAAI,KAAK,UAAU;AACjB,aAAK,WAAW;AAChB,aAAK,OAAO,cAAc,KAAK,QAAS,IAAI;AAAA,MAC9C,OAAO;AACL,aAAK,OAAO,YAAY,KAAK,QAAS,IAAI;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB;AAC7B,QAAI,KAAK,WAAW,UAAU;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK;AAExB,gBAAY,MAAM;AAChB,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,QAAK,MAAM,KAAK,OAAO,cAAA,MAAqB,OAAO;AACjD,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,OAAO;AACvC,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AACD;AAAA,IACF;AAEA,gBAAY,MAAM;AAChB,WAAK,SAAS;AACd,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,SAAK,OAAO,aAAA;AAEZ,WAAO;AAAA,EACT;AAAA,EAEA,UAAU;AACR,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,WAAA;AACL,SAAK,iBAAA;AAAA,EACP;AACF;AAEO,MAAM,qBAAqB,CAIhC,WACG,IAAI,aAAoC,MAAM;"}
@@ -511,10 +511,7 @@ class Route {
511
511
  this.updateDisposer = void 0;
512
512
  }
513
513
  }
514
- const createRoute = (path, config) => new Route(
515
- path,
516
- config
517
- );
514
+ const createRoute = (path, config) => new Route(path, config);
518
515
  const annotations$2 = [
519
516
  [mobx.computed, "isOpened", "indexRoute", "canNavigate"],
520
517
  [mobx.observable.shallow, "routes"]
@@ -823,4 +820,4 @@ exports.createRouter = createRouter;
823
820
  exports.createVirtualRoute = createVirtualRoute;
824
821
  exports.groupRoutes = groupRoutes;
825
822
  exports.routeConfig = routeConfig;
826
- //# sourceMappingURL=virtual-route-B_X_wClE.cjs.map
823
+ //# sourceMappingURL=virtual-route-DCnOqDz5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-route-DCnOqDz5.cjs","sources":["../src/core/config/config.ts","../src/core/route/route.ts","../src/core/route-group/route-group.ts","../src/core/router/router.ts","../src/core/virtual-route/virtual-route.ts"],"sourcesContent":["import {\n createBrowserHistory,\n createQueryParams,\n type History,\n type IQueryParams,\n isObservableHistory,\n} from 'mobx-location-history';\nimport { createGlobalDynamicConfig } from 'yummies/complex';\n\nimport type { RouteGlobalConfig } from './config.types.js';\n\nexport const routeConfig = createGlobalDynamicConfig<RouteGlobalConfig>(\n (update, current) => {\n let history: History;\n let queryParams: IQueryParams | undefined;\n\n if (update?.history) {\n history = update.history;\n queryParams = update.queryParams;\n\n if (current?.history && isObservableHistory(current.history)) {\n current.history.destroy();\n }\n } else if (current?.history) {\n history = current.history;\n queryParams = update?.queryParams ?? current.queryParams;\n } else {\n history = createBrowserHistory();\n }\n\n queryParams ??= createQueryParams({ history });\n\n return {\n ...update,\n history,\n queryParams,\n };\n },\n Symbol.for('MOBX_ROUTE_CONFIG'),\n);\n","import { comparer, computed, observable, reaction, runInAction } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport {\n compile,\n match,\n type ParamData,\n parse,\n type TokenData,\n} from 'path-to-regexp';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AnyRoute,\n CreatedUrlOutputParams,\n InputPathParams,\n NavigationTrx,\n ParsedPathData,\n ParsedPathParams,\n RouteConfiguration,\n RouteNavigateParams,\n UrlCreateParams,\n} from './route.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<Route<any, any, any, any>> = [\n [\n computed,\n 'isPathMatched',\n 'isOpened',\n 'isOpening',\n 'path',\n 'absolutePath',\n 'hasOpenedChildren',\n 'isAbleToMergeQuery',\n 'baseUrl',\n ],\n [computed.struct, 'parsedPathData', 'params'],\n [observable, 'children'],\n [observable.ref, 'parent', 'status'],\n];\n\n/**\n * Class for creating path based route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html)\n */\nexport class Route<\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TQueryParams extends Record<string, any> = AnyObject,\n> {\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n protected history: History;\n\n /**\n * Parent route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#parent)\n */\n parent: AnyRoute | null;\n\n query: IQueryParams;\n\n private _tokenData: TokenData | undefined;\n private _matcher?: ReturnType<typeof match>;\n private _compiler?: ReturnType<typeof compile>;\n private ignoreOpenByPathMatch = false;\n private isUpdate = false;\n private updateDisposer?: VoidFunction;\n\n protected status:\n | 'opening'\n | 'closed'\n | 'open-rejected'\n | 'open-confirmed'\n | 'unknown';\n\n meta?: AnyObject;\n\n /**\n * Route path pattern declaration.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#pathdeclaration)\n */\n pathDeclaration: TPath;\n\n /**\n * Indicates if this route is an index route. Index routes activate when parent route path matches exactly.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isindex)\n */\n isIndex: boolean;\n\n /**\n * Indicates if this route is an hash route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#ishash)\n */\n isHash: boolean;\n\n /**\n * Array of child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#children)\n */\n children: AnyRoute[] = [];\n\n constructor(\n pathDeclaration: TPath,\n protected config: RouteConfiguration<\n TPath,\n TInputParams,\n TOutputParams,\n TQueryParams\n > = {},\n ) {\n this.history = config.history ?? routeConfig.get().history;\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n this.pathDeclaration = pathDeclaration;\n this.isIndex = !!this.config.index;\n this.isHash = !!this.config.hash;\n this.meta = this.config.meta;\n this.status = 'unknown';\n this.parent = config.parent ?? null;\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(() => this.isPathMatched, this.checkPathMatch, {\n fireImmediately: true,\n });\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'open-confirmed') return undefined;\n return [this.parsedPathData, this.query.data] as const;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n if (!this.parsedPathData) return;\n this.config.afterUpdate?.(this.parsedPathData, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n this.config.abortSignal?.addEventListener('abort', () => this.destroy(), {\n once: true,\n });\n }\n }\n\n protected get baseUrl() {\n const baseUrl = this.config.baseUrl ?? routeConfig.get().baseUrl;\n return baseUrl?.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n }\n\n /**\n * Checks whether current route matches provided path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#matchpath)\n */\n matchPath(path?: Maybe<string>): ParsedPathData<TPath> | null {\n let pathnameToCheck: string;\n\n if (path != null) {\n pathnameToCheck = path;\n } else if (this.isHash) {\n pathnameToCheck = this.history.location.hash.slice(1);\n } else {\n pathnameToCheck = this.history.location.pathname;\n }\n\n if (this.baseUrl) {\n if (!pathnameToCheck.startsWith(this.baseUrl)) {\n return null;\n }\n\n pathnameToCheck = pathnameToCheck.replace(this.baseUrl, '');\n }\n\n if (\n (this.pathDeclaration === '' || this.pathDeclaration === '/') &&\n (pathnameToCheck === '/' || pathnameToCheck === '')\n ) {\n return { params: {} as any, path: pathnameToCheck };\n }\n\n this._matcher ??= match(this.tokenData, {\n end: this.config.exact ?? false,\n ...this.config.matchOptions,\n });\n const parsed = this._matcher(pathnameToCheck);\n\n if (parsed === false) {\n return null;\n }\n\n return parsed as ParsedPathData<TPath>;\n }\n\n protected get parsedPathData(): ParsedPathData<TPath> | null {\n return this.matchPath();\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopening)\n *\n * Also true in the short gap after history already matches this route but\n * `confirmOpening` has not started yet (e.g. browser Back) — otherwise every\n * route looks closed for one tick and RouteViewGroup unmounts the page.\n */\n get isOpening() {\n if (this.status === 'opening') {\n return true;\n }\n\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status === 'open-confirmed' ||\n this.status === 'open-rejected'\n ) {\n return false;\n }\n\n return this.status === 'closed' || this.status === 'unknown';\n }\n\n /**\n * Matched path segment for current URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#path)\n */\n get path(): string | null {\n return this.parsedPathData?.path ?? null;\n }\n\n /**\n * Matched path segment for current URL with base URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#absolutepath)\n */\n get absolutePath(): string | null {\n const path = this.path;\n\n if (path === null) {\n return null;\n }\n\n return `${this.baseUrl || ''}${path}`;\n }\n\n /**\n * Current parsed path parameters.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#params)\n */\n get params(): TOutputParams | null {\n if (!this.parsedPathData?.params) {\n return null;\n }\n\n if (this.config.params) {\n const result = this.config.params(\n this.parsedPathData.params,\n this.config.meta,\n );\n return result || null;\n }\n\n return (\n (this.parsedPathData?.params as unknown as Maybe<TOutputParams>) ?? null\n );\n }\n\n protected get isPathMatched() {\n return this.parsedPathData !== null;\n }\n\n /**\n * Defines the \"open\" state for this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopened)\n */\n get isOpened() {\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status !== 'open-confirmed'\n ) {\n return false;\n }\n\n return (\n // this.parsedPathData is defined because this.params !== null\n !this.config.checkOpened || this.config.checkOpened(this.parsedPathData!)\n );\n }\n\n /**\n * Allows to create child route based on this route with merging this route path and extending path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#extend)\n */\n extend<\n TExtendedPath extends string,\n TExtendedInputParams extends\n InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedOutputParams extends AnyObject = TInputParams &\n ParsedPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedQueryParams extends Record<string, any> = TQueryParams,\n >(\n pathDeclaration: TExtendedPath,\n config?: Omit<\n RouteConfiguration<\n `${TPath}${TExtendedPath}`,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n TExtendedQueryParams\n >,\n 'parent'\n >,\n ) {\n type ExtendedRoutePath = `${TPath}${TExtendedPath}`;\n const { index, params, exact, ...configFromCurrentRoute } = this.config;\n\n const extendedChild = new Route<\n ExtendedRoutePath,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n TExtendedQueryParams\n >(`${this.pathDeclaration}${pathDeclaration}`, {\n ...configFromCurrentRoute,\n ...config,\n parent: this,\n } as any);\n\n this.addChildren(extendedChild as any);\n\n return extendedChild;\n }\n\n /**\n * Manually add child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#addchildren)\n */\n addChildren(...routes: AnyRoute[]) {\n this.children.push(...routes);\n }\n\n /**\n * Remove specified routes from children.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#removechildren)\n */\n removeChildren(...routes: AnyRoute[]) {\n this.children = this.children.filter((child) => !routes.includes(child));\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#hasopenedchildren)\n */\n get hasOpenedChildren(): boolean {\n return this.children.some(\n (child) => child.isOpened || child.hasOpenedChildren,\n );\n }\n\n protected processParams(\n params?: TInputParams | null | undefined,\n ): ParamData | undefined {\n if (params == null) return undefined;\n\n const result: ParamData = {};\n for (const [key, value] of Object.entries(params)) {\n if (value != null) {\n result[key] = Array.isArray(value) ? value.map(String) : String(value);\n }\n }\n return result;\n }\n\n /**\n * Generates full route URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl)\n */\n createUrl(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: Maybe<TInputParams>,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n : [\n params: TInputParams,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n ) {\n const params = args[0];\n const rawQuery = args[1];\n const mergeQueryOrOutputParams = args[2] ?? this.isAbleToMergeQuery;\n const outputParams: Maybe<CreatedUrlOutputParams> =\n typeof mergeQueryOrOutputParams === 'boolean'\n ? { mergeQuery: mergeQueryOrOutputParams }\n : mergeQueryOrOutputParams;\n\n const query = outputParams?.mergeQuery\n ? ({ ...this.query.data, ...rawQuery } as Partial<TQueryParams>)\n : ((rawQuery ?? {}) as Partial<TQueryParams>);\n\n this._compiler ??= compile(this.tokenData);\n\n const defaultUrlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n {\n baseUrl: this.baseUrl,\n params: params as TInputParams,\n query,\n };\n const urlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n this.config.createUrl?.(defaultUrlCreateParams, this.query.data) ??\n routeConfig.get().createUrl?.(defaultUrlCreateParams, this.query.data) ??\n defaultUrlCreateParams;\n\n let path: string;\n\n try {\n path = this._compiler(this.processParams(urlCreateParams.params));\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'Error #1: Route path compilation failed\\n' +\n 'The path pattern could not be built into a URL (often missing or invalid params for a `:param` segment). Using fallbackPath or \"/\".\\n' +\n 'See docs: https://js2me.github.io/mobx-route/errors/1',\n e,\n );\n } else {\n console.error('minified error #1;see mobx-route docs', e);\n }\n path = this.config.fallbackPath ?? routeConfig.get().fallbackPath ?? '/';\n }\n\n const url = `${urlCreateParams.baseUrl || ''}${this.isHash ? '#' : ''}${path}`;\n\n if (outputParams?.omitQuery) {\n return url;\n }\n\n return `${url}${buildSearchString(urlCreateParams.query)}`;\n }\n\n /**\n * Navigates to this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#open)\n */\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n : [\n params: TInputParams,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n ): Promise<void>;\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n : [\n params: TInputParams,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n ): Promise<void>;\n open(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n open(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async open(...args: any[]) {\n const {\n replace,\n state: rawState,\n query: rawQuery,\n mergeQuery: rawMergeQuery,\n } = typeof args[1] === 'boolean' || args.length > 2\n ? ({\n replace: args[1],\n query: args[2],\n } as RouteNavigateParams<TQueryParams>)\n : ((args[1] ?? {}) as RouteNavigateParams<TQueryParams>);\n\n const mergeQuery = rawMergeQuery ?? this.isAbleToMergeQuery;\n const query = (\n mergeQuery ? { ...this.query.data, ...rawQuery } : rawQuery\n ) as Partial<TQueryParams> | undefined;\n\n const params = typeof args[0] === 'string' ? undefined : args[0];\n const url =\n typeof args[0] === 'string' ? args[0] : this.createUrl(args[0], query);\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url,\n params: params as TInputParams,\n replace,\n state: rawState ?? null,\n query,\n };\n\n this.isUpdate = this.status === 'open-confirmed';\n this.ignoreOpenByPathMatch = true;\n const isConfirmed = await this.confirmOpening(trx);\n\n if (isConfirmed !== true) {\n this.ignoreOpenByPathMatch = false;\n this.isUpdate = false;\n }\n }\n\n /**\n * Updates the current route if it is already open.\n * Unlike `open`, this is a no-op if the route is not open,\n * defaults to `replace: true` instead of push,\n * and defaults to `mergeQuery: true` when no query params are provided.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#update)\n */\n update(\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n update(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async update(...args: any[]) {\n if (this.status !== 'open-confirmed') {\n return;\n }\n\n // Reuse current path params when omitted\n if (args[0] == null) {\n args[0] = this.parsedPathData?.params;\n }\n\n const secondArg = args[1];\n const isObjectParams = typeof secondArg === 'object' && secondArg !== null;\n\n if (isObjectParams) {\n args[1] = {\n replace: true,\n ...('query' in secondArg ? {} : { mergeQuery: true }),\n ...secondArg,\n };\n } else if (typeof secondArg === 'boolean') {\n if (args[2] === undefined) {\n args[1] = { replace: secondArg, mergeQuery: true };\n args.length = 2;\n }\n } else if (args.length === 1) {\n args[1] = { replace: true, mergeQuery: true };\n }\n\n return (this.open as (...args: any[]) => Promise<void>)(...args);\n }\n\n protected get tokenData() {\n if (!this._tokenData) {\n this._tokenData = parse(this.pathDeclaration, this.config.parseOptions);\n }\n return this._tokenData;\n }\n\n protected async confirmOpening(\n trx: NavigationTrx<TInputParams, TQueryParams>,\n ) {\n if (!this.isUpdate) {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n let skipHistoryUpdate = !!trx.preferSkipHistoryUpdate;\n\n if (skipHistoryUpdate) {\n this.ignoreOpenByPathMatch = false;\n }\n\n if (this.config.beforeOpen) {\n const feedback = await this.config.beforeOpen(trx);\n\n if (feedback === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n });\n\n return;\n }\n\n // Rebuild URL if beforeOpen mutated trx.params\n const newUrl = this.createUrl(\n trx.params as TInputParams,\n trx.query as AnyObject,\n );\n if (newUrl !== trx.url) {\n trx.url = newUrl;\n skipHistoryUpdate = false;\n }\n\n if (typeof feedback === 'object') {\n skipHistoryUpdate = false;\n Object.assign(trx, feedback);\n }\n }\n\n if (this.isDestroyed) {\n return;\n }\n\n if (!skipHistoryUpdate) {\n if (trx.replace) {\n this.history.replace(trx.url, trx.state);\n } else {\n this.history.push(trx.url, trx.state);\n }\n }\n\n if (this.isPathMatched) {\n const wasAlreadyConfirmed = this.status === 'open-confirmed';\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n\n if (this.isUpdate) {\n this.isUpdate = false;\n // afterUpdate handled by updateDisposer reaction\n } else if (!wasAlreadyConfirmed) {\n this.config.afterOpen?.(this.parsedPathData!, this);\n }\n }\n\n return true;\n }\n\n protected confirmClosing() {\n runInAction(() => {\n this.status = 'closed';\n });\n return true;\n }\n\n private firstPathMatchingRun = true;\n\n private checkPathMatch = async (isPathMathched: boolean) => {\n if (this.firstPathMatchingRun) {\n this.firstPathMatchingRun = false;\n // ignore first 'afterClose' callback call\n if (!isPathMathched) {\n return;\n }\n }\n\n if (isPathMathched) {\n // after manual open call\n if (this.ignoreOpenByPathMatch) {\n this.ignoreOpenByPathMatch = false;\n if (this.status === 'opening' && this.parsedPathData) {\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.parsedPathData, this);\n } else {\n this.config.afterOpen?.(this.parsedPathData, this);\n }\n }\n // update() delegates to confirmOpening\n return;\n }\n\n // Set opening sync to avoid isOpened/isOpening flicker\n if (this.status !== 'opening' && this.status !== 'open-confirmed') {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n // already confirmed\n if (this.status === 'open-confirmed') {\n return;\n }\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url: `${this.parsedPathData!.path}${buildSearchString(this.query.data)}`,\n params: this.parsedPathData!.params as TInputParams,\n state: this.history.location.state,\n query: this.query.data as Partial<TQueryParams>,\n preferSkipHistoryUpdate: true,\n };\n\n await this.confirmOpening(trx);\n } else {\n this.ignoreOpenByPathMatch = false;\n\n const isConfirmed = this.confirmClosing();\n\n if (isConfirmed) {\n this.config.afterClose?.();\n }\n }\n };\n\n private get isAbleToMergeQuery() {\n return this.config.mergeQuery ?? routeConfig.get().mergeQuery;\n }\n\n /**\n * Destroys route subscriptions and reactions.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#destroy)\n */\n destroy() {\n this.isDestroyed = true;\n this.disposer?.();\n this.disposer = undefined;\n this.updateDisposer?.();\n this.updateDisposer = undefined;\n }\n}\n\nexport const createRoute = <\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n path: TPath,\n config?: RouteConfiguration<TPath, TInputParams, TOutputParams, TQueryParams>,\n) => new Route<TPath, TInputParams, TOutputParams, TQueryParams>(path, config);\n","import { computed, observable } from 'mobx';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type {\n AbstractRouteGroup,\n AnyRouteEntity,\n RoutesCollection,\n} from './route-group.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<RouteGroup<any>> = [\n [computed, 'isOpened', 'indexRoute', 'canNavigate'],\n [observable.shallow, 'routes'],\n];\n\n/**\n * Class for grouping related routes and managing their state.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport class RouteGroup<TRoutesCollection extends RoutesCollection>\n implements AbstractRouteGroup<TRoutesCollection>\n{\n routes: TRoutesCollection;\n\n constructor(\n routes: TRoutesCollection,\n private _indexRoute?: AnyRouteEntity,\n ) {\n this.routes = routes;\n\n applyObservable(this, annotations);\n }\n\n /**\n * Returns true if at least one route in the group is open.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#isopened)\n */\n get isOpened(): boolean {\n const routes = Object.values(this.routes);\n return routes.some(\n (route) =>\n route.isOpened ||\n ('hasOpenedChildren' in route && route.hasOpenedChildren),\n );\n }\n\n /**\n * First found index route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#indexroute)\n */\n get indexRoute(): AnyRouteEntity | undefined {\n return (this._indexRoute ??\n Object.values(this.routes).find(\n (route) => 'isIndex' in route && route.isIndex,\n )) as unknown as AnyRouteEntity;\n }\n\n /**\n * `true` if `open()` has a target to navigate to —\n * either an own index route or a nested `RouteGroup` that itself can navigate.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#cannavigate)\n */\n get canNavigate(): boolean {\n if (this.indexRoute) return true;\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Main navigation method for the group.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#open)\n */\n open(...args: any[]) {\n if (this.indexRoute && 'open' in this.indexRoute) {\n this.indexRoute.open(...args);\n return;\n }\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n route.open(...args);\n return;\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Warning #1: RouteGroup.open() cannot navigate\\n' +\n 'This group has no index route (`index: true` or `groupRoutes(routes, indexRoute)`) and no navigable nested RouteGroup, so open() does nothing.\\n' +\n 'See docs: https://js2me.github.io/mobx-route/warnings/1',\n );\n } else {\n console.warn('minified warning #1;see mobx-route docs');\n }\n }\n}\n\n/**\n * Helper for creating route groups.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport const groupRoutes = <TRoutesCollection extends RoutesCollection>(\n routes: TRoutesCollection,\n indexRoute?: AnyRouteEntity,\n) => new RouteGroup<TRoutesCollection>(routes, indexRoute);\n","import { computed } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport { routeConfig } from '../config/index.js';\nimport type { RoutesCollection } from '../route-group/index.js';\nimport type {\n RouterConfiguration,\n RouterNavigateOptions,\n} from './router.types.js';\n\nconst annotations: ObservableAnnotationsArray<Router<any>> = [\n [computed.struct, 'location'],\n];\n\n/**\n * Class for centralized routing management.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Router.html)\n */\nexport class Router<TRoutesCollection extends RoutesCollection> {\n routes: TRoutesCollection;\n history: History;\n query: IQueryParams;\n\n constructor(config: RouterConfiguration<TRoutesCollection>) {\n this.routes = config.routes;\n this.history = config.history ?? routeConfig.get().history;\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n\n applyObservable(this, annotations);\n }\n\n get location() {\n return this.history.location;\n }\n\n navigate(url: string, options?: RouterNavigateOptions) {\n const query =\n (options?.mergeQuery ?? routeConfig.get().mergeQuery)\n ? { ...this.query.data, ...options?.query }\n : { ...options?.query };\n\n const searchString = buildSearchString(query);\n const navigationUrl = `${url}${searchString}`;\n\n if (options?.replace) {\n this.history.replace(navigationUrl, options?.state);\n } else {\n this.history.push(navigationUrl, options?.state);\n }\n }\n}\n\nexport const createRouter = <TRoutesCollection extends RoutesCollection>(\n config: RouterConfiguration<TRoutesCollection>,\n) => new Router(config);\n","import {\n action,\n comparer,\n computed,\n observable,\n reaction,\n runInAction,\n} from 'mobx';\nimport type { IQueryParams } from 'mobx-location-history';\nimport { callFunction } from 'yummies/common';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, EmptyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AbstractVirtualRoute,\n VirtualOpenExtraParams,\n VirtualRouteConfiguration,\n VirtualRouteTrx,\n} from './virtual-route.types.js';\n\nconst annotations: ObservableAnnotationsArray<VirtualRoute<any>> = [\n [observable, 'params'],\n [observable.ref, 'status', 'trx', 'openChecker', 'isOuterOpened'],\n [computed, 'isOpened', 'isOpening', 'isClosing'],\n [action, 'setOpenChecker', 'open', 'close', 'destroy'],\n];\n\n/**\n * Class for creating routes with custom activation logic\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html)\n */\nexport class VirtualRoute<\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n> implements AbstractVirtualRoute<TParams, TQueryParams>\n{\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n query: IQueryParams;\n params: TParams | null;\n\n protected status:\n | 'opening'\n | 'open-rejected'\n | 'opened'\n | 'closing'\n | 'closed'\n | 'unknown';\n\n private openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>;\n\n private trx: Maybe<VirtualRouteTrx>;\n\n private skipAutoOpenClose: boolean;\n\n private isUpdate = false;\n\n private updateDisposer?: VoidFunction;\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isouteropened)\n */\n isOuterOpened: boolean | undefined;\n\n constructor(protected config: VirtualRouteConfiguration<TParams> = {}) {\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n this.params = callFunction(config.initialParams, this) ?? null;\n this.openChecker = config.checkOpened;\n this.skipAutoOpenClose = false;\n this.isOuterOpened = this.openChecker?.(this);\n this.status = this.isOuterOpened ? 'opened' : 'unknown';\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(\n () => this.openChecker?.(this),\n action((isOuterOpened) => {\n this.isOuterOpened = isOuterOpened;\n\n if (\n this.skipAutoOpenClose ||\n this.status === 'closing' ||\n this.status === 'opening'\n ) {\n return;\n }\n\n if (this.isOuterOpened) {\n if (this.status === 'opened') {\n return;\n }\n void this.confirmOpening({\n params: this.params ?? null,\n ...this.config.getAutoOpenParams?.(this),\n });\n } else {\n if (this.status === 'closed' || this.status === 'unknown') {\n return;\n }\n void this.confirmClosing();\n }\n }),\n { signal: this.config.abortSignal, fireImmediately: true },\n );\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'opened') return undefined;\n return this.query.data;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n this.config.afterUpdate?.(this.params, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n }\n\n if (this.status === 'opened') {\n this.config.afterOpen?.(this.params, this);\n }\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopened)\n */\n get isOpened() {\n return (\n !this.isDestroyed &&\n this.status === 'opened' &&\n this.isOuterOpened !== false\n );\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopening)\n */\n get isOpening() {\n return this.status === 'opening';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isclosing)\n */\n get isClosing() {\n return this.status === 'closing';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#setopenchecker)\n */\n setOpenChecker(\n openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>,\n ) {\n this.openChecker = openChecker;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#open)\n */\n open(\n ...args: IsPartial<TParams> extends true\n ? [\n params?: Maybe<TParams>,\n extraParams?: VirtualOpenExtraParams<TQueryParams>,\n ]\n : [params: TParams, extraParams?: VirtualOpenExtraParams<TQueryParams>]\n ): Promise<void>;\n async open(...args: any[]) {\n const params = (args[0] ?? null) as unknown as TParams;\n const extra: Maybe<VirtualOpenExtraParams> = args[1];\n\n this.isUpdate = this.status === 'opened';\n this.skipAutoOpenClose = true;\n\n this.trx = {\n params,\n extra,\n manual: true,\n };\n\n await this.confirmOpening(this.trx);\n\n this.skipAutoOpenClose = false;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#close)\n */\n async close() {\n this.skipAutoOpenClose = true;\n const result = await this.confirmClosing();\n this.skipAutoOpenClose = false;\n return result;\n }\n\n private async confirmOpening(trx: VirtualRouteTrx) {\n runInAction(() => {\n this.trx = undefined;\n this.status = 'opening';\n });\n\n if ((await this.config.beforeOpen?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n if ((await this.config.open?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n runInAction(() => {\n if (trx.extra?.query) {\n this.query.update(trx.extra.query, trx.extra.replace);\n }\n\n this.trx = undefined;\n this.params = trx.params;\n this.status = 'opened';\n\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.params!, this);\n } else {\n this.config.afterOpen?.(this.params!, this);\n }\n });\n\n return true;\n }\n\n private async confirmClosing() {\n if (this.status === 'closed') {\n return true;\n }\n\n const lastStatus = this.status;\n\n runInAction(() => {\n this.status = 'closing';\n });\n\n if ((await this.config.beforeClose?.()) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n if (this.config.close?.(this) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n runInAction(() => {\n this.status = 'closed';\n this.params = null;\n });\n\n this.config.afterClose?.();\n\n return true;\n }\n\n destroy() {\n this.isDestroyed = true;\n this.status = 'unknown';\n this.disposer?.();\n this.updateDisposer?.();\n }\n}\n\nexport const createVirtualRoute = <\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n config?: VirtualRouteConfiguration<TParams>,\n) => new VirtualRoute<TParams, TQueryParams>(config);\n"],"names":["createGlobalDynamicConfig","isObservableHistory","createBrowserHistory","createQueryParams","annotations","computed","observable","applyObservable","reaction","comparer","match","compile","buildSearchString","parse","runInAction","action","callFunction"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"virtual-route-B_X_wClE.cjs","sources":["../src/core/config/config.ts","../src/core/route/route.ts","../src/core/route-group/route-group.ts","../src/core/router/router.ts","../src/core/virtual-route/virtual-route.ts"],"sourcesContent":["import {\n createBrowserHistory,\n createQueryParams,\n type History,\n type IQueryParams,\n isObservableHistory,\n} from 'mobx-location-history';\nimport { createGlobalDynamicConfig } from 'yummies/complex';\n\nimport type { RouteGlobalConfig } from './config.types.js';\n\nexport const routeConfig = createGlobalDynamicConfig<RouteGlobalConfig>(\n (update, current) => {\n let history: History;\n let queryParams: IQueryParams | undefined;\n\n if (update?.history) {\n history = update.history;\n queryParams = update.queryParams;\n\n if (current?.history && isObservableHistory(current.history)) {\n current.history.destroy();\n }\n } else if (current?.history) {\n history = current.history;\n queryParams = update?.queryParams ?? current.queryParams;\n } else {\n history = createBrowserHistory();\n }\n\n queryParams ??= createQueryParams({ history });\n\n return {\n ...update,\n history,\n queryParams,\n };\n },\n Symbol.for('MOBX_ROUTE_CONFIG'),\n);\n","import { comparer, computed, observable, reaction, runInAction } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport {\n compile,\n match,\n type ParamData,\n parse,\n type TokenData,\n} from 'path-to-regexp';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AnyRoute,\n CreatedUrlOutputParams,\n InputPathParams,\n NavigationTrx,\n ParsedPathData,\n ParsedPathParams,\n RouteConfiguration,\n RouteNavigateParams,\n UrlCreateParams,\n} from './route.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<Route<any, any, any, any, any>> =\n [\n [\n computed,\n 'isPathMatched',\n 'isOpened',\n 'isOpening',\n 'path',\n 'absolutePath',\n 'hasOpenedChildren',\n 'isAbleToMergeQuery',\n 'baseUrl',\n ],\n [computed.struct, 'parsedPathData', 'params'],\n [observable, 'children'],\n [observable.ref, 'parent', 'status'],\n ];\n\n/**\n * Class for creating path based route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html)\n */\nexport class Route<\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TParentRoute extends Route<any, any, any, any, any> | null = null,\n TQueryParams extends Record<string, any> = AnyObject,\n> {\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n protected history: History;\n\n /**\n * Parent route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#parent)\n */\n parent: TParentRoute;\n\n query: IQueryParams<TQueryParams>;\n\n private _tokenData: TokenData | undefined;\n private _matcher?: ReturnType<typeof match>;\n private _compiler?: ReturnType<typeof compile>;\n private ignoreOpenByPathMatch = false;\n private isUpdate = false;\n private updateDisposer?: VoidFunction;\n\n protected status:\n | 'opening'\n | 'closed'\n | 'open-rejected'\n | 'open-confirmed'\n | 'unknown';\n\n meta?: AnyObject;\n\n /**\n * Route path pattern declaration.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#pathdeclaration)\n */\n pathDeclaration: TPath;\n\n /**\n * Indicates if this route is an index route. Index routes activate when parent route path matches exactly.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isindex)\n */\n isIndex: boolean;\n\n /**\n * Indicates if this route is an hash route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#ishash)\n */\n isHash: boolean;\n\n /**\n * Array of child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#children)\n */\n children: AnyRoute[] = [];\n\n constructor(\n pathDeclaration: TPath,\n protected config: RouteConfiguration<\n TPath,\n TInputParams,\n TOutputParams,\n TParentRoute,\n TQueryParams\n > = {},\n ) {\n this.history = config.history ?? routeConfig.get().history;\n this.query = (config.queryParams ??\n routeConfig.get().queryParams) as IQueryParams<TQueryParams>;\n this.pathDeclaration = pathDeclaration;\n this.isIndex = !!this.config.index;\n this.isHash = !!this.config.hash;\n this.meta = this.config.meta;\n this.status = 'unknown';\n this.parent = config.parent ?? (null as unknown as TParentRoute);\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(() => this.isPathMatched, this.checkPathMatch, {\n fireImmediately: true,\n });\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'open-confirmed') return undefined;\n return [this.parsedPathData, this.query.data] as const;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n if (!this.parsedPathData) return;\n this.config.afterUpdate?.(this.parsedPathData, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n this.config.abortSignal?.addEventListener('abort', () => this.destroy(), {\n once: true,\n });\n }\n }\n\n protected get baseUrl() {\n const baseUrl = this.config.baseUrl ?? routeConfig.get().baseUrl;\n return baseUrl?.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n }\n\n /**\n * Checks whether current route matches provided path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#matchpath)\n */\n matchPath(path?: Maybe<string>): ParsedPathData<TPath> | null {\n let pathnameToCheck: string;\n\n if (path != null) {\n pathnameToCheck = path;\n } else if (this.isHash) {\n pathnameToCheck = this.history.location.hash.slice(1);\n } else {\n pathnameToCheck = this.history.location.pathname;\n }\n\n if (this.baseUrl) {\n if (!pathnameToCheck.startsWith(this.baseUrl)) {\n return null;\n }\n\n pathnameToCheck = pathnameToCheck.replace(this.baseUrl, '');\n }\n\n if (\n (this.pathDeclaration === '' || this.pathDeclaration === '/') &&\n (pathnameToCheck === '/' || pathnameToCheck === '')\n ) {\n return { params: {} as any, path: pathnameToCheck };\n }\n\n this._matcher ??= match(this.tokenData, {\n end: this.config.exact ?? false,\n ...this.config.matchOptions,\n });\n const parsed = this._matcher(pathnameToCheck);\n\n if (parsed === false) {\n return null;\n }\n\n return parsed as ParsedPathData<TPath>;\n }\n\n protected get parsedPathData(): ParsedPathData<TPath> | null {\n return this.matchPath();\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopening)\n *\n * Also true in the short gap after history already matches this route but\n * `confirmOpening` has not started yet (e.g. browser Back) — otherwise every\n * route looks closed for one tick and RouteViewGroup unmounts the page.\n */\n get isOpening() {\n if (this.status === 'opening') {\n return true;\n }\n\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status === 'open-confirmed' ||\n this.status === 'open-rejected'\n ) {\n return false;\n }\n\n return this.status === 'closed' || this.status === 'unknown';\n }\n\n /**\n * Matched path segment for current URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#path)\n */\n get path(): string | null {\n return this.parsedPathData?.path ?? null;\n }\n\n /**\n * Matched path segment for current URL with base URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#absolutepath)\n */\n get absolutePath(): string | null {\n const path = this.path;\n\n if (path === null) {\n return null;\n }\n\n return `${this.baseUrl || ''}${path}`;\n }\n\n /**\n * Current parsed path parameters.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#params)\n */\n get params(): TOutputParams | null {\n if (!this.parsedPathData?.params) {\n return null;\n }\n\n if (this.config.params) {\n const result = this.config.params(\n this.parsedPathData.params,\n this.config.meta,\n );\n return result || null;\n }\n\n return (\n (this.parsedPathData?.params as unknown as Maybe<TOutputParams>) ?? null\n );\n }\n\n protected get isPathMatched() {\n return this.parsedPathData !== null;\n }\n\n /**\n * Defines the \"open\" state for this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopened)\n */\n get isOpened() {\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status !== 'open-confirmed'\n ) {\n return false;\n }\n\n return (\n // this.parsedPathData is defined because this.params !== null\n !this.config.checkOpened || this.config.checkOpened(this.parsedPathData!)\n );\n }\n\n /**\n * Allows to create child route based on this route with merging this route path and extending path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#extend)\n */\n extend<\n TExtendedPath extends string,\n TExtendedInputParams extends\n InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedOutputParams extends AnyObject = TInputParams &\n ParsedPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedQueryParams extends Record<string, any> = TQueryParams,\n >(\n pathDeclaration: TExtendedPath,\n config?: Omit<\n RouteConfiguration<\n `${TPath}${TExtendedPath}`,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n any,\n TExtendedQueryParams\n >,\n 'parent'\n >,\n ) {\n type ExtendedRoutePath = `${TPath}${TExtendedPath}`;\n type ParentRoute = this;\n const { index, params, exact, ...configFromCurrentRoute } = this.config;\n\n const extendedChild = new Route<\n ExtendedRoutePath,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n ParentRoute,\n TExtendedQueryParams\n >(`${this.pathDeclaration}${pathDeclaration}`, {\n ...configFromCurrentRoute,\n ...config,\n parent: this,\n } as any);\n\n this.addChildren(extendedChild as any);\n\n return extendedChild;\n }\n\n /**\n * Manually add child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#addchildren)\n */\n addChildren(...routes: AnyRoute[]) {\n this.children.push(...routes);\n }\n\n /**\n * Remove specified routes from children.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#removechildren)\n */\n removeChildren(...routes: AnyRoute[]) {\n this.children = this.children.filter((child) => !routes.includes(child));\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#hasopenedchildren)\n */\n get hasOpenedChildren(): boolean {\n return this.children.some(\n (child) => child.isOpened || child.hasOpenedChildren,\n );\n }\n\n protected processParams(\n params?: TInputParams | null | undefined,\n ): ParamData | undefined {\n if (params == null) return undefined;\n\n const result: ParamData = {};\n for (const [key, value] of Object.entries(params)) {\n if (value != null) {\n result[key] = Array.isArray(value) ? value.map(String) : String(value);\n }\n }\n return result;\n }\n\n /**\n * Generates full route URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl)\n */\n createUrl(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: Maybe<TInputParams>,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n : [\n params: TInputParams,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n ) {\n const params = args[0];\n const rawQuery = args[1];\n const mergeQueryOrOutputParams = args[2] ?? this.isAbleToMergeQuery;\n const outputParams: Maybe<CreatedUrlOutputParams> =\n typeof mergeQueryOrOutputParams === 'boolean'\n ? { mergeQuery: mergeQueryOrOutputParams }\n : mergeQueryOrOutputParams;\n\n const query = outputParams?.mergeQuery\n ? { ...this.query.data, ...rawQuery }\n : (rawQuery ?? {});\n\n this._compiler ??= compile(this.tokenData);\n\n const defaultUrlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n {\n baseUrl: this.baseUrl,\n params: params as TInputParams,\n query,\n };\n const urlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n this.config.createUrl?.(defaultUrlCreateParams, this.query.data) ??\n routeConfig.get().createUrl?.(defaultUrlCreateParams, this.query.data) ??\n defaultUrlCreateParams;\n\n let path: string;\n\n try {\n path = this._compiler(this.processParams(urlCreateParams.params));\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'Error #1: Route path compilation failed\\n' +\n 'The path pattern could not be built into a URL (often missing or invalid params for a `:param` segment). Using fallbackPath or \"/\".\\n' +\n 'See docs: https://js2me.github.io/mobx-route/errors/1',\n e,\n );\n } else {\n console.error('minified error #1;see mobx-route docs', e);\n }\n path = this.config.fallbackPath ?? routeConfig.get().fallbackPath ?? '/';\n }\n\n const url = `${urlCreateParams.baseUrl || ''}${this.isHash ? '#' : ''}${path}`;\n\n if (outputParams?.omitQuery) {\n return url;\n }\n\n return `${url}${buildSearchString(urlCreateParams.query)}`;\n }\n\n /**\n * Navigates to this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#open)\n */\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n : [\n params: TInputParams,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n ): Promise<void>;\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n : [\n params: TInputParams,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n ): Promise<void>;\n open(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n open(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async open(...args: any[]) {\n const {\n replace,\n state: rawState,\n query: rawQuery,\n mergeQuery: rawMergeQuery,\n } = typeof args[1] === 'boolean' || args.length > 2\n ? ({\n replace: args[1],\n query: args[2],\n } as RouteNavigateParams<TQueryParams>)\n : ((args[1] ?? {}) as RouteNavigateParams<TQueryParams>);\n\n const mergeQuery = rawMergeQuery ?? this.isAbleToMergeQuery;\n const query = mergeQuery ? { ...this.query.data, ...rawQuery } : rawQuery;\n\n const params = typeof args[0] === 'string' ? undefined : args[0];\n const url =\n typeof args[0] === 'string' ? args[0] : this.createUrl(args[0], query);\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url,\n params: params as TInputParams,\n replace,\n state: rawState ?? null,\n query,\n };\n\n this.isUpdate = this.status === 'open-confirmed';\n this.ignoreOpenByPathMatch = true;\n const isConfirmed = await this.confirmOpening(trx);\n\n if (isConfirmed !== true) {\n this.ignoreOpenByPathMatch = false;\n this.isUpdate = false;\n }\n }\n\n /**\n * Updates the current route if it is already open.\n * Unlike `open`, this is a no-op if the route is not open,\n * defaults to `replace: true` instead of push,\n * and defaults to `mergeQuery: true` when no query params are provided.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#update)\n */\n update(\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n update(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async update(...args: any[]) {\n if (this.status !== 'open-confirmed') {\n return;\n }\n\n // Reuse current path params when omitted\n if (args[0] == null) {\n args[0] = this.parsedPathData?.params;\n }\n\n const secondArg = args[1];\n const isObjectParams = typeof secondArg === 'object' && secondArg !== null;\n\n if (isObjectParams) {\n args[1] = {\n replace: true,\n ...('query' in secondArg ? {} : { mergeQuery: true }),\n ...secondArg,\n };\n } else if (typeof secondArg === 'boolean') {\n if (args[2] === undefined) {\n args[1] = { replace: secondArg, mergeQuery: true };\n args.length = 2;\n }\n } else if (args.length === 1) {\n args[1] = { replace: true, mergeQuery: true };\n }\n\n return (this.open as (...args: any[]) => Promise<void>)(...args);\n }\n\n protected get tokenData() {\n if (!this._tokenData) {\n this._tokenData = parse(this.pathDeclaration, this.config.parseOptions);\n }\n return this._tokenData;\n }\n\n protected async confirmOpening(\n trx: NavigationTrx<TInputParams, TQueryParams>,\n ) {\n if (!this.isUpdate) {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n let skipHistoryUpdate = !!trx.preferSkipHistoryUpdate;\n\n if (skipHistoryUpdate) {\n this.ignoreOpenByPathMatch = false;\n }\n\n if (this.config.beforeOpen) {\n const feedback = await this.config.beforeOpen(trx);\n\n if (feedback === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n });\n\n return;\n }\n\n // Rebuild URL if beforeOpen mutated trx.params\n const newUrl = this.createUrl(\n trx.params as TInputParams,\n trx.query as AnyObject,\n );\n if (newUrl !== trx.url) {\n trx.url = newUrl;\n skipHistoryUpdate = false;\n }\n\n if (typeof feedback === 'object') {\n skipHistoryUpdate = false;\n Object.assign(trx, feedback);\n }\n }\n\n if (this.isDestroyed) {\n return;\n }\n\n if (!skipHistoryUpdate) {\n if (trx.replace) {\n this.history.replace(trx.url, trx.state);\n } else {\n this.history.push(trx.url, trx.state);\n }\n }\n\n if (this.isPathMatched) {\n const wasAlreadyConfirmed = this.status === 'open-confirmed';\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n\n if (this.isUpdate) {\n this.isUpdate = false;\n // afterUpdate handled by updateDisposer reaction\n } else if (!wasAlreadyConfirmed) {\n this.config.afterOpen?.(this.parsedPathData!, this);\n }\n }\n\n return true;\n }\n\n protected confirmClosing() {\n runInAction(() => {\n this.status = 'closed';\n });\n return true;\n }\n\n private firstPathMatchingRun = true;\n\n private checkPathMatch = async (isPathMathched: boolean) => {\n if (this.firstPathMatchingRun) {\n this.firstPathMatchingRun = false;\n // ignore first 'afterClose' callback call\n if (!isPathMathched) {\n return;\n }\n }\n\n if (isPathMathched) {\n // after manual open call\n if (this.ignoreOpenByPathMatch) {\n this.ignoreOpenByPathMatch = false;\n if (this.status === 'opening' && this.parsedPathData) {\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.parsedPathData, this);\n } else {\n this.config.afterOpen?.(this.parsedPathData, this);\n }\n }\n // update() delegates to confirmOpening\n return;\n }\n\n // Set opening sync to avoid isOpened/isOpening flicker\n if (this.status !== 'opening' && this.status !== 'open-confirmed') {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n // already confirmed\n if (this.status === 'open-confirmed') {\n return;\n }\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url: `${this.parsedPathData!.path}${buildSearchString(this.query.data)}`,\n params: this.parsedPathData!.params as TInputParams,\n state: this.history.location.state,\n query: this.query.data,\n preferSkipHistoryUpdate: true,\n };\n\n await this.confirmOpening(trx);\n } else {\n this.ignoreOpenByPathMatch = false;\n\n const isConfirmed = this.confirmClosing();\n\n if (isConfirmed) {\n this.config.afterClose?.();\n }\n }\n };\n\n private get isAbleToMergeQuery() {\n return this.config.mergeQuery ?? routeConfig.get().mergeQuery;\n }\n\n /**\n * Destroys route subscriptions and reactions.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#destroy)\n */\n destroy() {\n this.isDestroyed = true;\n this.disposer?.();\n this.disposer = undefined;\n this.updateDisposer?.();\n this.updateDisposer = undefined;\n }\n}\n\nexport const createRoute = <\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TParentRoute extends Route<any, any, any, any, any> | null = null,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n path: TPath,\n config?: RouteConfiguration<\n TPath,\n TInputParams,\n TOutputParams,\n TParentRoute,\n TQueryParams\n >,\n) =>\n new Route<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>(\n path,\n config,\n );\n","import { computed, observable } from 'mobx';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type {\n AbstractRouteGroup,\n AnyRouteEntity,\n RoutesCollection,\n} from './route-group.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<RouteGroup<any>> = [\n [computed, 'isOpened', 'indexRoute', 'canNavigate'],\n [observable.shallow, 'routes'],\n];\n\n/**\n * Class for grouping related routes and managing their state.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport class RouteGroup<TRoutesCollection extends RoutesCollection>\n implements AbstractRouteGroup<TRoutesCollection>\n{\n routes: TRoutesCollection;\n\n constructor(\n routes: TRoutesCollection,\n private _indexRoute?: AnyRouteEntity,\n ) {\n this.routes = routes;\n\n applyObservable(this, annotations);\n }\n\n /**\n * Returns true if at least one route in the group is open.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#isopened)\n */\n get isOpened(): boolean {\n const routes = Object.values(this.routes);\n return routes.some(\n (route) =>\n route.isOpened ||\n ('hasOpenedChildren' in route && route.hasOpenedChildren),\n );\n }\n\n /**\n * First found index route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#indexroute)\n */\n get indexRoute(): AnyRouteEntity | undefined {\n return (this._indexRoute ??\n Object.values(this.routes).find(\n (route) => 'isIndex' in route && route.isIndex,\n )) as unknown as AnyRouteEntity;\n }\n\n /**\n * `true` if `open()` has a target to navigate to —\n * either an own index route or a nested `RouteGroup` that itself can navigate.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#cannavigate)\n */\n get canNavigate(): boolean {\n if (this.indexRoute) return true;\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Main navigation method for the group.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#open)\n */\n open(...args: any[]) {\n if (this.indexRoute && 'open' in this.indexRoute) {\n this.indexRoute.open(...args);\n return;\n }\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n route.open(...args);\n return;\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Warning #1: RouteGroup.open() cannot navigate\\n' +\n 'This group has no index route (`index: true` or `groupRoutes(routes, indexRoute)`) and no navigable nested RouteGroup, so open() does nothing.\\n' +\n 'See docs: https://js2me.github.io/mobx-route/warnings/1',\n );\n } else {\n console.warn('minified warning #1;see mobx-route docs');\n }\n }\n}\n\n/**\n * Helper for creating route groups.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport const groupRoutes = <TRoutesCollection extends RoutesCollection>(\n routes: TRoutesCollection,\n indexRoute?: AnyRouteEntity,\n) => new RouteGroup<TRoutesCollection>(routes, indexRoute);\n","import { computed } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport { routeConfig } from '../config/index.js';\nimport type { RoutesCollection } from '../route-group/index.js';\nimport type {\n RouterConfiguration,\n RouterNavigateOptions,\n} from './router.types.js';\n\nconst annotations: ObservableAnnotationsArray<Router<any>> = [\n [computed.struct, 'location'],\n];\n\n/**\n * Class for centralized routing management.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Router.html)\n */\nexport class Router<TRoutesCollection extends RoutesCollection> {\n routes: TRoutesCollection;\n history: History;\n query: IQueryParams;\n\n constructor(config: RouterConfiguration<TRoutesCollection>) {\n this.routes = config.routes;\n this.history = config.history ?? routeConfig.get().history;\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n\n applyObservable(this, annotations);\n }\n\n get location() {\n return this.history.location;\n }\n\n navigate(url: string, options?: RouterNavigateOptions) {\n const query =\n (options?.mergeQuery ?? routeConfig.get().mergeQuery)\n ? { ...this.query.data, ...options?.query }\n : { ...options?.query };\n\n const searchString = buildSearchString(query);\n const navigationUrl = `${url}${searchString}`;\n\n if (options?.replace) {\n this.history.replace(navigationUrl, options?.state);\n } else {\n this.history.push(navigationUrl, options?.state);\n }\n }\n}\n\nexport const createRouter = <TRoutesCollection extends RoutesCollection>(\n config: RouterConfiguration<TRoutesCollection>,\n) => new Router(config);\n","import {\n action,\n comparer,\n computed,\n observable,\n reaction,\n runInAction,\n} from 'mobx';\nimport type { IQueryParams } from 'mobx-location-history';\nimport { callFunction } from 'yummies/common';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, EmptyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AbstractVirtualRoute,\n VirtualOpenExtraParams,\n VirtualRouteConfiguration,\n VirtualRouteTrx,\n} from './virtual-route.types.js';\n\nconst annotations: ObservableAnnotationsArray<VirtualRoute<any>> = [\n [observable, 'params'],\n [observable.ref, 'status', 'trx', 'openChecker', 'isOuterOpened'],\n [computed, 'isOpened', 'isOpening', 'isClosing'],\n [action, 'setOpenChecker', 'open', 'close', 'destroy'],\n];\n\n/**\n * Class for creating routes with custom activation logic\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html)\n */\nexport class VirtualRoute<\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n> implements AbstractVirtualRoute<TParams, TQueryParams>\n{\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n query: IQueryParams<TQueryParams>;\n params: TParams | null;\n\n protected status:\n | 'opening'\n | 'open-rejected'\n | 'opened'\n | 'closing'\n | 'closed'\n | 'unknown';\n\n private openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>;\n\n private trx: Maybe<VirtualRouteTrx>;\n\n private skipAutoOpenClose: boolean;\n\n private isUpdate = false;\n\n private updateDisposer?: VoidFunction;\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isouteropened)\n */\n isOuterOpened: boolean | undefined;\n\n constructor(\n protected config: VirtualRouteConfiguration<TParams, TQueryParams> = {},\n ) {\n this.query = (config.queryParams ??\n routeConfig.get().queryParams) as IQueryParams<TQueryParams>;\n this.params = callFunction(config.initialParams, this) ?? null;\n this.openChecker = config.checkOpened;\n this.skipAutoOpenClose = false;\n this.isOuterOpened = this.openChecker?.(this);\n this.status = this.isOuterOpened ? 'opened' : 'unknown';\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(\n () => this.openChecker?.(this),\n action((isOuterOpened) => {\n this.isOuterOpened = isOuterOpened;\n\n if (\n this.skipAutoOpenClose ||\n this.status === 'closing' ||\n this.status === 'opening'\n ) {\n return;\n }\n\n if (this.isOuterOpened) {\n if (this.status === 'opened') {\n return;\n }\n void this.confirmOpening({\n params: this.params ?? null,\n ...this.config.getAutoOpenParams?.(this),\n });\n } else {\n if (this.status === 'closed' || this.status === 'unknown') {\n return;\n }\n void this.confirmClosing();\n }\n }),\n { signal: this.config.abortSignal, fireImmediately: true },\n );\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'opened') return undefined;\n return this.query.data;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n this.config.afterUpdate?.(this.params, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n }\n\n if (this.status === 'opened') {\n this.config.afterOpen?.(this.params, this);\n }\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopened)\n */\n get isOpened() {\n return (\n !this.isDestroyed &&\n this.status === 'opened' &&\n this.isOuterOpened !== false\n );\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopening)\n */\n get isOpening() {\n return this.status === 'opening';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isclosing)\n */\n get isClosing() {\n return this.status === 'closing';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#setopenchecker)\n */\n setOpenChecker(\n openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>,\n ) {\n this.openChecker = openChecker;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#open)\n */\n open(\n ...args: IsPartial<TParams> extends true\n ? [\n params?: Maybe<TParams>,\n extraParams?: VirtualOpenExtraParams<TQueryParams>,\n ]\n : [params: TParams, extraParams?: VirtualOpenExtraParams<TQueryParams>]\n ): Promise<void>;\n async open(...args: any[]) {\n const params = (args[0] ?? null) as unknown as TParams;\n const extra: Maybe<VirtualOpenExtraParams> = args[1];\n\n this.isUpdate = this.status === 'opened';\n this.skipAutoOpenClose = true;\n\n this.trx = {\n params,\n extra,\n manual: true,\n };\n\n await this.confirmOpening(this.trx);\n\n this.skipAutoOpenClose = false;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#close)\n */\n async close() {\n this.skipAutoOpenClose = true;\n const result = await this.confirmClosing();\n this.skipAutoOpenClose = false;\n return result;\n }\n\n private async confirmOpening(trx: VirtualRouteTrx) {\n runInAction(() => {\n this.trx = undefined;\n this.status = 'opening';\n });\n\n if ((await this.config.beforeOpen?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n if ((await this.config.open?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n runInAction(() => {\n if (trx.extra?.query) {\n this.query.update(trx.extra.query, trx.extra.replace);\n }\n\n this.trx = undefined;\n this.params = trx.params;\n this.status = 'opened';\n\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.params!, this);\n } else {\n this.config.afterOpen?.(this.params!, this);\n }\n });\n\n return true;\n }\n\n private async confirmClosing() {\n if (this.status === 'closed') {\n return true;\n }\n\n const lastStatus = this.status;\n\n runInAction(() => {\n this.status = 'closing';\n });\n\n if ((await this.config.beforeClose?.()) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n if (this.config.close?.(this) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n runInAction(() => {\n this.status = 'closed';\n this.params = null;\n });\n\n this.config.afterClose?.();\n\n return true;\n }\n\n destroy() {\n this.isDestroyed = true;\n this.status = 'unknown';\n this.disposer?.();\n this.updateDisposer?.();\n }\n}\n\nexport const createVirtualRoute = <\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n config?: VirtualRouteConfiguration<TParams, TQueryParams>,\n) => new VirtualRoute<TParams, TQueryParams>(config);\n"],"names":["createGlobalDynamicConfig","isObservableHistory","createBrowserHistory","createQueryParams","annotations","computed","observable","applyObservable","reaction","comparer","match","compile","buildSearchString","parse","runInAction","action","callFunction"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"virtual-route-C7NPJx5y.js","sources":["../src/core/config/config.ts","../src/core/route/route.ts","../src/core/route-group/route-group.ts","../src/core/router/router.ts","../src/core/virtual-route/virtual-route.ts"],"sourcesContent":["import {\n createBrowserHistory,\n createQueryParams,\n type History,\n type IQueryParams,\n isObservableHistory,\n} from 'mobx-location-history';\nimport { createGlobalDynamicConfig } from 'yummies/complex';\n\nimport type { RouteGlobalConfig } from './config.types.js';\n\nexport const routeConfig = createGlobalDynamicConfig<RouteGlobalConfig>(\n (update, current) => {\n let history: History;\n let queryParams: IQueryParams | undefined;\n\n if (update?.history) {\n history = update.history;\n queryParams = update.queryParams;\n\n if (current?.history && isObservableHistory(current.history)) {\n current.history.destroy();\n }\n } else if (current?.history) {\n history = current.history;\n queryParams = update?.queryParams ?? current.queryParams;\n } else {\n history = createBrowserHistory();\n }\n\n queryParams ??= createQueryParams({ history });\n\n return {\n ...update,\n history,\n queryParams,\n };\n },\n Symbol.for('MOBX_ROUTE_CONFIG'),\n);\n","import { comparer, computed, observable, reaction, runInAction } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport {\n compile,\n match,\n type ParamData,\n parse,\n type TokenData,\n} from 'path-to-regexp';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AnyRoute,\n CreatedUrlOutputParams,\n InputPathParams,\n NavigationTrx,\n ParsedPathData,\n ParsedPathParams,\n RouteConfiguration,\n RouteNavigateParams,\n UrlCreateParams,\n} from './route.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<Route<any, any, any, any, any>> =\n [\n [\n computed,\n 'isPathMatched',\n 'isOpened',\n 'isOpening',\n 'path',\n 'absolutePath',\n 'hasOpenedChildren',\n 'isAbleToMergeQuery',\n 'baseUrl',\n ],\n [computed.struct, 'parsedPathData', 'params'],\n [observable, 'children'],\n [observable.ref, 'parent', 'status'],\n ];\n\n/**\n * Class for creating path based route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html)\n */\nexport class Route<\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TParentRoute extends Route<any, any, any, any, any> | null = null,\n TQueryParams extends Record<string, any> = AnyObject,\n> {\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n protected history: History;\n\n /**\n * Parent route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#parent)\n */\n parent: TParentRoute;\n\n query: IQueryParams<TQueryParams>;\n\n private _tokenData: TokenData | undefined;\n private _matcher?: ReturnType<typeof match>;\n private _compiler?: ReturnType<typeof compile>;\n private ignoreOpenByPathMatch = false;\n private isUpdate = false;\n private updateDisposer?: VoidFunction;\n\n protected status:\n | 'opening'\n | 'closed'\n | 'open-rejected'\n | 'open-confirmed'\n | 'unknown';\n\n meta?: AnyObject;\n\n /**\n * Route path pattern declaration.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#pathdeclaration)\n */\n pathDeclaration: TPath;\n\n /**\n * Indicates if this route is an index route. Index routes activate when parent route path matches exactly.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isindex)\n */\n isIndex: boolean;\n\n /**\n * Indicates if this route is an hash route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#ishash)\n */\n isHash: boolean;\n\n /**\n * Array of child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#children)\n */\n children: AnyRoute[] = [];\n\n constructor(\n pathDeclaration: TPath,\n protected config: RouteConfiguration<\n TPath,\n TInputParams,\n TOutputParams,\n TParentRoute,\n TQueryParams\n > = {},\n ) {\n this.history = config.history ?? routeConfig.get().history;\n this.query = (config.queryParams ??\n routeConfig.get().queryParams) as IQueryParams<TQueryParams>;\n this.pathDeclaration = pathDeclaration;\n this.isIndex = !!this.config.index;\n this.isHash = !!this.config.hash;\n this.meta = this.config.meta;\n this.status = 'unknown';\n this.parent = config.parent ?? (null as unknown as TParentRoute);\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(() => this.isPathMatched, this.checkPathMatch, {\n fireImmediately: true,\n });\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'open-confirmed') return undefined;\n return [this.parsedPathData, this.query.data] as const;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n if (!this.parsedPathData) return;\n this.config.afterUpdate?.(this.parsedPathData, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n this.config.abortSignal?.addEventListener('abort', () => this.destroy(), {\n once: true,\n });\n }\n }\n\n protected get baseUrl() {\n const baseUrl = this.config.baseUrl ?? routeConfig.get().baseUrl;\n return baseUrl?.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n }\n\n /**\n * Checks whether current route matches provided path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#matchpath)\n */\n matchPath(path?: Maybe<string>): ParsedPathData<TPath> | null {\n let pathnameToCheck: string;\n\n if (path != null) {\n pathnameToCheck = path;\n } else if (this.isHash) {\n pathnameToCheck = this.history.location.hash.slice(1);\n } else {\n pathnameToCheck = this.history.location.pathname;\n }\n\n if (this.baseUrl) {\n if (!pathnameToCheck.startsWith(this.baseUrl)) {\n return null;\n }\n\n pathnameToCheck = pathnameToCheck.replace(this.baseUrl, '');\n }\n\n if (\n (this.pathDeclaration === '' || this.pathDeclaration === '/') &&\n (pathnameToCheck === '/' || pathnameToCheck === '')\n ) {\n return { params: {} as any, path: pathnameToCheck };\n }\n\n this._matcher ??= match(this.tokenData, {\n end: this.config.exact ?? false,\n ...this.config.matchOptions,\n });\n const parsed = this._matcher(pathnameToCheck);\n\n if (parsed === false) {\n return null;\n }\n\n return parsed as ParsedPathData<TPath>;\n }\n\n protected get parsedPathData(): ParsedPathData<TPath> | null {\n return this.matchPath();\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopening)\n *\n * Also true in the short gap after history already matches this route but\n * `confirmOpening` has not started yet (e.g. browser Back) — otherwise every\n * route looks closed for one tick and RouteViewGroup unmounts the page.\n */\n get isOpening() {\n if (this.status === 'opening') {\n return true;\n }\n\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status === 'open-confirmed' ||\n this.status === 'open-rejected'\n ) {\n return false;\n }\n\n return this.status === 'closed' || this.status === 'unknown';\n }\n\n /**\n * Matched path segment for current URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#path)\n */\n get path(): string | null {\n return this.parsedPathData?.path ?? null;\n }\n\n /**\n * Matched path segment for current URL with base URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#absolutepath)\n */\n get absolutePath(): string | null {\n const path = this.path;\n\n if (path === null) {\n return null;\n }\n\n return `${this.baseUrl || ''}${path}`;\n }\n\n /**\n * Current parsed path parameters.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#params)\n */\n get params(): TOutputParams | null {\n if (!this.parsedPathData?.params) {\n return null;\n }\n\n if (this.config.params) {\n const result = this.config.params(\n this.parsedPathData.params,\n this.config.meta,\n );\n return result || null;\n }\n\n return (\n (this.parsedPathData?.params as unknown as Maybe<TOutputParams>) ?? null\n );\n }\n\n protected get isPathMatched() {\n return this.parsedPathData !== null;\n }\n\n /**\n * Defines the \"open\" state for this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#isopened)\n */\n get isOpened() {\n if (\n this.isDestroyed ||\n !this.isPathMatched ||\n this.params === null ||\n this.status !== 'open-confirmed'\n ) {\n return false;\n }\n\n return (\n // this.parsedPathData is defined because this.params !== null\n !this.config.checkOpened || this.config.checkOpened(this.parsedPathData!)\n );\n }\n\n /**\n * Allows to create child route based on this route with merging this route path and extending path.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#extend)\n */\n extend<\n TExtendedPath extends string,\n TExtendedInputParams extends\n InputPathParams<`${TPath}${TExtendedPath}`> = InputPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedOutputParams extends AnyObject = TInputParams &\n ParsedPathParams<`${TPath}${TExtendedPath}`>,\n TExtendedQueryParams extends Record<string, any> = TQueryParams,\n >(\n pathDeclaration: TExtendedPath,\n config?: Omit<\n RouteConfiguration<\n `${TPath}${TExtendedPath}`,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n any,\n TExtendedQueryParams\n >,\n 'parent'\n >,\n ) {\n type ExtendedRoutePath = `${TPath}${TExtendedPath}`;\n type ParentRoute = this;\n const { index, params, exact, ...configFromCurrentRoute } = this.config;\n\n const extendedChild = new Route<\n ExtendedRoutePath,\n TInputParams & TExtendedInputParams,\n TExtendedOutputParams,\n ParentRoute,\n TExtendedQueryParams\n >(`${this.pathDeclaration}${pathDeclaration}`, {\n ...configFromCurrentRoute,\n ...config,\n parent: this,\n } as any);\n\n this.addChildren(extendedChild as any);\n\n return extendedChild;\n }\n\n /**\n * Manually add child routes.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#addchildren)\n */\n addChildren(...routes: AnyRoute[]) {\n this.children.push(...routes);\n }\n\n /**\n * Remove specified routes from children.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#removechildren)\n */\n removeChildren(...routes: AnyRoute[]) {\n this.children = this.children.filter((child) => !routes.includes(child));\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#hasopenedchildren)\n */\n get hasOpenedChildren(): boolean {\n return this.children.some(\n (child) => child.isOpened || child.hasOpenedChildren,\n );\n }\n\n protected processParams(\n params?: TInputParams | null | undefined,\n ): ParamData | undefined {\n if (params == null) return undefined;\n\n const result: ParamData = {};\n for (const [key, value] of Object.entries(params)) {\n if (value != null) {\n result[key] = Array.isArray(value) ? value.map(String) : String(value);\n }\n }\n return result;\n }\n\n /**\n * Generates full route URL.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#createurl)\n */\n createUrl(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: Maybe<TInputParams>,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n : [\n params: TInputParams,\n query?: Maybe<Partial<TQueryParams>>,\n mergeQueryOrParams?: boolean | CreatedUrlOutputParams,\n ]\n ) {\n const params = args[0];\n const rawQuery = args[1];\n const mergeQueryOrOutputParams = args[2] ?? this.isAbleToMergeQuery;\n const outputParams: Maybe<CreatedUrlOutputParams> =\n typeof mergeQueryOrOutputParams === 'boolean'\n ? { mergeQuery: mergeQueryOrOutputParams }\n : mergeQueryOrOutputParams;\n\n const query = outputParams?.mergeQuery\n ? { ...this.query.data, ...rawQuery }\n : (rawQuery ?? {});\n\n this._compiler ??= compile(this.tokenData);\n\n const defaultUrlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n {\n baseUrl: this.baseUrl,\n params: params as TInputParams,\n query,\n };\n const urlCreateParams: UrlCreateParams<TInputParams, TQueryParams> =\n this.config.createUrl?.(defaultUrlCreateParams, this.query.data) ??\n routeConfig.get().createUrl?.(defaultUrlCreateParams, this.query.data) ??\n defaultUrlCreateParams;\n\n let path: string;\n\n try {\n path = this._compiler(this.processParams(urlCreateParams.params));\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'Error #1: Route path compilation failed\\n' +\n 'The path pattern could not be built into a URL (often missing or invalid params for a `:param` segment). Using fallbackPath or \"/\".\\n' +\n 'See docs: https://js2me.github.io/mobx-route/errors/1',\n e,\n );\n } else {\n console.error('minified error #1;see mobx-route docs', e);\n }\n path = this.config.fallbackPath ?? routeConfig.get().fallbackPath ?? '/';\n }\n\n const url = `${urlCreateParams.baseUrl || ''}${this.isHash ? '#' : ''}${path}`;\n\n if (outputParams?.omitQuery) {\n return url;\n }\n\n return `${url}${buildSearchString(urlCreateParams.query)}`;\n }\n\n /**\n * Navigates to this route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#open)\n */\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n : [\n params: TInputParams,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ]\n ): Promise<void>;\n open(\n ...args: IsPartial<TInputParams> extends true\n ? [\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n : [\n params: TInputParams,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ]\n ): Promise<void>;\n open(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n open(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async open(...args: any[]) {\n const {\n replace,\n state: rawState,\n query: rawQuery,\n mergeQuery: rawMergeQuery,\n } = typeof args[1] === 'boolean' || args.length > 2\n ? ({\n replace: args[1],\n query: args[2],\n } as RouteNavigateParams<TQueryParams>)\n : ((args[1] ?? {}) as RouteNavigateParams<TQueryParams>);\n\n const mergeQuery = rawMergeQuery ?? this.isAbleToMergeQuery;\n const query = mergeQuery ? { ...this.query.data, ...rawQuery } : rawQuery;\n\n const params = typeof args[0] === 'string' ? undefined : args[0];\n const url =\n typeof args[0] === 'string' ? args[0] : this.createUrl(args[0], query);\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url,\n params: params as TInputParams,\n replace,\n state: rawState ?? null,\n query,\n };\n\n this.isUpdate = this.status === 'open-confirmed';\n this.ignoreOpenByPathMatch = true;\n const isConfirmed = await this.confirmOpening(trx);\n\n if (isConfirmed !== true) {\n this.ignoreOpenByPathMatch = false;\n this.isUpdate = false;\n }\n }\n\n /**\n * Updates the current route if it is already open.\n * Unlike `open`, this is a no-op if the route is not open,\n * defaults to `replace: true` instead of push,\n * and defaults to `mergeQuery: true` when no query params are provided.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#update)\n */\n update(\n params?: TInputParams | null | undefined,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n params?: TInputParams | null | undefined,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n update(\n url: string,\n navigateParams?: RouteNavigateParams<TQueryParams>,\n ): Promise<void>;\n update(\n url: string,\n replace?: RouteNavigateParams<TQueryParams>['replace'],\n query?: RouteNavigateParams<TQueryParams>['query'],\n ): Promise<void>;\n\n async update(...args: any[]) {\n if (this.status !== 'open-confirmed') {\n return;\n }\n\n // Reuse current path params when omitted\n if (args[0] == null) {\n args[0] = this.parsedPathData?.params;\n }\n\n const secondArg = args[1];\n const isObjectParams = typeof secondArg === 'object' && secondArg !== null;\n\n if (isObjectParams) {\n args[1] = {\n replace: true,\n ...('query' in secondArg ? {} : { mergeQuery: true }),\n ...secondArg,\n };\n } else if (typeof secondArg === 'boolean') {\n if (args[2] === undefined) {\n args[1] = { replace: secondArg, mergeQuery: true };\n args.length = 2;\n }\n } else if (args.length === 1) {\n args[1] = { replace: true, mergeQuery: true };\n }\n\n return (this.open as (...args: any[]) => Promise<void>)(...args);\n }\n\n protected get tokenData() {\n if (!this._tokenData) {\n this._tokenData = parse(this.pathDeclaration, this.config.parseOptions);\n }\n return this._tokenData;\n }\n\n protected async confirmOpening(\n trx: NavigationTrx<TInputParams, TQueryParams>,\n ) {\n if (!this.isUpdate) {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n let skipHistoryUpdate = !!trx.preferSkipHistoryUpdate;\n\n if (skipHistoryUpdate) {\n this.ignoreOpenByPathMatch = false;\n }\n\n if (this.config.beforeOpen) {\n const feedback = await this.config.beforeOpen(trx);\n\n if (feedback === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n });\n\n return;\n }\n\n // Rebuild URL if beforeOpen mutated trx.params\n const newUrl = this.createUrl(\n trx.params as TInputParams,\n trx.query as AnyObject,\n );\n if (newUrl !== trx.url) {\n trx.url = newUrl;\n skipHistoryUpdate = false;\n }\n\n if (typeof feedback === 'object') {\n skipHistoryUpdate = false;\n Object.assign(trx, feedback);\n }\n }\n\n if (this.isDestroyed) {\n return;\n }\n\n if (!skipHistoryUpdate) {\n if (trx.replace) {\n this.history.replace(trx.url, trx.state);\n } else {\n this.history.push(trx.url, trx.state);\n }\n }\n\n if (this.isPathMatched) {\n const wasAlreadyConfirmed = this.status === 'open-confirmed';\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n\n if (this.isUpdate) {\n this.isUpdate = false;\n // afterUpdate handled by updateDisposer reaction\n } else if (!wasAlreadyConfirmed) {\n this.config.afterOpen?.(this.parsedPathData!, this);\n }\n }\n\n return true;\n }\n\n protected confirmClosing() {\n runInAction(() => {\n this.status = 'closed';\n });\n return true;\n }\n\n private firstPathMatchingRun = true;\n\n private checkPathMatch = async (isPathMathched: boolean) => {\n if (this.firstPathMatchingRun) {\n this.firstPathMatchingRun = false;\n // ignore first 'afterClose' callback call\n if (!isPathMathched) {\n return;\n }\n }\n\n if (isPathMathched) {\n // after manual open call\n if (this.ignoreOpenByPathMatch) {\n this.ignoreOpenByPathMatch = false;\n if (this.status === 'opening' && this.parsedPathData) {\n runInAction(() => {\n this.status = 'open-confirmed';\n });\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.parsedPathData, this);\n } else {\n this.config.afterOpen?.(this.parsedPathData, this);\n }\n }\n // update() delegates to confirmOpening\n return;\n }\n\n // Set opening sync to avoid isOpened/isOpening flicker\n if (this.status !== 'opening' && this.status !== 'open-confirmed') {\n runInAction(() => {\n this.status = 'opening';\n });\n }\n\n // already confirmed\n if (this.status === 'open-confirmed') {\n return;\n }\n\n const trx: NavigationTrx<TInputParams, TQueryParams> = {\n url: `${this.parsedPathData!.path}${buildSearchString(this.query.data)}`,\n params: this.parsedPathData!.params as TInputParams,\n state: this.history.location.state,\n query: this.query.data,\n preferSkipHistoryUpdate: true,\n };\n\n await this.confirmOpening(trx);\n } else {\n this.ignoreOpenByPathMatch = false;\n\n const isConfirmed = this.confirmClosing();\n\n if (isConfirmed) {\n this.config.afterClose?.();\n }\n }\n };\n\n private get isAbleToMergeQuery() {\n return this.config.mergeQuery ?? routeConfig.get().mergeQuery;\n }\n\n /**\n * Destroys route subscriptions and reactions.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Route.html#destroy)\n */\n destroy() {\n this.isDestroyed = true;\n this.disposer?.();\n this.disposer = undefined;\n this.updateDisposer?.();\n this.updateDisposer = undefined;\n }\n}\n\nexport const createRoute = <\n TPath extends string,\n TInputParams extends InputPathParams<TPath> = InputPathParams<TPath>,\n TOutputParams extends AnyObject = ParsedPathParams<TPath>,\n TParentRoute extends Route<any, any, any, any, any> | null = null,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n path: TPath,\n config?: RouteConfiguration<\n TPath,\n TInputParams,\n TOutputParams,\n TParentRoute,\n TQueryParams\n >,\n) =>\n new Route<TPath, TInputParams, TOutputParams, TParentRoute, TQueryParams>(\n path,\n config,\n );\n","import { computed, observable } from 'mobx';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type {\n AbstractRouteGroup,\n AnyRouteEntity,\n RoutesCollection,\n} from './route-group.types.js';\n\ndeclare const process: { env: { NODE_ENV?: string } };\n\nconst annotations: ObservableAnnotationsArray<RouteGroup<any>> = [\n [computed, 'isOpened', 'indexRoute', 'canNavigate'],\n [observable.shallow, 'routes'],\n];\n\n/**\n * Class for grouping related routes and managing their state.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport class RouteGroup<TRoutesCollection extends RoutesCollection>\n implements AbstractRouteGroup<TRoutesCollection>\n{\n routes: TRoutesCollection;\n\n constructor(\n routes: TRoutesCollection,\n private _indexRoute?: AnyRouteEntity,\n ) {\n this.routes = routes;\n\n applyObservable(this, annotations);\n }\n\n /**\n * Returns true if at least one route in the group is open.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#isopened)\n */\n get isOpened(): boolean {\n const routes = Object.values(this.routes);\n return routes.some(\n (route) =>\n route.isOpened ||\n ('hasOpenedChildren' in route && route.hasOpenedChildren),\n );\n }\n\n /**\n * First found index route.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#indexroute)\n */\n get indexRoute(): AnyRouteEntity | undefined {\n return (this._indexRoute ??\n Object.values(this.routes).find(\n (route) => 'isIndex' in route && route.isIndex,\n )) as unknown as AnyRouteEntity;\n }\n\n /**\n * `true` if `open()` has a target to navigate to —\n * either an own index route or a nested `RouteGroup` that itself can navigate.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#cannavigate)\n */\n get canNavigate(): boolean {\n if (this.indexRoute) return true;\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Main navigation method for the group.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html#open)\n */\n open(...args: any[]) {\n if (this.indexRoute && 'open' in this.indexRoute) {\n this.indexRoute.open(...args);\n return;\n }\n\n for (const routeName in this.routes) {\n const route = this.routes[routeName];\n if (route instanceof RouteGroup && route.canNavigate) {\n route.open(...args);\n return;\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Warning #1: RouteGroup.open() cannot navigate\\n' +\n 'This group has no index route (`index: true` or `groupRoutes(routes, indexRoute)`) and no navigable nested RouteGroup, so open() does nothing.\\n' +\n 'See docs: https://js2me.github.io/mobx-route/warnings/1',\n );\n } else {\n console.warn('minified warning #1;see mobx-route docs');\n }\n }\n}\n\n/**\n * Helper for creating route groups.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/groupRoutes.html)\n */\nexport const groupRoutes = <TRoutesCollection extends RoutesCollection>(\n routes: TRoutesCollection,\n indexRoute?: AnyRouteEntity,\n) => new RouteGroup<TRoutesCollection>(routes, indexRoute);\n","import { computed } from 'mobx';\nimport {\n buildSearchString,\n type History,\n type IQueryParams,\n} from 'mobx-location-history';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport { routeConfig } from '../config/index.js';\nimport type { RoutesCollection } from '../route-group/index.js';\nimport type {\n RouterConfiguration,\n RouterNavigateOptions,\n} from './router.types.js';\n\nconst annotations: ObservableAnnotationsArray<Router<any>> = [\n [computed.struct, 'location'],\n];\n\n/**\n * Class for centralized routing management.\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/Router.html)\n */\nexport class Router<TRoutesCollection extends RoutesCollection> {\n routes: TRoutesCollection;\n history: History;\n query: IQueryParams;\n\n constructor(config: RouterConfiguration<TRoutesCollection>) {\n this.routes = config.routes;\n this.history = config.history ?? routeConfig.get().history;\n this.query = config.queryParams ?? routeConfig.get().queryParams;\n\n applyObservable(this, annotations);\n }\n\n get location() {\n return this.history.location;\n }\n\n navigate(url: string, options?: RouterNavigateOptions) {\n const query =\n (options?.mergeQuery ?? routeConfig.get().mergeQuery)\n ? { ...this.query.data, ...options?.query }\n : { ...options?.query };\n\n const searchString = buildSearchString(query);\n const navigationUrl = `${url}${searchString}`;\n\n if (options?.replace) {\n this.history.replace(navigationUrl, options?.state);\n } else {\n this.history.push(navigationUrl, options?.state);\n }\n }\n}\n\nexport const createRouter = <TRoutesCollection extends RoutesCollection>(\n config: RouterConfiguration<TRoutesCollection>,\n) => new Router(config);\n","import {\n action,\n comparer,\n computed,\n observable,\n reaction,\n runInAction,\n} from 'mobx';\nimport type { IQueryParams } from 'mobx-location-history';\nimport { callFunction } from 'yummies/common';\nimport { applyObservable, type ObservableAnnotationsArray } from 'yummies/mobx';\nimport type { AnyObject, EmptyObject, IsPartial, Maybe } from 'yummies/types';\nimport { routeConfig } from '../config/index.js';\nimport type {\n AbstractVirtualRoute,\n VirtualOpenExtraParams,\n VirtualRouteConfiguration,\n VirtualRouteTrx,\n} from './virtual-route.types.js';\n\nconst annotations: ObservableAnnotationsArray<VirtualRoute<any>> = [\n [observable, 'params'],\n [observable.ref, 'status', 'trx', 'openChecker', 'isOuterOpened'],\n [computed, 'isOpened', 'isOpening', 'isClosing'],\n [action, 'setOpenChecker', 'open', 'close', 'destroy'],\n];\n\n/**\n * Class for creating routes with custom activation logic\n *\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html)\n */\nexport class VirtualRoute<\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n> implements AbstractVirtualRoute<TParams, TQueryParams>\n{\n private isDestroyed?: boolean;\n private disposer?: VoidFunction;\n\n query: IQueryParams<TQueryParams>;\n params: TParams | null;\n\n protected status:\n | 'opening'\n | 'open-rejected'\n | 'opened'\n | 'closing'\n | 'closed'\n | 'unknown';\n\n private openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>;\n\n private trx: Maybe<VirtualRouteTrx>;\n\n private skipAutoOpenClose: boolean;\n\n private isUpdate = false;\n\n private updateDisposer?: VoidFunction;\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isouteropened)\n */\n isOuterOpened: boolean | undefined;\n\n constructor(\n protected config: VirtualRouteConfiguration<TParams, TQueryParams> = {},\n ) {\n this.query = (config.queryParams ??\n routeConfig.get().queryParams) as IQueryParams<TQueryParams>;\n this.params = callFunction(config.initialParams, this) ?? null;\n this.openChecker = config.checkOpened;\n this.skipAutoOpenClose = false;\n this.isOuterOpened = this.openChecker?.(this);\n this.status = this.isOuterOpened ? 'opened' : 'unknown';\n\n applyObservable(this, annotations);\n\n if (this.config.abortSignal?.aborted) {\n this.isDestroyed = true;\n } else {\n this.disposer = reaction(\n () => this.openChecker?.(this),\n action((isOuterOpened) => {\n this.isOuterOpened = isOuterOpened;\n\n if (\n this.skipAutoOpenClose ||\n this.status === 'closing' ||\n this.status === 'opening'\n ) {\n return;\n }\n\n if (this.isOuterOpened) {\n if (this.status === 'opened') {\n return;\n }\n void this.confirmOpening({\n params: this.params ?? null,\n ...this.config.getAutoOpenParams?.(this),\n });\n } else {\n if (this.status === 'closed' || this.status === 'unknown') {\n return;\n }\n void this.confirmClosing();\n }\n }),\n { signal: this.config.abortSignal, fireImmediately: true },\n );\n this.updateDisposer = reaction(\n () => {\n if (this.status !== 'opened') return undefined;\n return this.query.data;\n },\n (value, prevValue) => {\n if (prevValue === undefined) return;\n if (value === undefined) return;\n this.config.afterUpdate?.(this.params, this);\n },\n {\n fireImmediately: false,\n signal: this.config.abortSignal,\n equals: comparer.structural,\n },\n );\n }\n\n if (this.status === 'opened') {\n this.config.afterOpen?.(this.params, this);\n }\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopened)\n */\n get isOpened() {\n return (\n !this.isDestroyed &&\n this.status === 'opened' &&\n this.isOuterOpened !== false\n );\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isopening)\n */\n get isOpening() {\n return this.status === 'opening';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#isclosing)\n */\n get isClosing() {\n return this.status === 'closing';\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#setopenchecker)\n */\n setOpenChecker(\n openChecker: Maybe<VirtualRouteConfiguration<TParams>['checkOpened']>,\n ) {\n this.openChecker = openChecker;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#open)\n */\n open(\n ...args: IsPartial<TParams> extends true\n ? [\n params?: Maybe<TParams>,\n extraParams?: VirtualOpenExtraParams<TQueryParams>,\n ]\n : [params: TParams, extraParams?: VirtualOpenExtraParams<TQueryParams>]\n ): Promise<void>;\n async open(...args: any[]) {\n const params = (args[0] ?? null) as unknown as TParams;\n const extra: Maybe<VirtualOpenExtraParams> = args[1];\n\n this.isUpdate = this.status === 'opened';\n this.skipAutoOpenClose = true;\n\n this.trx = {\n params,\n extra,\n manual: true,\n };\n\n await this.confirmOpening(this.trx);\n\n this.skipAutoOpenClose = false;\n }\n\n /**\n * [**Documentation**](https://js2me.github.io/mobx-route/core/VirtualRoute.html#close)\n */\n async close() {\n this.skipAutoOpenClose = true;\n const result = await this.confirmClosing();\n this.skipAutoOpenClose = false;\n return result;\n }\n\n private async confirmOpening(trx: VirtualRouteTrx) {\n runInAction(() => {\n this.trx = undefined;\n this.status = 'opening';\n });\n\n if ((await this.config.beforeOpen?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n if ((await this.config.open?.(trx.params, this)) === false) {\n runInAction(() => {\n this.status = 'open-rejected';\n this.trx = undefined;\n });\n return;\n }\n\n runInAction(() => {\n if (trx.extra?.query) {\n this.query.update(trx.extra.query, trx.extra.replace);\n }\n\n this.trx = undefined;\n this.params = trx.params;\n this.status = 'opened';\n\n if (this.isUpdate) {\n this.isUpdate = false;\n this.config.afterUpdate?.(this.params!, this);\n } else {\n this.config.afterOpen?.(this.params!, this);\n }\n });\n\n return true;\n }\n\n private async confirmClosing() {\n if (this.status === 'closed') {\n return true;\n }\n\n const lastStatus = this.status;\n\n runInAction(() => {\n this.status = 'closing';\n });\n\n if ((await this.config.beforeClose?.()) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n if (this.config.close?.(this) === false) {\n runInAction(() => {\n this.status = lastStatus;\n });\n return;\n }\n\n runInAction(() => {\n this.status = 'closed';\n this.params = null;\n });\n\n this.config.afterClose?.();\n\n return true;\n }\n\n destroy() {\n this.isDestroyed = true;\n this.status = 'unknown';\n this.disposer?.();\n this.updateDisposer?.();\n }\n}\n\nexport const createVirtualRoute = <\n TParams extends AnyObject | EmptyObject = EmptyObject,\n TQueryParams extends Record<string, any> = AnyObject,\n>(\n config?: VirtualRouteConfiguration<TParams, TQueryParams>,\n) => new VirtualRoute<TParams, TQueryParams>(config);\n"],"names":["annotations"],"mappings":";;;;;;AAWO,MAAM,cAAc;AAAA,EACzB,CAAC,QAAQ,YAAY;AACnB,QAAI;AACJ,QAAI;AAEJ,QAAI,QAAQ,SAAS;AACnB,gBAAU,OAAO;AACjB,oBAAc,OAAO;AAErB,UAAI,SAAS,WAAW,oBAAoB,QAAQ,OAAO,GAAG;AAC5D,gBAAQ,QAAQ,QAAA;AAAA,MAClB;AAAA,IACF,WAAW,SAAS,SAAS;AAC3B,gBAAU,QAAQ;AAClB,oBAAc,QAAQ,eAAe,QAAQ;AAAA,IAC/C,OAAO;AACL,gBAAU,qBAAA;AAAA,IACZ;AAEA,oBAAgB,kBAAkB,EAAE,SAAS;AAE7C,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,uBAAO,IAAI,mBAAmB;AAChC;ACTA,MAAMA,gBACJ;AAAA,EACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,CAAC,SAAS,QAAQ,kBAAkB,QAAQ;AAAA,EAC5C,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,WAAW,KAAK,UAAU,QAAQ;AACrC;AAOK,MAAM,MAMX;AAAA,EA2DA,YACE,iBACU,SAMN,IACJ;AAPU,SAAA,SAAA;AAQV,SAAK,UAAU,OAAO,WAAW,YAAY,MAAM;AACnD,SAAK,QAAS,OAAO,eACnB,YAAY,MAAM;AACpB,SAAK,kBAAkB;AACvB,SAAK,UAAU,CAAC,CAAC,KAAK,OAAO;AAC7B,SAAK,SAAS,CAAC,CAAC,KAAK,OAAO;AAC5B,SAAK,OAAO,KAAK,OAAO;AACxB,SAAK,SAAS;AACd,SAAK,SAAS,OAAO,UAAW;AAEhC,oBAAgB,MAAMA,aAAW;AAEjC,QAAI,KAAK,OAAO,aAAa,SAAS;AACpC,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,WAAW,SAAS,MAAM,KAAK,eAAe,KAAK,gBAAgB;AAAA,QACtE,iBAAiB;AAAA,MAAA,CAClB;AACD,WAAK,iBAAiB;AAAA,QACpB,MAAM;AACJ,cAAI,KAAK,WAAW,iBAAkB,QAAO;AAC7C,iBAAO,CAAC,KAAK,gBAAgB,KAAK,MAAM,IAAI;AAAA,QAC9C;AAAA,QACA,CAAC,OAAO,cAAc;AACpB,cAAI,cAAc,OAAW;AAC7B,cAAI,UAAU,OAAW;AACzB,cAAI,CAAC,KAAK,eAAgB;AAC1B,eAAK,OAAO,cAAc,KAAK,gBAAgB,IAAI;AAAA,QACrD;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,QAAQ,KAAK,OAAO;AAAA,UACpB,QAAQ,SAAS;AAAA,QAAA;AAAA,MACnB;AAEF,WAAK,OAAO,aAAa,iBAAiB,SAAS,MAAM,KAAK,WAAW;AAAA,QACvE,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAAA,EACF;AAAA,EA/CY;AAAA,EA5DJ;AAAA,EACA;AAAA,EAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV;AAAA,EAEA;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX;AAAA,EAEE;AAAA,EAOV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAuB,CAAA;AAAA,EAqDvB,IAAc,UAAU;AACtB,UAAM,UAAU,KAAK,OAAO,WAAW,YAAY,MAAM;AACzD,WAAO,SAAS,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAoD;AAC5D,QAAI;AAEJ,QAAI,QAAQ,MAAM;AAChB,wBAAkB;AAAA,IACpB,WAAW,KAAK,QAAQ;AACtB,wBAAkB,KAAK,QAAQ,SAAS,KAAK,MAAM,CAAC;AAAA,IACtD,OAAO;AACL,wBAAkB,KAAK,QAAQ,SAAS;AAAA,IAC1C;AAEA,QAAI,KAAK,SAAS;AAChB,UAAI,CAAC,gBAAgB,WAAW,KAAK,OAAO,GAAG;AAC7C,eAAO;AAAA,MACT;AAEA,wBAAkB,gBAAgB,QAAQ,KAAK,SAAS,EAAE;AAAA,IAC5D;AAEA,SACG,KAAK,oBAAoB,MAAM,KAAK,oBAAoB,SACxD,oBAAoB,OAAO,oBAAoB,KAChD;AACA,aAAO,EAAE,QAAQ,IAAW,MAAM,gBAAA;AAAA,IACpC;AAEA,SAAK,aAAa,MAAM,KAAK,WAAW;AAAA,MACtC,KAAK,KAAK,OAAO,SAAS;AAAA,MAC1B,GAAG,KAAK,OAAO;AAAA,IAAA,CAChB;AACD,UAAM,SAAS,KAAK,SAAS,eAAe;AAE5C,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAc,iBAA+C;AAC3D,WAAO,KAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,YAAY;AACd,QAAI,KAAK,WAAW,WAAW;AAC7B,aAAO;AAAA,IACT;AAEA,QACE,KAAK,eACL,CAAC,KAAK,iBACN,KAAK,WAAW,QAChB,KAAK,WAAW,oBAChB,KAAK,WAAW,iBAChB;AACA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,WAAW,YAAY,KAAK,WAAW;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAsB;AACxB,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,eAA8B;AAChC,UAAM,OAAO,KAAK;AAElB,QAAI,SAAS,MAAM;AACjB,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,KAAK,WAAW,EAAE,GAAG,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,SAA+B;AACjC,QAAI,CAAC,KAAK,gBAAgB,QAAQ;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,YAAM,SAAS,KAAK,OAAO;AAAA,QACzB,KAAK,eAAe;AAAA,QACpB,KAAK,OAAO;AAAA,MAAA;AAEd,aAAO,UAAU;AAAA,IACnB;AAEA,WACG,KAAK,gBAAgB,UAA8C;AAAA,EAExE;AAAA,EAEA,IAAc,gBAAgB;AAC5B,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAW;AACb,QACE,KAAK,eACL,CAAC,KAAK,iBACN,KAAK,WAAW,QAChB,KAAK,WAAW,kBAChB;AACA,aAAO;AAAA,IACT;AAEA;AAAA;AAAA,MAEE,CAAC,KAAK,OAAO,eAAe,KAAK,OAAO,YAAY,KAAK,cAAe;AAAA;AAAA,EAE5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAQE,iBACA,QAUA;AAGA,UAAM,EAAE,OAAO,QAAQ,OAAO,GAAG,uBAAA,IAA2B,KAAK;AAEjE,UAAM,gBAAgB,IAAI,MAMxB,GAAG,KAAK,eAAe,GAAG,eAAe,IAAI;AAAA,MAC7C,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,IAAA,CACF;AAER,SAAK,YAAY,aAAoB;AAErC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,QAAoB;AACjC,SAAK,SAAS,KAAK,GAAG,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,QAAoB;AACpC,SAAK,WAAW,KAAK,SAAS,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,KAAK,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,oBAA6B;AAC/B,WAAO,KAAK,SAAS;AAAA,MACnB,CAAC,UAAU,MAAM,YAAY,MAAM;AAAA,IAAA;AAAA,EAEvC;AAAA,EAEU,cACR,QACuB;AACvB,QAAI,UAAU,KAAM,QAAO;AAE3B,UAAM,SAAoB,CAAA;AAC1B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,SAAS,MAAM;AACjB,eAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,KAAK;AAAA,MACvE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aACK,MAWH;AACA,UAAM,SAAS,KAAK,CAAC;AACrB,UAAM,WAAW,KAAK,CAAC;AACvB,UAAM,2BAA2B,KAAK,CAAC,KAAK,KAAK;AACjD,UAAM,eACJ,OAAO,6BAA6B,YAChC,EAAE,YAAY,6BACd;AAEN,UAAM,QAAQ,cAAc,aACxB,EAAE,GAAG,KAAK,MAAM,MAAM,GAAG,SAAA,IACxB,YAAY,CAAA;AAEjB,SAAK,cAAc,QAAQ,KAAK,SAAS;AAEzC,UAAM,yBACJ;AAAA,MACE,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,IAAA;AAEJ,UAAM,kBACJ,KAAK,OAAO,YAAY,wBAAwB,KAAK,MAAM,IAAI,KAC/D,YAAY,MAAM,YAAY,wBAAwB,KAAK,MAAM,IAAI,KACrE;AAEF,QAAI;AAEJ,QAAI;AACF,aAAO,KAAK,UAAU,KAAK,cAAc,gBAAgB,MAAM,CAAC;AAAA,IAClE,SAAS,GAAG;AACV,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,gBAAQ;AAAA,UACN;AAAA,UAGA;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL,gBAAQ,MAAM,yCAAyC,CAAC;AAAA,MAC1D;AACA,aAAO,KAAK,OAAO,gBAAgB,YAAY,IAAA,EAAM,gBAAgB;AAAA,IACvE;AAEA,UAAM,MAAM,GAAG,gBAAgB,WAAW,EAAE,GAAG,KAAK,SAAS,MAAM,EAAE,GAAG,IAAI;AAE5E,QAAI,cAAc,WAAW;AAC3B,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,GAAG,GAAG,kBAAkB,gBAAgB,KAAK,CAAC;AAAA,EAC1D;AAAA,EAyCA,MAAM,QAAQ,MAAa;AACzB,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IAAA,IACV,OAAO,KAAK,CAAC,MAAM,aAAa,KAAK,SAAS,IAC7C;AAAA,MACC,SAAS,KAAK,CAAC;AAAA,MACf,OAAO,KAAK,CAAC;AAAA,IAAA,IAEb,KAAK,CAAC,KAAK,CAAA;AAEjB,UAAM,aAAa,iBAAiB,KAAK;AACzC,UAAM,QAAQ,aAAa,EAAE,GAAG,KAAK,MAAM,MAAM,GAAG,SAAA,IAAa;AAEjE,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,WAAW,SAAY,KAAK,CAAC;AAC/D,UAAM,MACJ,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC,GAAG,KAAK;AAEvE,UAAM,MAAiD;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,YAAY;AAAA,MACnB;AAAA,IAAA;AAGF,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,wBAAwB;AAC7B,UAAM,cAAc,MAAM,KAAK,eAAe,GAAG;AAEjD,QAAI,gBAAgB,MAAM;AACxB,WAAK,wBAAwB;AAC7B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EA6BA,MAAM,UAAU,MAAa;AAC3B,QAAI,KAAK,WAAW,kBAAkB;AACpC;AAAA,IACF;AAGA,QAAI,KAAK,CAAC,KAAK,MAAM;AACnB,WAAK,CAAC,IAAI,KAAK,gBAAgB;AAAA,IACjC;AAEA,UAAM,YAAY,KAAK,CAAC;AACxB,UAAM,iBAAiB,OAAO,cAAc,YAAY,cAAc;AAEtE,QAAI,gBAAgB;AAClB,WAAK,CAAC,IAAI;AAAA,QACR,SAAS;AAAA,QACT,GAAI,WAAW,YAAY,CAAA,IAAK,EAAE,YAAY,KAAA;AAAA,QAC9C,GAAG;AAAA,MAAA;AAAA,IAEP,WAAW,OAAO,cAAc,WAAW;AACzC,UAAI,KAAK,CAAC,MAAM,QAAW;AACzB,aAAK,CAAC,IAAI,EAAE,SAAS,WAAW,YAAY,KAAA;AAC5C,aAAK,SAAS;AAAA,MAChB;AAAA,IACF,WAAW,KAAK,WAAW,GAAG;AAC5B,WAAK,CAAC,IAAI,EAAE,SAAS,MAAM,YAAY,KAAA;AAAA,IACzC;AAEA,WAAQ,KAAK,KAA2C,GAAG,IAAI;AAAA,EACjE;AAAA,EAEA,IAAc,YAAY;AACxB,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,MAAM,KAAK,iBAAiB,KAAK,OAAO,YAAY;AAAA,IACxE;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAgB,eACd,KACA;AACA,QAAI,CAAC,KAAK,UAAU;AAClB,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,QAAI,oBAAoB,CAAC,CAAC,IAAI;AAE9B,QAAI,mBAAmB;AACrB,WAAK,wBAAwB;AAAA,IAC/B;AAEA,QAAI,KAAK,OAAO,YAAY;AAC1B,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,GAAG;AAEjD,UAAI,aAAa,OAAO;AACtB,oBAAY,MAAM;AAChB,eAAK,SAAS;AAAA,QAChB,CAAC;AAED;AAAA,MACF;AAGA,YAAM,SAAS,KAAK;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAEN,UAAI,WAAW,IAAI,KAAK;AACtB,YAAI,MAAM;AACV,4BAAoB;AAAA,MACtB;AAEA,UAAI,OAAO,aAAa,UAAU;AAChC,4BAAoB;AACpB,eAAO,OAAO,KAAK,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,QAAI,CAAC,mBAAmB;AACtB,UAAI,IAAI,SAAS;AACf,aAAK,QAAQ,QAAQ,IAAI,KAAK,IAAI,KAAK;AAAA,MACzC,OAAO;AACL,aAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,KAAK,eAAe;AACtB,YAAM,sBAAsB,KAAK,WAAW;AAC5C,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AAED,UAAI,KAAK,UAAU;AACjB,aAAK,WAAW;AAAA,MAElB,WAAW,CAAC,qBAAqB;AAC/B,aAAK,OAAO,YAAY,KAAK,gBAAiB,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,iBAAiB;AACzB,gBAAY,MAAM;AAChB,WAAK,SAAS;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB;AAAA,EAEvB,iBAAiB,OAAO,mBAA4B;AAC1D,QAAI,KAAK,sBAAsB;AAC7B,WAAK,uBAAuB;AAE5B,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,gBAAgB;AAElB,UAAI,KAAK,uBAAuB;AAC9B,aAAK,wBAAwB;AAC7B,YAAI,KAAK,WAAW,aAAa,KAAK,gBAAgB;AACpD,sBAAY,MAAM;AAChB,iBAAK,SAAS;AAAA,UAChB,CAAC;AACD,cAAI,KAAK,UAAU;AACjB,iBAAK,WAAW;AAChB,iBAAK,OAAO,cAAc,KAAK,gBAAgB,IAAI;AAAA,UACrD,OAAO;AACL,iBAAK,OAAO,YAAY,KAAK,gBAAgB,IAAI;AAAA,UACnD;AAAA,QACF;AAEA;AAAA,MACF;AAGA,UAAI,KAAK,WAAW,aAAa,KAAK,WAAW,kBAAkB;AACjE,oBAAY,MAAM;AAChB,eAAK,SAAS;AAAA,QAChB,CAAC;AAAA,MACH;AAGA,UAAI,KAAK,WAAW,kBAAkB;AACpC;AAAA,MACF;AAEA,YAAM,MAAiD;AAAA,QACrD,KAAK,GAAG,KAAK,eAAgB,IAAI,GAAG,kBAAkB,KAAK,MAAM,IAAI,CAAC;AAAA,QACtE,QAAQ,KAAK,eAAgB;AAAA,QAC7B,OAAO,KAAK,QAAQ,SAAS;AAAA,QAC7B,OAAO,KAAK,MAAM;AAAA,QAClB,yBAAyB;AAAA,MAAA;AAG3B,YAAM,KAAK,eAAe,GAAG;AAAA,IAC/B,OAAO;AACL,WAAK,wBAAwB;AAE7B,YAAM,cAAc,KAAK,eAAA;AAEzB,UAAI,aAAa;AACf,aAAK,OAAO,aAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAY,qBAAqB;AAC/B,WAAO,KAAK,OAAO,cAAc,YAAY,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AACR,SAAK,cAAc;AACnB,SAAK,WAAA;AACL,SAAK,WAAW;AAChB,SAAK,iBAAA;AACL,SAAK,iBAAiB;AAAA,EACxB;AACF;AAEO,MAAM,cAAc,CAOzB,MACA,WAQA,IAAI;AAAA,EACF;AAAA,EACA;AACF;ACjxBF,MAAMA,gBAA2D;AAAA,EAC/D,CAAC,UAAU,YAAY,cAAc,aAAa;AAAA,EAClD,CAAC,WAAW,SAAS,QAAQ;AAC/B;AAOO,MAAM,WAEb;AAAA,EAGE,YACE,QACQ,aACR;AADQ,SAAA,cAAA;AAER,SAAK,SAAS;AAEd,oBAAgB,MAAMA,aAAW;AAAA,EACnC;AAAA,EALU;AAAA,EAJV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,WAAoB;AACtB,UAAM,SAAS,OAAO,OAAO,KAAK,MAAM;AACxC,WAAO,OAAO;AAAA,MACZ,CAAC,UACC,MAAM,YACL,uBAAuB,SAAS,MAAM;AAAA,IAAA;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,aAAyC;AAC3C,WAAQ,KAAK,eACX,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MACzB,CAAC,UAAU,aAAa,SAAS,MAAM;AAAA,IAAA;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAuB;AACzB,QAAI,KAAK,WAAY,QAAO;AAE5B,eAAW,aAAa,KAAK,QAAQ;AACnC,YAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,UAAI,iBAAiB,cAAc,MAAM,aAAa;AACpD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,MAAa;AACnB,QAAI,KAAK,cAAc,UAAU,KAAK,YAAY;AAChD,WAAK,WAAW,KAAK,GAAG,IAAI;AAC5B;AAAA,IACF;AAEA,eAAW,aAAa,KAAK,QAAQ;AACnC,YAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,UAAI,iBAAiB,cAAc,MAAM,aAAa;AACpD,cAAM,KAAK,GAAG,IAAI;AAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,cAAQ;AAAA,QACN;AAAA,MAAA;AAAA,IAIJ,OAAO;AACL,cAAQ,KAAK,yCAAyC;AAAA,IACxD;AAAA,EACF;AACF;AAOO,MAAM,cAAc,CACzB,QACA,eACG,IAAI,WAA8B,QAAQ,UAAU;ACxGzD,MAAMA,gBAAuD;AAAA,EAC3D,CAAC,SAAS,QAAQ,UAAU;AAC9B;AAOO,MAAM,OAAmD;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAgD;AAC1D,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,WAAW,YAAY,MAAM;AACnD,SAAK,QAAQ,OAAO,eAAe,YAAY,MAAM;AAErD,oBAAgB,MAAMA,aAAW;AAAA,EACnC;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,SAAS,KAAa,SAAiC;AACrD,UAAM,QACH,SAAS,cAAc,YAAY,IAAA,EAAM,aACtC,EAAE,GAAG,KAAK,MAAM,MAAM,GAAG,SAAS,MAAA,IAClC,EAAE,GAAG,SAAS,MAAA;AAEpB,UAAM,eAAe,kBAAkB,KAAK;AAC5C,UAAM,gBAAgB,GAAG,GAAG,GAAG,YAAY;AAE3C,QAAI,SAAS,SAAS;AACpB,WAAK,QAAQ,QAAQ,eAAe,SAAS,KAAK;AAAA,IACpD,OAAO;AACL,WAAK,QAAQ,KAAK,eAAe,SAAS,KAAK;AAAA,IACjD;AAAA,EACF;AACF;AAEO,MAAM,eAAe,CAC1B,WACG,IAAI,OAAO,MAAM;ACvCtB,MAAM,cAA6D;AAAA,EACjE,CAAC,YAAY,QAAQ;AAAA,EACrB,CAAC,WAAW,KAAK,UAAU,OAAO,eAAe,eAAe;AAAA,EAChE,CAAC,UAAU,YAAY,aAAa,WAAW;AAAA,EAC/C,CAAC,QAAQ,kBAAkB,QAAQ,SAAS,SAAS;AACvD;AAOO,MAAM,aAIb;AAAA,EA8BE,YACY,SAA2D,IACrE;AADU,SAAA,SAAA;AAEV,SAAK,QAAS,OAAO,eACnB,YAAY,MAAM;AACpB,SAAK,SAAS,aAAa,OAAO,eAAe,IAAI,KAAK;AAC1D,SAAK,cAAc,OAAO;AAC1B,SAAK,oBAAoB;AACzB,SAAK,gBAAgB,KAAK,cAAc,IAAI;AAC5C,SAAK,SAAS,KAAK,gBAAgB,WAAW;AAE9C,oBAAgB,MAAM,WAAW;AAEjC,QAAI,KAAK,OAAO,aAAa,SAAS;AACpC,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,WAAW;AAAA,QACd,MAAM,KAAK,cAAc,IAAI;AAAA,QAC7B,OAAO,CAAC,kBAAkB;AACxB,eAAK,gBAAgB;AAErB,cACE,KAAK,qBACL,KAAK,WAAW,aAChB,KAAK,WAAW,WAChB;AACA;AAAA,UACF;AAEA,cAAI,KAAK,eAAe;AACtB,gBAAI,KAAK,WAAW,UAAU;AAC5B;AAAA,YACF;AACA,iBAAK,KAAK,eAAe;AAAA,cACvB,QAAQ,KAAK,UAAU;AAAA,cACvB,GAAG,KAAK,OAAO,oBAAoB,IAAI;AAAA,YAAA,CACxC;AAAA,UACH,OAAO;AACL,gBAAI,KAAK,WAAW,YAAY,KAAK,WAAW,WAAW;AACzD;AAAA,YACF;AACA,iBAAK,KAAK,eAAA;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,QACD,EAAE,QAAQ,KAAK,OAAO,aAAa,iBAAiB,KAAA;AAAA,MAAK;AAE3D,WAAK,iBAAiB;AAAA,QACpB,MAAM;AACJ,cAAI,KAAK,WAAW,SAAU,QAAO;AACrC,iBAAO,KAAK,MAAM;AAAA,QACpB;AAAA,QACA,CAAC,OAAO,cAAc;AACpB,cAAI,cAAc,OAAW;AAC7B,cAAI,UAAU,OAAW;AACzB,eAAK,OAAO,cAAc,KAAK,QAAQ,IAAI;AAAA,QAC7C;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,QAAQ,KAAK,OAAO;AAAA,UACpB,QAAQ,SAAS;AAAA,QAAA;AAAA,MACnB;AAAA,IAEJ;AAEA,QAAI,KAAK,WAAW,UAAU;AAC5B,WAAK,OAAO,YAAY,KAAK,QAAQ,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA,EAlEY;AAAA,EA9BJ;AAAA,EACA;AAAA,EAER;AAAA,EACA;AAAA,EAEU;AAAA,EAQF;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,WAAW;AAAA,EAEX;AAAA;AAAA;AAAA;AAAA,EAKR;AAAA;AAAA;AAAA;AAAA,EA0EA,IAAI,WAAW;AACb,WACE,CAAC,KAAK,eACN,KAAK,WAAW,YAChB,KAAK,kBAAkB;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,aACA;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAaA,MAAM,QAAQ,MAAa;AACzB,UAAM,SAAU,KAAK,CAAC,KAAK;AAC3B,UAAM,QAAuC,KAAK,CAAC;AAEnD,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,oBAAoB;AAEzB,SAAK,MAAM;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IAAA;AAGV,UAAM,KAAK,eAAe,KAAK,GAAG;AAElC,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ;AACZ,SAAK,oBAAoB;AACzB,UAAM,SAAS,MAAM,KAAK,eAAA;AAC1B,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,KAAsB;AACjD,gBAAY,MAAM;AAChB,WAAK,MAAM;AACX,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,QAAK,MAAM,KAAK,OAAO,aAAa,IAAI,QAAQ,IAAI,MAAO,OAAO;AAChE,kBAAY,MAAM;AAChB,aAAK,SAAS;AACd,aAAK,MAAM;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,QAAK,MAAM,KAAK,OAAO,OAAO,IAAI,QAAQ,IAAI,MAAO,OAAO;AAC1D,kBAAY,MAAM;AAChB,aAAK,SAAS;AACd,aAAK,MAAM;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,gBAAY,MAAM;AAChB,UAAI,IAAI,OAAO,OAAO;AACpB,aAAK,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO;AAAA,MACtD;AAEA,WAAK,MAAM;AACX,WAAK,SAAS,IAAI;AAClB,WAAK,SAAS;AAEd,UAAI,KAAK,UAAU;AACjB,aAAK,WAAW;AAChB,aAAK,OAAO,cAAc,KAAK,QAAS,IAAI;AAAA,MAC9C,OAAO;AACL,aAAK,OAAO,YAAY,KAAK,QAAS,IAAI;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB;AAC7B,QAAI,KAAK,WAAW,UAAU;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK;AAExB,gBAAY,MAAM;AAChB,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,QAAK,MAAM,KAAK,OAAO,cAAA,MAAqB,OAAO;AACjD,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,OAAO;AACvC,kBAAY,MAAM;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AACD;AAAA,IACF;AAEA,gBAAY,MAAM;AAChB,WAAK,SAAS;AACd,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,SAAK,OAAO,aAAA;AAEZ,WAAO;AAAA,EACT;AAAA,EAEA,UAAU;AACR,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,WAAA;AACL,SAAK,iBAAA;AAAA,EACP;AACF;AAEO,MAAM,qBAAqB,CAIhC,WACG,IAAI,aAAoC,MAAM;"}