reactive-route 0.0.1-alpha.1 → 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 +68 -54
  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 +68 -54
  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 +2 -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
@@ -90,6 +90,37 @@ function getDynamicValues(params) {
90
90
  return dynamicParams;
91
91
  }
92
92
 
93
+ // packages/core/utils/findRouteByPathname.ts
94
+ function completeStaticMatch(pathname, path) {
95
+ return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
96
+ }
97
+ function findRouteByPathname({
98
+ pathname,
99
+ routes
100
+ }) {
101
+ let dynamicRouteMatch;
102
+ const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
103
+ for (const routeName in routes) {
104
+ if (!Object.hasOwn(routes, routeName)) continue;
105
+ const route = routes[routeName];
106
+ if (completeStaticMatch(pathname, route.path)) return route;
107
+ if (dynamicRouteMatch) continue;
108
+ const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
109
+ if (routePathnameArray.length !== pathnameArray.length) continue;
110
+ const someParamInvalid = routePathnameArray.some((paramName, i) => {
111
+ const paramFromUrl = pathnameArray[i];
112
+ if (!isDynamic(paramName)) return paramName !== paramFromUrl;
113
+ const validator = route.params?.[clearDynamic(paramName)];
114
+ if (typeof validator !== "function") {
115
+ throw new Error(`findRoute: missing validator for param "${paramName}"`);
116
+ }
117
+ return !validator(paramFromUrl);
118
+ });
119
+ if (!someParamInvalid) dynamicRouteMatch = route;
120
+ }
121
+ return dynamicRouteMatch;
122
+ }
123
+
93
124
  // packages/core/utils/getQueryValues.ts
94
125
  var import_query_string = __toESM(require("query-string"));
95
126
 
@@ -111,6 +142,16 @@ function getQueryValues(params) {
111
142
  return query;
112
143
  }
113
144
 
145
+ // packages/core/utils/getInitialRoute.ts
146
+ function getInitialRoute(params) {
147
+ const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes[params.fallback];
148
+ return {
149
+ route: route.name,
150
+ query: getQueryValues({ route, pathname: params.pathname }),
151
+ params: getDynamicValues({ route, pathname: params.pathname })
152
+ };
153
+ }
154
+
114
155
  // packages/core/utils/history.ts
115
156
  var import_history = require("history");
116
157
  var history = constants.isClient ? (0, import_history.createBrowserHistory)() : null;
