reactive-route 0.0.1-alpha.0 → 0.0.1-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/cjs/adapters/kr-observable/index.js +40 -0
  2. package/dist/cjs/adapters/kr-observable/package.json +1 -0
  3. package/dist/cjs/adapters/mobx/index.js +44 -0
  4. package/dist/cjs/adapters/mobx/package.json +1 -0
  5. package/dist/cjs/adapters/solid/index.js +48 -0
  6. package/dist/cjs/adapters/solid/package.json +1 -0
  7. package/dist/cjs/index.js +204 -13
  8. package/dist/cjs/react/index.js +56 -98
  9. package/dist/cjs/solid/index.js +38 -97
  10. package/dist/esm/adapters/kr-observable/index.js +19 -0
  11. package/dist/esm/adapters/kr-observable/package.json +1 -0
  12. package/dist/esm/adapters/mobx/index.js +23 -0
  13. package/dist/esm/adapters/mobx/package.json +1 -0
  14. package/dist/esm/adapters/solid/index.js +27 -0
  15. package/dist/esm/adapters/solid/package.json +1 -0
  16. package/dist/esm/index.js +204 -13
  17. package/dist/esm/react/index.js +56 -98
  18. package/dist/esm/solid/index.js +37 -96
  19. package/dist/types/adapters/kr-observable.d.ts +3 -0
  20. package/dist/types/adapters/kr-observable.d.ts.map +1 -0
  21. package/dist/types/adapters/mobx.d.ts +3 -0
  22. package/dist/types/adapters/mobx.d.ts.map +1 -0
  23. package/dist/types/adapters/solid.d.ts +3 -0
  24. package/dist/types/adapters/solid.d.ts.map +1 -0
  25. package/dist/types/core/createRouterConfig.d.ts +2 -6
  26. package/dist/types/core/createRouterConfig.d.ts.map +1 -1
  27. package/dist/types/core/createRouterStore.d.ts +2 -11
  28. package/dist/types/core/createRouterStore.d.ts.map +1 -1
  29. package/dist/types/core/index.d.ts +3 -1
  30. package/dist/types/core/index.d.ts.map +1 -1
  31. package/dist/types/core/types/InterfaceRouterStore.d.ts +22 -1
  32. package/dist/types/core/types/InterfaceRouterStore.d.ts.map +1 -1
  33. package/dist/types/core/types/TypeLifecycleConfig.d.ts +13 -0
  34. package/dist/types/core/types/TypeLifecycleConfig.d.ts.map +1 -0
  35. package/dist/types/core/types/TypePropsRouter.d.ts +10 -0
  36. package/dist/types/core/types/TypePropsRouter.d.ts.map +1 -0
  37. package/dist/types/core/types/TypeRouteRaw.d.ts +3 -24
  38. package/dist/types/core/types/TypeRouteRaw.d.ts.map +1 -1
  39. package/dist/types/react/Router.d.ts +3 -11
  40. package/dist/types/react/Router.d.ts.map +1 -1
  41. package/dist/types/solid/Router.d.ts +2 -10
  42. package/dist/types/solid/Router.d.ts.map +1 -1
  43. package/dist/types/tsconfig.types.react.tsbuildinfo +1 -0
  44. package/dist/types/tsconfig.types.solid.tsbuildinfo +1 -0
  45. package/package.json +48 -21
  46. package/tsconfig.solid.json +9 -0
  47. package/tsconfig.types.react.json +11 -0
  48. package/tsconfig.types.solid.json +14 -0
  49. package/dist/types/react/useStore.d.ts +0 -8
  50. package/dist/types/react/useStore.d.ts.map +0 -1
  51. package/dist/types/solid/replaceObject.d.ts +0 -2
  52. package/dist/types/solid/replaceObject.d.ts.map +0 -1
  53. package/dist/types/solid/useStore.d.ts +0 -7
  54. package/dist/types/solid/useStore.d.ts.map +0 -1
  55. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/adapters/kr-observable.ts