@@ -150,19 +191,33 @@ function replaceDynamicValues({
150
191
 
151
192
  // packages/core/createRouterStore.ts
152
193
  function createRouterStore({
153
- batch,
194
+ adapters,
154
195
  routes,
155
196
  routeError500,
156
- makeObservable,
157
- lifecycleParams,
158
- replaceObject
197
+ lifecycleParams
159
198
  }) {
160
- const routerStore = makeObservable({
199
+ const routerStore = adapters.makeObservable({
161
200
  routesHistory: [],
162
201
  currentRoute: {},
163
202
  isRedirecting: false,
164
- redirectTo: void 0
203
+ redirectTo: void 0,
204
+ restoreFromURL: void 0,
205
+ restoreFromServer: void 0,
206
+ adapters
165
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
+ };
166
221
  routerStore.redirectTo = async function redirectTo(config) {
167
222
  const { route: routeName, noHistoryPush, asClient } = config;
168
223
  const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
@@ -206,8 +261,8 @@ function createRouterStore({
206
261
  if (currentUrl === nextUrl) return Promise.resolve();
207
262
  if (currentPathname === nextPathname) {
208
263
  if (currentSearch !== nextSearch) {
209
- batch(() => {
210
- replaceObject(routerStore.currentRoute.query, nextQuery || {});
264
+ adapters.batch(() => {
265
+ adapters.replaceObject(routerStore.currentRoute.query, nextQuery || {});
211
266
  routerStore.routesHistory.push(nextUrl);
212
267
  });
213
268
  if (history && !noHistoryPush) {
@@ -220,7 +275,7 @@ function createRouterStore({
220
275
  }
221
276
  return Promise.resolve();
222
277
  }
223
- batch(() => {
278
+ adapters.batch(() => {
224
279
  routerStore.isRedirecting = true;
225
280
  });
226
281
  try {
@@ -281,8 +336,8 @@ function createRouterStore({
281
336
  }
282
337
  console.error(error);
283
338
  await loadComponentToConfig({ route: routeError500 });
284
- batch(() => {
285
- replaceObject(routerStore.currentRoute, {
339
+ adapters.batch(() => {
340
+ adapters.replaceObject(routerStore.currentRoute, {
286
341
  name: routeError500.name,
287
342
  path: routeError500.path,
288
343
  props: routes[routeError500.name].props,
@@ -294,8 +349,8 @@ function createRouterStore({
294
349
  });
295
350
  return Promise.resolve();
296
351
  }
297
- batch(() => {
298
- replaceObject(routerStore.currentRoute, {
352
+ adapters.batch(() => {
353
+ adapters.replaceObject(routerStore.currentRoute, {
299
354
  name: nextRoute.name,
300
355
  path: nextRoute.path,
301
356
  props: routes[nextRoute.name].props,
@@ -320,44 +375,3 @@ function createRouterStore({
320
375
  };
321
376
  return routerStore;
322
377
  }
323
-
324
- // packages/core/utils/findRouteByPathname.ts
325
- function completeStaticMatch(pathname, path) {
326
- return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
327
- }
328
- function findRouteByPathname({
329
- pathname,
330
- routes
331
- }) {
332
- let dynamicRouteMatch;
333
- const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
334
- for (const routeName in routes) {
335
- if (!Object.hasOwn(routes, routeName)) continue;
336
- const route = routes[routeName];
337
- if (completeStaticMatch(pathname, route.path)) return route;
338
- if (dynamicRouteMatch) continue;
339
- const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
340
- if (routePathnameArray.length !== pathnameArray.length) continue;
341
- const someParamInvalid = routePathnameArray.some((paramName, i) => {
342
- const paramFromUrl = pathnameArray[i];
343
- if (!isDynamic(paramName)) return paramName !== paramFromUrl;
344
- const validator = route.params?.[clearDynamic(paramName)];
345
- if (typeof validator !== "function") {
346
- throw new Error(`findRoute: missing validator for param "${paramName}"`);
347
- }
348
- return !validator(paramFromUrl);
349
- });
350
- if (!someParamInvalid) dynamicRouteMatch = route;
351
- }
352
- return dynamicRouteMatch;
353
- }
354
-
355
- // packages/core/utils/getInitialRoute.ts
356
- function getInitialRoute(params) {
357
- const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes[params.fallback];
358
- return {
359
- route: route.name,
360
- query: getQueryValues({ route, pathname: params.pathname }),
361
- params: getDynamicValues({ route, pathname: params.pathname })
362
- };
363
- }
@@ -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);
@@ -28,133 +28,74 @@ module.exports = __toCommonJS(solid_exports);
28
28
  var import_web = require("solid-js/web");
29
29
  var import_web2 = require("solid-js/web");
30
30
  var import_reactive_route = require("reactive-route");
31
- var import_solid_js2 = require("solid-js");
32
- var import_store2 = require("solid-js/store");
33
- var import_web3 = require("solid-js/web");
34
-
35
- // packages/solid/replaceObject.ts
36
- var import_store = require("solid-js/store");
37
- function replaceObject(obj, newObj) {
38
- (0, import_store.modifyMutable)(obj, (0, import_store.produce)((state) => {
39
- if (typeof state === "object" && state != null) {
40
- for (const variableKey in state) {
41
- delete state[variableKey];
42
- }
43
- }
44
- Object.assign(state || {}, newObj);
45
- }));
46
- }
47
-
48
- // packages/solid/useStore.ts
49
31
  var import_solid_js = require("solid-js");
50
- var getAllProperties = (object) => {
51
- const properties = /* @__PURE__ */ new Set();
52
- do {
53
- for (const key of Reflect.ownKeys(object)) {
54
- properties.add([object, key]);
55
- }
56
- } while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype);
57
- return properties;
58
- };
59
- function autoBind(self) {
60
- for (const [object, key] of getAllProperties(self.constructor.prototype)) {
61
- if (key === "constructor") continue;
62
- const descriptor = Reflect.getOwnPropertyDescriptor(object, key);
63
- if (descriptor && typeof descriptor.value === "function") {
64
- self[key] = self[key].bind(self);
65
- }
66
- }
67
- return self;
68
- }
69
- function useStore(ViewModel, props) {
70
- const vm = new ViewModel(props);
71
- autoBind(vm);
72
- vm.beforeMount?.();
73
- (0, import_solid_js.onMount)(() => {
74
- vm.afterMount?.();
32
+ var import_web3 = require("solid-js/web");
33
+ function Router(props) {
34
+ const config = props.routerStore.adapters.makeObservable({
35
+ loadedComponentName: void 0,
36
+ loadedComponentPage: void 0,
37
+ currentProps: {}
75
38
  });
76
- return vm;
77
- }
78
-
79
- // packages/solid/Router.tsx
80
- var VM = class {
81
- constructor(props) {
82
- this.props = props;
83
- return (0, import_store2.createMutable)(this);
84
- }
85
- loadedComponentName = void 0;
86
- loadedComponentPage = void 0;
87
- currentProps = {};
88
- beforeMount() {
89
- this.props.beforeMount?.();
90
- this.redirectOnHistoryPop();
91
- (0, import_solid_js2.createRenderEffect)(() => this.setLoadedComponent());
92
- }
93
- redirectOnHistoryPop() {
39
+ function redirectOnHistoryPop() {
94
40
  if (!import_reactive_route.history) return;
95
41
  import_reactive_route.history.listen((params) => {
96
42
  if (params.action !== "POP") return;
97
- const previousRoutePathname = this.props.routerStore.routesHistory[this.props.routerStore.routesHistory.length - 2];
43
+ const previousRoutePathname = props.routerStore.routesHistory[props.routerStore.routesHistory.length - 2];
98
44
  if (previousRoutePathname === params.location.pathname) {
99
- this.props.routerStore.routesHistory.pop();
45
+ props.routerStore.routesHistory.pop();
100
46
  }
101
- void this.props.routerStore.redirectTo({
47
+ void props.routerStore.redirectTo({
102
48
  noHistoryPush: true,
103
49
  ...(0, import_reactive_route.getInitialRoute)({
104
- routes: this.props.routes,
50
+ routes: props.routes,
105
51
  pathname: import_reactive_route.history.location.pathname,
106
52
  fallback: "error404"
107
53
  })
108
54
  });
109
55
  });
110
56
  }
111
- setLoadedComponent() {
112
- const currentRouteName = this.props.routerStore.currentRoute.name;
113
- const currentRoutePage = this.props.routerStore.currentRoute.pageName;
57
+ function setLoadedComponent() {
58
+ const currentRouteName = props.routerStore.currentRoute.name;
59
+ const currentRoutePage = props.routerStore.currentRoute.pageName;
60
+ const componentConfig = props.routes[currentRouteName];
114
61
  let preventRedirect = false;
115
- if (this.props.routerStore.isRedirecting) preventRedirect = true;
116
- else if (this.loadedComponentName === currentRouteName) {
62
+ if (props.routerStore.isRedirecting) preventRedirect = true;
63
+ else if (config.loadedComponentName === currentRouteName) {
117
64
  preventRedirect = true;
118
- } else if (this.loadedComponentPage != null && currentRouteName != null) {
119
- if (this.loadedComponentPage === currentRoutePage) {
120
- const componentConfig = this.props.routes[currentRouteName];
121
- replaceObject(this.currentProps, "props" in componentConfig ? componentConfig.props : {});
65
+ } else if (config.loadedComponentPage != null && currentRouteName != null) {
66
+ if (config.loadedComponentPage === currentRoutePage) {
67
+ props.routerStore.adapters.replaceObject(config.currentProps, "props" in componentConfig ? componentConfig.props : {});
122
68
  preventRedirect = true;
123
69
  }
124
70
  }
125
71
  if (preventRedirect) return;
126
- (0, import_solid_js2.batch)(() => {
127
- if (!this.loadedComponentName) {
128
- this.setComponent();
129
- } else {
130
- this.props.beforeUpdatePageComponent?.();
131
- this.setComponent();
72
+ props.routerStore.adapters.batch(() => {
73
+ if (config.loadedComponentName) {
74
+ props.beforeUpdatePageComponent?.();
132
75
  }
76
+ props.beforeSetPageComponent?.(componentConfig);
77
+ props.routerStore.adapters.batch(() => {
78
+ props.routerStore.adapters.replaceObject(config.currentProps, "props" in componentConfig ? componentConfig.props : {});
79
+ config.loadedComponentName = currentRouteName;
80
+ config.loadedComponentPage = componentConfig.pageName;
81
+ config[Symbol.for("$adm")]?.batch();
82
+ });
133
83
  });
134
84
  }
135
- setComponent() {
136
- const currentRouteName = this.props.routerStore.currentRoute.name;
137
- const componentConfig = this.props.routes[currentRouteName];
138
- this.props.beforeSetPageComponent?.(componentConfig);
139
- (0, import_solid_js2.batch)(() => {
140
- replaceObject(this.currentProps, "props" in componentConfig ? componentConfig.props : {});
141
- this.loadedComponentName = currentRouteName;
142
- this.loadedComponentPage = componentConfig.pageName;
143
- });
144
- }
145
- };
146
- function Router(props) {
147
- const vm = useStore(VM, props);
148
- return (0, import_web.createComponent)(import_solid_js2.Show, {
85
+ props.beforeMount?.();
86
+ redirectOnHistoryPop();
87
+ setLoadedComponent();
88
+ props.routerStore.adapters.autorun(() => setLoadedComponent());
89
+ return (0, import_web.createComponent)(import_solid_js.Show, {
149
90
  get when() {
150
- return vm.loadedComponentName;
91
+ return config.loadedComponentName;
151
92
  },
152
93
  get children() {
153
94
  return (0, import_web.createComponent)(import_web3.Dynamic, (0, import_web2.mergeProps)({
154
95
  get component() {
155
- return props.routes[vm.loadedComponentName]?.component || void 0;
96
+ return props.routes[config.loadedComponentName]?.component || void 0;
156
97
  }
157
- }, () => vm.currentProps));
98
+ }, () => config.currentProps));
158
99
  }
159
100
  });
160
101
  }