21
+ var kr_observable_exports = {};
22
+ __export(kr_observable_exports, {
23
+ adapters: () => adapters
24
+ });
25
+ module.exports = __toCommonJS(kr_observable_exports);
26
+ var import_kr_observable = require("kr-observable");
27
+ var import_react = require("kr-observable/react");
28
+ var adapters = {
29
+ batch: (cb) => cb(),
30
+ autorun: import_kr_observable.autorun,
31
+ replaceObject: (obj, newObj) => {
32
+ for (const variableKey in obj) {
33
+ delete obj[variableKey];
34
+ }
35
+ Object.assign(obj, newObj);
36
+ },
37
+ makeObservable: import_kr_observable.makeObservable,
38
+ makeAutoObservable: import_kr_observable.makeObservable,
39
+ observer: import_react.observer
40
+ };
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/adapters/mobx.ts
21
+ var mobx_exports = {};
22
+ __export(mobx_exports, {
23
+ adapters: () => adapters
24
+ });
25
+ module.exports = __toCommonJS(mobx_exports);
26
+ var import_mobx = require("mobx");
27
+ var import_mobx_react_lite = require("mobx-react-lite");
28
+ var adapters = {
29
+ batch: import_mobx.runInAction,
30
+ autorun: import_mobx.autorun,
31
+ observer: import_mobx_react_lite.observer,
32
+ replaceObject: (obj, newObj) => {
33
+ (0, import_mobx.runInAction)(() => {
34
+ for (const variableKey in obj) {
35
+ if (obj.hasOwnProperty(variableKey)) {
36
+ delete obj[variableKey];
37
+ }
38
+ }
39
+ Object.assign(obj, newObj);
40
+ });
41
+ },
42
+ makeObservable: import_mobx.observable,
43
+ makeAutoObservable: import_mobx.makeAutoObservable
44
+ };
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/adapters/solid.ts
21
+ var solid_exports = {};
22
+ __export(solid_exports, {
23
+ adapters: () => adapters
24
+ });
25
+ module.exports = __toCommonJS(solid_exports);
26
+ var import_solid_js = require("solid-js");
27
+ var import_store = require("solid-js/store");
28
+ var adapters = {
29
+ batch: import_solid_js.batch,
30
+ autorun: import_solid_js.createRenderEffect,
31
+ replaceObject: (obj, newObj) => {
32
+ (0, import_store.modifyMutable)(
33
+ obj,
34
+ (0, import_store.produce)((state) => {
35
+ if (typeof state === "object" && state != null) {
36
+ for (const variableKey in state) {
37
+ if (state.hasOwnProperty(variableKey)) {
38
+ delete state[variableKey];
39
+ }
40
+ }
41
+ }
42
+ Object.assign(state || {}, newObj);
43
+ })
44
+ );
45
+ },
46
+ makeObservable: import_store.createMutable,
47
+ makeAutoObservable: import_store.createMutable
48
+ };
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
package/dist/cjs/index.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var core_exports = {};
32
32
  __export(core_exports, {
33
33
  createRouterConfig: () => createRouterConfig,
34
+ createRouterStore: () => createRouterStore,
34
35
  findRouteByPathname: () => findRouteByPathname,
35
36
  getInitialRoute: () => getInitialRoute,
36
37
  history: () => history,
@@ -53,6 +54,9 @@ function createRouterConfig(config) {
53
54
  return addNames(config);
54
55
  }
55
56
 
57
+ // packages/core/createRouterStore.ts
58
+ var import_query_string2 = __toESM(require("query-string"));
59
+
56
60
  // packages/core/utils/constants.ts
57
61
  var constants = {
58
62
  dynamicSeparator: ":",
@@ -73,6 +77,19 @@ function isDynamicRoute(route) {
73
77
  return "params" in route;
74
78
  }
75
79
 
80
+ // packages/core/utils/getDynamicValues.ts
81
+ function getDynamicValues(params) {
82
+ const { route, pathname } = params;
83
+ const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean).map((str) => decodeURIComponent(str));
84
+ const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
85
+ const dynamicParams = {};
86
+ for (let i = 0; i < routePathnameArray.length; i++) {
87
+ const paramName = routePathnameArray[i];
88
+ if (isDynamic(paramName)) dynamicParams[clearDynamic(paramName)] = pathnameArray[i];
89
+ }
90
+ return dynamicParams;
91
+ }
92
+
76
93
  // packages/core/utils/findRouteByPathname.ts
77
94
  function completeStaticMatch(pathname, path) {
78
95
  return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
@@ -104,19 +121,6 @@ function findRouteByPathname({
104
121
  return dynamicRouteMatch;
105
122
  }
106
123
 
107
- // packages/core/utils/getDynamicValues.ts
108
- function getDynamicValues(params) {
109
- const { route, pathname } = params;
110
- const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean).map((str) => decodeURIComponent(str));
111
- const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
112
- const dynamicParams = {};
113
- for (let i = 0; i < routePathnameArray.length; i++) {
114
- const paramName = routePathnameArray[i];
115
- if (isDynamic(paramName)) dynamicParams[clearDynamic(paramName)] = pathnameArray[i];
116
- }
117
- return dynamicParams;
118
- }
119
-
120
124
  // packages/core/utils/getQueryValues.ts
121
125
  var import_query_string = __toESM(require("query-string"));
122
126
 
@@ -184,3 +188,190 @@ function replaceDynamicValues({
184
188
  return encodeURIComponent(value);
185
189
  });
186
190
  }
191
+
192
+ // packages/core/createRouterStore.ts
193
+ function createRouterStore({
194
+ adapters,
195
+ routes,
196
+ routeError500,
197
+ lifecycleParams
198
+ }) {
199
+ const routerStore = adapters.makeObservable({
200
+ routesHistory: [],
201
+ currentRoute: {},
202
+ isRedirecting: false,
203
+ redirectTo: void 0,
204
+ restoreFromURL: void 0,
205
+ restoreFromServer: void 0,
206
+ adapters
207
+ });
208
+ routerStore.restoreFromServer = function restoreFromServer(obj) {
209
+ adapters.batch(() => {
210
+ routerStore.routesHistory.push(...obj.routesHistory || []);
211
+ Object.assign(routerStore.currentRoute, obj.currentRoute);
212
+ });
213
+ const preloadedRouteName = Object.keys(routes).find(
214
+ (routeName) => routerStore.currentRoute.name === routeName
215
+ );
216
+ return loadComponentToConfig({ route: routes[preloadedRouteName] });
217
+ };
218
+ routerStore.restoreFromURL = function restoreFromURL(params) {
219
+ return routerStore.redirectTo(getInitialRoute({ routes, ...params }));
220
+ };
221
+ routerStore.redirectTo = async function redirectTo(config) {
222
+ const { route: routeName, noHistoryPush, asClient } = config;
223
+ const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
224
+ let currentRoute;
225
+ let currentPathname;
226
+ let currentUrl;
227
+ let currentSearch;
228
+ let currentQuery;
229
+ if (routerStore.currentRoute?.name) {
230
+ currentRoute = routes[routerStore.currentRoute.name];
231
+ currentPathname = replaceDynamicValues({
232
+ route: currentRoute,
233
+ params: routerStore.currentRoute.params
234
+ });
235
+ currentUrl = import_query_string2.default.stringifyUrl({
236
+ url: currentPathname,
237
+ query: routerStore.currentRoute.query
238
+ });
239
+ currentQuery = routerStore.currentRoute.query;
240
+ currentSearch = import_query_string2.default.stringify(routerStore.currentRoute.query);
241
+ }
242
+ const nextRoute = routes[routeName];
243
+ const nextPathname = replaceDynamicValues({
244
+ route: nextRoute,
245
+ params: "params" in config ? config.params : void 0
246
+ });
247
+ let nextQuery;
248
+ let nextUrl = nextPathname;
249
+ let nextSearch;
250
+ if ("query" in config && config.query) {
251
+ const clearedQuery = getQueryValues({
252
+ route: nextRoute,
253
+ pathname: `${nextPathname}?${import_query_string2.default.stringify(config.query)}`
254
+ });
255
+ if (Object.keys(clearedQuery).length > 0) {
256
+ nextQuery = clearedQuery;
257
+ nextSearch = import_query_string2.default.stringify(clearedQuery);
258
+ nextUrl = import_query_string2.default.stringifyUrl({ url: nextPathname, query: clearedQuery });
259
+ }
260
+ }
261
+ if (currentUrl === nextUrl) return Promise.resolve();
262
+ if (currentPathname === nextPathname) {
263
+ if (currentSearch !== nextSearch) {
264
+ adapters.batch(() => {
265
+ adapters.replaceObject(routerStore.currentRoute.query, nextQuery || {});
266
+ routerStore.routesHistory.push(nextUrl);
267
+ });
268
+ if (history && !noHistoryPush) {
269
+ history.push({
270
+ hash: history.location.hash,
271
+ search: nextSearch,
272
+ pathname: nextPathname
273
+ });
274
+ }
275
+ }
276
+ return Promise.resolve();
277
+ }
278
+ adapters.batch(() => {
279
+ routerStore.isRedirecting = true;
280
+ });
281
+ try {
282
+ await currentRoute?.beforeLeave?.(
283
+ {
284
+ nextUrl,
285
+ nextRoute,
286
+ nextQuery,
287
+ nextSearch,
288
+ nextPathname,
289
+ currentUrl,
290
+ currentQuery,
291
+ currentRoute,
292
+ currentSearch,
293
+ currentPathname
294
+ },
295
+ ...lifecycleParams || []
296
+ );
297
+ const redirectConfig = await nextRoute.beforeEnter?.(
298
+ {
299
+ nextUrl,
300
+ nextRoute,
301
+ nextQuery,
302
+ nextSearch,
303
+ nextPathname,
304
+ currentUrl,
305
+ currentQuery,
306
+ currentRoute,
307
+ currentSearch,
308
+ currentPathname
309
+ },
310
+ ...lifecycleParams || []
311
+ );
312
+ if (typeof redirectConfig === "object") {
313
+ if (isClient) return redirectTo({ ...redirectConfig, asClient });
314
+ const redirectRoute = routes[redirectConfig.route];
315
+ const redirectParams = "params" in redirectConfig && redirectConfig.params ? redirectConfig.params : void 0;
316
+ let redirectUrl = replaceDynamicValues({
317
+ params: redirectParams,
318
+ route: redirectRoute
319
+ });
320
+ if ("query" in redirectConfig && redirectConfig.query) {
321
+ const clearedQuery = getQueryValues({
322
+ route: nextRoute,
323
+ pathname: `${nextPathname}?${import_query_string2.default.stringify(redirectConfig.query)}`
324
+ });
325
+ if (Object.keys(clearedQuery).length > 0) {
326
+ redirectUrl = import_query_string2.default.stringifyUrl({ url: redirectUrl, query: clearedQuery });
327
+ }
328
+ }
329
+ throw Object.assign(new Error(redirectUrl), { name: constants.errorRedirect });
330
+ }
331
+ await loadComponentToConfig({ route: routes[nextRoute.name] });
332
+ } catch (error) {
333
+ if (error?.name === constants.errorPrevent) return Promise.resolve();
334
+ if (error?.name === constants.errorRedirect) {
335
+ throw error;
336
+ }
337
+ console.error(error);
338
+ await loadComponentToConfig({ route: routeError500 });
339
+ adapters.batch(() => {
340
+ adapters.replaceObject(routerStore.currentRoute, {
341
+ name: routeError500.name,
342
+ path: routeError500.path,
343
+ props: routes[routeError500.name].props,
344
+ query: {},
345
+ params: {},
346
+ pageName: routes[routeError500.name].pageName
347
+ });
348
+ routerStore.isRedirecting = false;
349
+ });
350
+ return Promise.resolve();
351
+ }
352
+ adapters.batch(() => {
353
+ adapters.replaceObject(routerStore.currentRoute, {
354
+ name: nextRoute.name,
355
+ path: nextRoute.path,
356
+ props: routes[nextRoute.name].props,
357
+ query: getQueryValues({ route: nextRoute, pathname: nextUrl }),
358
+ params: getDynamicValues({ route: nextRoute, pathname: nextUrl }),
359
+ pageName: routes[nextRoute.name].pageName
360
+ });
361
+ const lastUrl = routerStore.routesHistory[routerStore.routesHistory.length - 1];
362
+ if (lastUrl !== nextUrl) {
363
+ routerStore.routesHistory.push(nextUrl);
364
+ }
365
+ if (history && !noHistoryPush) {
366
+ history.push({
367
+ hash: history.location.hash,
368
+ search: "query" in config ? `?${import_query_string2.default.stringify(config.query)}` : "",
369
+ pathname: nextPathname
370
+ });
371
+ }
372
+ routerStore.isRedirecting = false;
373
+ });
374
+ return Promise.resolve();
375
+ };
376
+ return routerStore;
377
+ }
@@ -25,124 +25,82 @@ __export(react_exports, {
25
25
  module.exports = __toCommonJS(react_exports);
26
26
 
27
27
  // packages/react/Router.tsx
28
- var import_mobx2 = require("mobx");
29
- var import_mobx_react_lite = require("mobx-react-lite");
30
- var import_reactive_route = require("reactive-route");
31
-
32
- // packages/react/useStore.ts
33
- var import_mobx = require("mobx");
34
28
  var import_react = require("react");
35
- function useStore(ViewModel, props) {
36
- const isFirstRenderRef = (0, import_react.useRef)(true);
37
- const [vm] = (0, import_react.useState)(() => {
38
- const instance = new ViewModel(props || {});
39
- (0, import_mobx.runInAction)(() => {
40
- instance.beforeMount?.();
41
- });
42
- return instance;
43
- });
44
- (0, import_react.useEffect)(() => {
45
- if (isFirstRenderRef.current) {
46
- isFirstRenderRef.current = false;
47
- } else if (props) {
48
- (0, import_mobx.runInAction)(() => {
49
- vm.props = props || {};
50
- });
51
- }
52
- }, [props]);
53
- (0, import_react.useEffect)(() => {
54
- vm.afterMount?.();
55
- return () => {
56
- vm.autorunDisposers?.forEach((disposer) => disposer());
57
- };
58
- }, []);
59
- return vm;
60
- }
61
-
62
- // packages/react/Router.tsx
29
+ var import_reactive_route = require("reactive-route");
63
30
  var import_jsx_runtime = require("react/jsx-runtime");
64
- var VM = class {
65
- constructor(props) {
66
- this.props = props;
67
- (0, import_mobx2.makeAutoObservable)(
68
- this,
69
- { loadedComponent: false, setLoadedComponent: false, props: false },
70
- { autoBind: true }
71
- );
72
- }
73
- autorunDisposers = [];
74
- loadedComponentName = void 0;
75
- loadedComponentPage = void 0;
76
- loadedComponent;
77
- currentProps = {};
78
- beforeMount() {
79
- this.props.beforeMount?.();
80
- this.redirectOnHistoryPop();
81
- this.setLoadedComponent();
82
- this.autorunDisposers.push((0, import_mobx2.autorun)(this.setLoadedComponent));
83
- }
84
- redirectOnHistoryPop() {
31
+ function RouterInner(props) {
32
+ const disposerRef = (0, import_react.useRef)(null);
33
+ const redirectOnHistoryPop = (0, import_react.useCallback)(() => {
85
34
  if (!import_reactive_route.history) return;
86
35
  import_reactive_route.history.listen((params) => {
87
36
  if (params.action !== "POP") return;
88
- const previousRoutePathname = this.props.routerStore.routesHistory[this.props.routerStore.routesHistory.length - 2];
37
+ const previousRoutePathname = props.routerStore.routesHistory[props.routerStore.routesHistory.length - 2];
89
38
  if (previousRoutePathname === params.location.pathname) {
90
- (0, import_mobx2.runInAction)(() => this.props.routerStore.routesHistory.pop());
39
+ props.routerStore.adapters.batch(() => props.routerStore.routesHistory.pop());
91
40
  }
92
- void this.props.routerStore.redirectTo({
41
+ void props.routerStore.redirectTo({
93
42
  noHistoryPush: true,
94
43
  ...(0, import_reactive_route.getInitialRoute)({
95
- routes: this.props.routes,
44
+ routes: props.routes,
96
45
  pathname: import_reactive_route.history.location.pathname,
97
46
  fallback: "error404"
98
47
  })
99
48
  });
100
49
  });
101
- }
102
- setLoadedComponent = () => {
103
- const { loadedComponentName, loadedComponentPage } = this;
104
- const { currentRoute, isRedirecting } = this.props.routerStore;
105
- const currentRouteName = currentRoute.name;
106
- const currentRoutePage = currentRoute.pageName;
50
+ }, []);
51
+ const [config] = (0, import_react.useState)(
52
+ () => props.routerStore.adapters.makeObservable({
53
+ loadedComponentName: void 0,
54
+ loadedComponentPage: void 0,
55
+ currentProps: {}
56
+ })
57
+ );
58
+ const setLoadedComponent = (0, import_react.useCallback)(() => {
59
+ const { loadedComponentName, loadedComponentPage } = config;
60
+ const { currentRoute, isRedirecting } = props.routerStore;
61
+ const componentConfig = props.routes[currentRoute.name];
107
62
  let preventRedirect = false;
108
63
  if (isRedirecting) preventRedirect = true;
109
- else if (loadedComponentName === currentRouteName) preventRedirect = true;
110
- else if (loadedComponentPage != null && currentRouteName != null) {
111
- if (loadedComponentPage === currentRoutePage) {
112
- const componentConfig = this.props.routes[currentRouteName];
113
- (0, import_mobx2.runInAction)(() => {
114
- this.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
64
+ else if (loadedComponentName === currentRoute.name) preventRedirect = true;
65
+ else if (loadedComponentPage != null && currentRoute.name != null) {
66
+ if (loadedComponentPage === currentRoute.pageName) {
67
+ props.routerStore.adapters.batch(() => {
68
+ config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
69
+ config[Symbol.for("$adm")]?.batch();
115
70
  });
116
71
  preventRedirect = true;
117
72
  }
118
73
  }
119
74
  if (preventRedirect) return;
120
- (0, import_mobx2.runInAction)(() => {
121
- if (!loadedComponentName) {
122
- this.setComponent(currentRouteName);
123
- } else {
124
- this.props.beforeUpdatePageComponent?.();
125
- this.setComponent(currentRouteName);
126
- }
75
+ props.routerStore.adapters.batch(() => {
76
+ if (loadedComponentName) props.beforeUpdatePageComponent?.();
77
+ props.beforeSetPageComponent?.(componentConfig);
78
+ config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
79
+ config.loadedComponentName = currentRoute.name;
80
+ config.loadedComponentPage = componentConfig.pageName;
81
+ config[Symbol.for("$adm")]?.batch();
127
82
  });
128
- };
129
- setComponent(currentRouteName) {
130
- (0, import_mobx2.runInAction)(() => {
131
- const componentConfig = this.props.routes[currentRouteName];
132
- const RouteComponent = componentConfig.component;
133
- this.props.beforeSetPageComponent?.(componentConfig);
134
- this.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
135
- this.loadedComponentName = currentRouteName;
136
- this.loadedComponentPage = componentConfig.pageName;
137
- this.loadedComponent = RouteComponent;
83
+ }, []);
84
+ (0, import_react.useState)(() => {
85
+ props.routerStore.adapters.batch(() => {
86
+ props.beforeMount?.();
87
+ redirectOnHistoryPop();
88
+ setLoadedComponent();
89
+ disposerRef.current = props.routerStore.adapters.autorun(setLoadedComponent);
138
90
  });
139
- }
140
- };
141
- var Router = (0, import_mobx_react_lite.observer)(
142
- (props) => {
143
- const vm = useStore(VM, props);
144
- const LoadedComponent = vm.loadedComponentName ? vm.loadedComponent : null;
145
- if (LoadedComponent) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadedComponent, { ...vm.currentProps });
146
- return null;
147
- }
148
- );
91
+ });
92
+ (0, import_react.useEffect)(() => {
93
+ return () => {
94
+ disposerRef.current?.();
95
+ };
96
+ }, []);
97
+ if (!config.loadedComponentName) return null;
98
+ const LoadedComponent = props.routes[config.loadedComponentName]?.component || null;
99
+ if (LoadedComponent) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadedComponent, { ...config.currentProps });
100
+ return null;
101
+ }
102
+ function RouterWrapper(props) {
103
+ const Component = props.routerStore.adapters.observer ? props.routerStore.adapters.observer(RouterInner) : RouterInner;
104
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...props });
105
+ }
106
+ var Router = (0, import_react.memo)(RouterWrapper);