reactive-route 0.0.1-alpha.16 → 0.0.1-alpha.18

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 (34) hide show
  1. package/dist/adapters/kr-observable-preact.d.ts +3 -0
  2. package/dist/adapters/kr-observable-preact.d.ts.map +1 -0
  3. package/dist/adapters/mobx-preact.d.ts +3 -0
  4. package/dist/adapters/mobx-preact.d.ts.map +1 -0
  5. package/dist/adapters/mobx-solid.d.ts +3 -0
  6. package/dist/adapters/mobx-solid.d.ts.map +1 -0
  7. package/dist/cjs/adapters/kr-observable-preact/index.js +39 -0
  8. package/dist/cjs/adapters/kr-observable-preact/package.json +1 -0
  9. package/dist/cjs/adapters/mobx-preact/index.js +43 -0
  10. package/dist/cjs/adapters/mobx-preact/package.json +1 -0
  11. package/dist/cjs/adapters/mobx-solid/index.js +41 -0
  12. package/dist/cjs/adapters/mobx-solid/package.json +1 -0
  13. package/dist/cjs/index.js +22 -36
  14. package/dist/cjs/preact/index.js +104 -0
  15. package/dist/cjs/preact/package.json +1 -0
  16. package/dist/core/createRouterStore.d.ts.map +1 -1
  17. package/dist/core/types/TypeRedirectToParams.d.ts +0 -4
  18. package/dist/core/types/TypeRedirectToParams.d.ts.map +1 -1
  19. package/dist/esm/adapters/kr-observable-preact/index.js +18 -0
  20. package/dist/esm/adapters/kr-observable-preact/package.json +1 -0
  21. package/dist/esm/adapters/mobx-preact/index.js +22 -0
  22. package/dist/esm/adapters/mobx-preact/package.json +1 -0
  23. package/dist/esm/adapters/mobx-solid/index.js +20 -0
  24. package/dist/esm/adapters/mobx-solid/package.json +1 -0
  25. package/dist/esm/index.js +22 -36
  26. package/dist/esm/preact/index.js +81 -0
  27. package/dist/esm/preact/package.json +1 -0
  28. package/dist/preact/Router.d.ts +3 -0
  29. package/dist/preact/Router.d.ts.map +1 -0
  30. package/dist/preact/index.d.ts +2 -0
  31. package/dist/preact/index.d.ts.map +1 -0
  32. package/dist/solid/Router.d.ts.map +1 -1
  33. package/dist/tsconfig.types.react.tsbuildinfo +1 -1
  34. package/package.json +28 -9
@@ -0,0 +1,3 @@
1
+ import { TypeAdapters } from 'reactive-route';
2
+ export declare const adapters: TypeAdapters;
3
+ //# sourceMappingURL=kr-observable-preact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kr-observable-preact.d.ts","sourceRoot":"","sources":["../../packages/adapters/kr-observable-preact.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,YAYtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TypeAdapters } from 'reactive-route';
2
+ export declare const adapters: TypeAdapters;
3
+ //# sourceMappingURL=mobx-preact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobx-preact.d.ts","sourceRoot":"","sources":["../../packages/adapters/mobx-preact.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,YAetB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TypeAdapters } from 'reactive-route';
2
+ export declare const adapters: TypeAdapters;
3
+ //# sourceMappingURL=mobx-solid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobx-solid.d.ts","sourceRoot":"","sources":["../../packages/adapters/mobx-solid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,YActB,CAAC"}
@@ -0,0 +1,39 @@
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-preact.ts
21
+ var kr_observable_preact_exports = {};
22
+ __export(kr_observable_preact_exports, {
23
+ adapters: () => adapters
24
+ });
25
+ module.exports = __toCommonJS(kr_observable_preact_exports);
26
+ var import_kr_observable = require("kr-observable");
27
+ var import_preact = require("kr-observable/preact");
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
+ observer: import_preact.observer
39
+ };
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,43 @@
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-preact.ts
21
+ var mobx_preact_exports = {};
22
+ __export(mobx_preact_exports, {
23
+ adapters: () => adapters
24
+ });
25
+ module.exports = __toCommonJS(mobx_preact_exports);
26
+ var import_mobx = require("mobx");
27
+ var import_mobx_preact = require("mobx-preact");
28
+ var adapters = {
29
+ batch: import_mobx.runInAction,
30
+ autorun: import_mobx.autorun,
31
+ observer: import_mobx_preact.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
+ };
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,41 @@
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-solid.ts
21
+ var mobx_solid_exports = {};
22
+ __export(mobx_solid_exports, {
23
+ adapters: () => adapters
24
+ });
25
+ module.exports = __toCommonJS(mobx_solid_exports);
26
+ var import_mobx = require("mobx");
27
+ var adapters = {
28
+ batch: import_mobx.runInAction,
29
+ autorun: import_mobx.autorun,
30
+ replaceObject: (obj, newObj) => {
31
+ (0, import_mobx.runInAction)(() => {
32
+ for (const variableKey in obj) {
33
+ if (obj.hasOwnProperty(variableKey)) {
34
+ delete obj[variableKey];
35
+ }
36
+ }
37
+ Object.assign(obj, newObj);
38
+ });
39
+ },
40
+ makeObservable: import_mobx.observable
41
+ };
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
package/dist/cjs/index.js CHANGED
@@ -218,8 +218,7 @@ function createRouterStore({
218
218
  return routerStore.redirectTo(getInitialRoute({ routes, pathname: params.pathname }));
219
219
  };
220
220
  routerStore.redirectTo = async function redirectTo(config) {
221
- const { route: routeName, noHistoryPush, asClient } = config;
222
- const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
221
+ const { route: routeName, noHistoryPush } = config;
223
222
  let currentRoute;
224
223
  let currentPathname;
225
224
  let currentUrl;
@@ -261,7 +260,10 @@ function createRouterStore({
261
260
  if (currentPathname === nextPathname) {
262
261
  if (currentSearch !== nextSearch) {
263
262
  adapters.batch(() => {
264
- adapters.replaceObject(routerStore.currentRoute.query, nextQuery || {});
263
+ adapters.replaceObject(routerStore.currentRoute, {
264
+ ...routerStore.currentRoute,
265
+ query: nextQuery || {}
266
+ });
265
267
  routerStore.routesHistory.push(nextUrl);
266
268
  });
267
269
  if (history && !noHistoryPush) {
@@ -278,38 +280,22 @@ function createRouterStore({
278
280
  routerStore.isRedirecting = true;
279
281
  });
280
282
  try {
281
- await currentRoute?.beforeLeave?.(
282
- {
283
- nextUrl,
284
- nextRoute,
285
- nextQuery,
286
- nextSearch,
287
- nextPathname,
288
- currentUrl,
289
- currentQuery,
290
- currentRoute,
291
- currentSearch,
292
- currentPathname
293
- },
294
- ...lifecycleParams || []
295
- );
296
- const redirectConfig = await nextRoute.beforeEnter?.(
297
- {
298
- nextUrl,
299
- nextRoute,
300
- nextQuery,
301
- nextSearch,
302
- nextPathname,
303
- currentUrl,
304
- currentQuery,
305
- currentRoute,
306
- currentSearch,
307
- currentPathname
308
- },
309
- ...lifecycleParams || []
310
- );
283
+ const config2 = {
284
+ nextUrl,
285
+ nextRoute,
286
+ nextQuery,
287
+ nextSearch,
288
+ nextPathname,
289
+ currentUrl,
290
+ currentQuery,
291
+ currentRoute,
292
+ currentSearch,
293
+ currentPathname
294
+ };
295
+ await currentRoute?.beforeLeave?.(config2, ...lifecycleParams || []);
296
+ const redirectConfig = await nextRoute.beforeEnter?.(config2, ...lifecycleParams || []);
311
297
  if (typeof redirectConfig === "object") {
312
- if (isClient) return redirectTo({ ...redirectConfig, asClient });
298
+ if (constants.isClient) return redirectTo(redirectConfig);
313
299
  const redirectRoute = routes[redirectConfig.route];
314
300
  const redirectParams = "params" in redirectConfig && redirectConfig.params ? redirectConfig.params : void 0;
315
301
  let redirectUrl = replaceDynamicValues({
@@ -340,8 +326,8 @@ function createRouterStore({
340
326
  name: routes.internalError.name,
341
327
  path: routes.internalError.path,
342
328
  props: routes[routes.internalError.name].props,
343
- query: {},
344
- params: {},
329
+ query: adapters.makeObservable({}),
330
+ params: adapters.makeObservable({}),
345
331
  pageName: routes[routes.internalError.name].pageName
346
332
  });
347
333
  routerStore.isRedirecting = false;
@@ -0,0 +1,104 @@
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/preact/index.ts
21
+ var preact_exports = {};
22
+ __export(preact_exports, {
23
+ Router: () => Router
24
+ });
25
+ module.exports = __toCommonJS(preact_exports);
26
+
27
+ // packages/preact/Router.tsx
28
+ var import_hooks = require("preact/hooks");
29
+ var import_reactive_route = require("reactive-route");
30
+ var import_jsx_runtime = require("preact/jsx-runtime");
31
+ function RouterInner(props) {
32
+ const disposerRef = (0, import_hooks.useRef)(null);
33
+ const redirectOnHistoryPop = (0, import_hooks.useCallback)(() => {
34
+ if (!import_reactive_route.history) return;
35
+ import_reactive_route.history.listen((params) => {
36
+ if (params.action !== "POP") return;
37
+ const previousRoutePathname = props.routerStore.routesHistory[props.routerStore.routesHistory.length - 2];
38
+ if (previousRoutePathname === params.location.pathname) {
39
+ props.routerStore.adapters.batch(() => props.routerStore.routesHistory.pop());
40
+ }
41
+ void props.routerStore.redirectTo({
42
+ noHistoryPush: true,
43
+ ...(0, import_reactive_route.getInitialRoute)({
44
+ routes: props.routes,
45
+ pathname: import_reactive_route.history.location.pathname
46
+ })
47
+ });
48
+ });
49
+ }, []);
50
+ const [config] = (0, import_hooks.useState)(
51
+ () => props.routerStore.adapters.makeObservable({
52
+ loadedComponentName: void 0,
53
+ loadedComponentPage: void 0,
54
+ currentProps: {}
55
+ })
56
+ );
57
+ const setLoadedComponent = (0, import_hooks.useCallback)(() => {
58
+ const { loadedComponentName, loadedComponentPage } = config;
59
+ const { currentRoute, isRedirecting } = props.routerStore;
60
+ const componentConfig = props.routes[currentRoute.name];
61
+ let preventRedirect = false;
62
+ if (isRedirecting) preventRedirect = true;
63
+ else if (loadedComponentName === currentRoute.name) preventRedirect = true;
64
+ else if (loadedComponentPage != null && currentRoute.name != null) {
65
+ if (loadedComponentPage === currentRoute.pageName) {
66
+ props.routerStore.adapters.batch(() => {
67
+ config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
68
+ });
69
+ preventRedirect = true;
70
+ }
71
+ }
72
+ if (preventRedirect) return;
73
+ props.routerStore.adapters.batch(() => {
74
+ if (loadedComponentName) props.beforeUpdatePageComponent?.();
75
+ props.beforeSetPageComponent?.(componentConfig);
76
+ config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
77
+ config.loadedComponentName = currentRoute.name;
78
+ config.loadedComponentPage = componentConfig.pageName;
79
+ });
80
+ }, []);
81
+ (0, import_hooks.useState)(() => {
82
+ props.routerStore.adapters.batch(() => {
83
+ props.beforeMount?.();
84
+ redirectOnHistoryPop();
85
+ setLoadedComponent();
86
+ disposerRef.current = props.routerStore.adapters.autorun(setLoadedComponent);
87
+ });
88
+ });
89
+ (0, import_hooks.useEffect)(() => {
90
+ return () => {
91
+ disposerRef.current?.();
92
+ };
93
+ }, []);
94
+ if (!config.loadedComponentName) return null;
95
+ const LoadedComponent = props.routes[config.loadedComponentName]?.component || null;
96
+ if (LoadedComponent) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadedComponent, { ...config.currentProps });
97
+ return null;
98
+ }
99
+ function Router(props) {
100
+ const [Component] = (0, import_hooks.useState)(
101
+ () => props.routerStore.adapters.observer ? props.routerStore.adapters.observer(RouterInner) : RouterInner
102
+ );
103
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...props });
104
+ }
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -1 +1 @@
1
- {"version":3,"file":"createRouterStore.d.ts","sourceRoot":"","sources":["../../packages/core/createRouterStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE3F,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAS9C,wBAAgB,iBAAiB,CAC/B,OAAO,SAAS,MAAM,CAAC,MAAM,GAAG,UAAU,GAAG,eAAe,EAAE,SAAS,CAAC,EACxE,EACA,QAAQ,EACR,MAAM,EACN,eAAe,GAChB,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CA0PhE"}
1
+ {"version":3,"file":"createRouterStore.d.ts","sourceRoot":"","sources":["../../packages/core/createRouterStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAG3F,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAS9C,wBAAgB,iBAAiB,CAC/B,OAAO,SAAS,MAAM,CAAC,MAAM,GAAG,UAAU,GAAG,eAAe,EAAE,SAAS,CAAC,EACxE,EACA,QAAQ,EACR,MAAM,EACN,eAAe,GAChB,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CA4OhE"}
@@ -4,21 +4,17 @@ export type TypeRedirectToParams<TRoutes extends Record<string, TypeRoute>, TRou
4
4
  route: TRouteName;
5
5
  params: Record<keyof TRoutes[TRouteName]['params'], string>;
6
6
  query?: Partial<Record<keyof TRoutes[TRouteName]['query'], string>>;
7
- asClient?: boolean;
8
7
  noHistoryPush?: boolean;
9
8
  } : {
10
9
  route: TRouteName;
11
10
  params: Record<keyof TRoutes[TRouteName]['params'], string>;
12
- asClient?: boolean;
13
11
  noHistoryPush?: boolean;
14
12
  } : TRoutes[TRouteName]['query'] extends Record<string, TypeValidator> ? {
15
13
  route: TRouteName;
16
14
  query?: Partial<Record<keyof TRoutes[TRouteName]['query'], string>>;
17
- asClient?: boolean;
18
15
  noHistoryPush?: boolean;
19
16
  } : {
20
17
  route: TRouteName;
21
- asClient?: boolean;
22
18
  noHistoryPush?: boolean;
23
19
  };
24
20
  //# sourceMappingURL=TypeRedirectToParams.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TypeRedirectToParams.d.ts","sourceRoot":"","sources":["../../../packages/core/types/TypeRedirectToParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,oBAAoB,CAC9B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACzC,UAAU,SAAS,MAAM,OAAO,IAC9B,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GACnE,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAChE;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACH,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAChE;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"TypeRedirectToParams.d.ts","sourceRoot":"","sources":["../../../packages/core/types/TypeRedirectToParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,oBAAoB,CAC9B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACzC,UAAU,SAAS,MAAM,OAAO,IAC9B,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GACnE,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAChE;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACH,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAChE;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC"}
@@ -0,0 +1,18 @@
1
+ // packages/adapters/kr-observable-preact.ts
2
+ import { autorun, makeObservable } from "kr-observable";
3
+ import { observer } from "kr-observable/preact";
4
+ var adapters = {
5
+ batch: (cb) => cb(),
6
+ autorun,
7
+ replaceObject: (obj, newObj) => {
8
+ for (const variableKey in obj) {
9
+ delete obj[variableKey];
10
+ }
11
+ Object.assign(obj, newObj);
12
+ },
13
+ makeObservable,
14
+ observer
15
+ };
16
+ export {
17
+ adapters
18
+ };
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,22 @@
1
+ // packages/adapters/mobx-preact.ts
2
+ import { autorun, observable, runInAction } from "mobx";
3
+ import { observer } from "mobx-preact";
4
+ var adapters = {
5
+ batch: runInAction,
6
+ autorun,
7
+ observer,
8
+ replaceObject: (obj, newObj) => {
9
+ runInAction(() => {
10
+ for (const variableKey in obj) {
11
+ if (obj.hasOwnProperty(variableKey)) {
12
+ delete obj[variableKey];
13
+ }
14
+ }
15
+ Object.assign(obj, newObj);
16
+ });
17
+ },
18
+ makeObservable: observable
19
+ };
20
+ export {
21
+ adapters
22
+ };
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,20 @@
1
+ // packages/adapters/mobx-solid.ts
2
+ import { autorun, observable, runInAction } from "mobx";
3
+ var adapters = {
4
+ batch: runInAction,
5
+ autorun,
6
+ replaceObject: (obj, newObj) => {
7
+ runInAction(() => {
8
+ for (const variableKey in obj) {
9
+ if (obj.hasOwnProperty(variableKey)) {
10
+ delete obj[variableKey];
11
+ }
12
+ }
13
+ Object.assign(obj, newObj);
14
+ });
15
+ },
16
+ makeObservable: observable
17
+ };
18
+ export {
19
+ adapters
20
+ };
@@ -0,0 +1 @@
1
+ {"type": "module"}
package/dist/esm/index.js CHANGED
@@ -175,8 +175,7 @@ function createRouterStore({
175
175
  return routerStore.redirectTo(getInitialRoute({ routes, pathname: params.pathname }));
176
176
  };
177
177
  routerStore.redirectTo = async function redirectTo(config) {
178
- const { route: routeName, noHistoryPush, asClient } = config;
179
- const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
178
+ const { route: routeName, noHistoryPush } = config;
180
179
  let currentRoute;
181
180
  let currentPathname;
182
181
  let currentUrl;
@@ -218,7 +217,10 @@ function createRouterStore({
218
217
  if (currentPathname === nextPathname) {
219
218
  if (currentSearch !== nextSearch) {
220
219
  adapters.batch(() => {
221
- adapters.replaceObject(routerStore.currentRoute.query, nextQuery || {});
220
+ adapters.replaceObject(routerStore.currentRoute, {
221
+ ...routerStore.currentRoute,
222
+ query: nextQuery || {}
223
+ });
222
224
  routerStore.routesHistory.push(nextUrl);
223
225
  });
224
226
  if (history && !noHistoryPush) {
@@ -235,38 +237,22 @@ function createRouterStore({
235
237
  routerStore.isRedirecting = true;
236
238
  });
237
239
  try {
238
- await currentRoute?.beforeLeave?.(
239
- {
240
- nextUrl,
241
- nextRoute,
242
- nextQuery,
243
- nextSearch,
244
- nextPathname,
245
- currentUrl,
246
- currentQuery,
247
- currentRoute,
248
- currentSearch,
249
- currentPathname
250
- },
251
- ...lifecycleParams || []
252
- );
253
- const redirectConfig = await nextRoute.beforeEnter?.(
254
- {
255
- nextUrl,
256
- nextRoute,
257
- nextQuery,
258
- nextSearch,
259
- nextPathname,
260
- currentUrl,
261
- currentQuery,
262
- currentRoute,
263
- currentSearch,
264
- currentPathname
265
- },
266
- ...lifecycleParams || []
267
- );
240
+ const config2 = {
241
+ nextUrl,
242
+ nextRoute,
243
+ nextQuery,
244
+ nextSearch,
245
+ nextPathname,
246
+ currentUrl,
247
+ currentQuery,
248
+ currentRoute,
249
+ currentSearch,
250
+ currentPathname
251
+ };
252
+ await currentRoute?.beforeLeave?.(config2, ...lifecycleParams || []);
253
+ const redirectConfig = await nextRoute.beforeEnter?.(config2, ...lifecycleParams || []);
268
254
  if (typeof redirectConfig === "object") {
269
- if (isClient) return redirectTo({ ...redirectConfig, asClient });
255
+ if (constants.isClient) return redirectTo(redirectConfig);
270
256
  const redirectRoute = routes[redirectConfig.route];
271
257
  const redirectParams = "params" in redirectConfig && redirectConfig.params ? redirectConfig.params : void 0;
272
258
  let redirectUrl = replaceDynamicValues({
@@ -297,8 +283,8 @@ function createRouterStore({
297
283
  name: routes.internalError.name,
298
284
  path: routes.internalError.path,
299
285
  props: routes[routes.internalError.name].props,
300
- query: {},
301
- params: {},
286
+ query: adapters.makeObservable({}),
287
+ params: adapters.makeObservable({}),
302
288
  pageName: routes[routes.internalError.name].pageName
303
289
  });
304
290
  routerStore.isRedirecting = false;
@@ -0,0 +1,81 @@
1
+ // packages/preact/Router.tsx
2
+ import { useCallback, useEffect, useRef, useState } from "preact/hooks";
3
+ import { getInitialRoute, history } from "reactive-route";
4
+ import { jsx } from "preact/jsx-runtime";
5
+ function RouterInner(props) {
6
+ const disposerRef = useRef(null);
7
+ const redirectOnHistoryPop = useCallback(() => {
8
+ if (!history) return;
9
+ history.listen((params) => {
10
+ if (params.action !== "POP") return;
11
+ const previousRoutePathname = props.routerStore.routesHistory[props.routerStore.routesHistory.length - 2];
12
+ if (previousRoutePathname === params.location.pathname) {
13
+ props.routerStore.adapters.batch(() => props.routerStore.routesHistory.pop());
14
+ }
15
+ void props.routerStore.redirectTo({
16
+ noHistoryPush: true,
17
+ ...getInitialRoute({
18
+ routes: props.routes,
19
+ pathname: history.location.pathname
20
+ })
21
+ });
22
+ });
23
+ }, []);
24
+ const [config] = useState(
25
+ () => props.routerStore.adapters.makeObservable({
26
+ loadedComponentName: void 0,
27
+ loadedComponentPage: void 0,
28
+ currentProps: {}
29
+ })
30
+ );
31
+ const setLoadedComponent = useCallback(() => {
32
+ const { loadedComponentName, loadedComponentPage } = config;
33
+ const { currentRoute, isRedirecting } = props.routerStore;
34
+ const componentConfig = props.routes[currentRoute.name];
35
+ let preventRedirect = false;
36
+ if (isRedirecting) preventRedirect = true;
37
+ else if (loadedComponentName === currentRoute.name) preventRedirect = true;
38
+ else if (loadedComponentPage != null && currentRoute.name != null) {
39
+ if (loadedComponentPage === currentRoute.pageName) {
40
+ props.routerStore.adapters.batch(() => {
41
+ config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
42
+ });
43
+ preventRedirect = true;
44
+ }
45
+ }
46
+ if (preventRedirect) return;
47
+ props.routerStore.adapters.batch(() => {
48
+ if (loadedComponentName) props.beforeUpdatePageComponent?.();
49
+ props.beforeSetPageComponent?.(componentConfig);
50
+ config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
51
+ config.loadedComponentName = currentRoute.name;
52
+ config.loadedComponentPage = componentConfig.pageName;
53
+ });
54
+ }, []);
55
+ useState(() => {
56
+ props.routerStore.adapters.batch(() => {
57
+ props.beforeMount?.();
58
+ redirectOnHistoryPop();
59
+ setLoadedComponent();
60
+ disposerRef.current = props.routerStore.adapters.autorun(setLoadedComponent);
61
+ });
62
+ });
63
+ useEffect(() => {
64
+ return () => {
65
+ disposerRef.current?.();
66
+ };
67
+ }, []);
68
+ if (!config.loadedComponentName) return null;
69
+ const LoadedComponent = props.routes[config.loadedComponentName]?.component || null;
70
+ if (LoadedComponent) return /* @__PURE__ */ jsx(LoadedComponent, { ...config.currentProps });
71
+ return null;
72
+ }
73
+ function Router(props) {
74
+ const [Component] = useState(
75
+ () => props.routerStore.adapters.observer ? props.routerStore.adapters.observer(RouterInner) : RouterInner
76
+ );
77
+ return /* @__PURE__ */ jsx(Component, { ...props });
78
+ }
79
+ export {
80
+ Router
81
+ };
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,3 @@
1
+ import { TypePropsRouter, TypeRoute } from 'reactive-route';
2
+ export declare function Router<TRoutes extends Record<string, TypeRoute>>(props: TypePropsRouter<TRoutes>): any;
3
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../packages/preact/Router.tsx"],"names":[],"mappings":"AACA,OAAO,EAA4B,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAkGtF,wBAAgB,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAO1D,GAAG,CACzC"}
@@ -0,0 +1,2 @@
1
+ export { Router } from './Router';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/preact/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../packages/solid/Router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAItF,wBAAgB,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,kCA4FhG"}
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../packages/solid/Router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAItF,wBAAgB,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,kCA0FhG"}
@@ -1 +1 @@
1
- {"root":["../packages/adapters/kr-observable.ts","../packages/adapters/mobx.ts","../packages/adapters/solid.ts","../packages/core/createRouterConfig.ts","../packages/core/createRouterStore.ts","../packages/core/index.ts","../packages/core/types/InterfaceRouterStore.ts","../packages/core/types/TypeCurrentRoute.ts","../packages/core/types/TypeLifecycleConfig.ts","../packages/core/types/TypePropsRouter.ts","../packages/core/types/TypeRedirectToParams.ts","../packages/core/types/TypeRoute.ts","../packages/core/types/TypeRouteRaw.ts","../packages/core/types/TypeRouteWithParams.ts","../packages/core/types/TypeValidator.ts","../packages/core/utils/addNames.ts","../packages/core/utils/constants.ts","../packages/core/utils/dynamic.ts","../packages/core/utils/findRouteByPathname.ts","../packages/core/utils/getDynamicValues.ts","../packages/core/utils/getInitialRoute.ts","../packages/core/utils/getQueryValues.ts","../packages/core/utils/getTypedEntries.ts","../packages/core/utils/history.ts","../packages/core/utils/loadComponentToConfig.ts","../packages/core/utils/replaceDynamicValues.ts","../packages/react/Router.tsx","../packages/react/index.ts"],"version":"5.9.2"}
1
+ {"root":["../packages/adapters/kr-observable-preact.ts","../packages/adapters/kr-observable.ts","../packages/adapters/mobx-preact.ts","../packages/adapters/mobx-solid.ts","../packages/adapters/mobx.ts","../packages/adapters/solid.ts","../packages/core/createRouterConfig.ts","../packages/core/createRouterStore.ts","../packages/core/index.ts","../packages/core/types/InterfaceRouterStore.ts","../packages/core/types/TypeCurrentRoute.ts","../packages/core/types/TypeLifecycleConfig.ts","../packages/core/types/TypePropsRouter.ts","../packages/core/types/TypeRedirectToParams.ts","../packages/core/types/TypeRoute.ts","../packages/core/types/TypeRouteRaw.ts","../packages/core/types/TypeRouteWithParams.ts","../packages/core/types/TypeValidator.ts","../packages/core/utils/addNames.ts","../packages/core/utils/constants.ts","../packages/core/utils/dynamic.ts","../packages/core/utils/findRouteByPathname.ts","../packages/core/utils/getDynamicValues.ts","../packages/core/utils/getInitialRoute.ts","../packages/core/utils/getQueryValues.ts","../packages/core/utils/getTypedEntries.ts","../packages/core/utils/history.ts","../packages/core/utils/loadComponentToConfig.ts","../packages/core/utils/replaceDynamicValues.ts","../packages/preact/Router.tsx","../packages/preact/index.ts","../packages/react/Router.tsx","../packages/react/index.ts"],"version":"5.9.2"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "reactive-route",
3
3
  "author": "Dmitry Kazakov",
4
4
  "license": "MIT",
5
- "version": "0.0.1-alpha.16",
5
+ "version": "0.0.1-alpha.18",
6
6
  "description": "Reactive Router for different frameworks",
7
7
  "repository": {
8
8
  "type": "git",
@@ -33,32 +33,36 @@
33
33
  "query-string": "7.1.3"
34
34
  },
35
35
  "devDependencies": {
36
- "@babel/core": "7.28.3",
36
+ "@types/babel__core": "7.20.5",
37
+ "@babel/core": "7.28.4",
37
38
  "@babel/preset-env": "7.28.3",
38
39
  "@babel/preset-typescript": "7.27.1",
40
+ "babel-preset-solid": "1.9.9",
41
+ "vite-plugin-babel": "1.3.2",
39
42
  "@biomejs/biome": "2.2.2",
40
- "@espcom/esbuild-plugin-replace": "1.3.0",
43
+ "@espcom/esbuild-plugin-replace": "1.3.1",
41
44
  "@solidjs/testing-library": "0.8.10",
42
45
  "@testing-library/react": "16.3.0",
46
+ "@testing-library/preact": "3.2.4",
43
47
  "@types/lodash": "4.17.16",
44
48
  "@types/node": "22.14.1",
45
49
  "@vitest/coverage-istanbul": "3.2.4",
46
- "babel-preset-solid": "1.9.9",
50
+ "@preact/preset-vite": "2.10.2",
47
51
  "badge-maker": "5.0.2",
48
- "esbuild": "0.25.9",
49
- "global-jsdom": "26.0.0",
52
+ "esbuild": "0.25.10",
50
53
  "husky": "9.1.7",
51
- "kr-observable": "3.1.1",
54
+ "kr-observable": "3.1.2",
52
55
  "lint-staged": "16.1.6",
53
56
  "lodash": "4.17.21",
54
57
  "mobx": "6.13.7",
58
+ "mobx-preact": "3.0.0",
55
59
  "mobx-react-lite": "4.1.0",
56
60
  "react": "19.1.1",
57
- "regenerator-runtime": "0.14.1",
61
+ "preact": "10.27.2",
62
+ "preact-render-to-string": "6.6.1",
58
63
  "solid-js": "1.9.9",
59
64
  "tsx": "4.20.5",
60
65
  "typescript": "5.9.2",
61
- "vite-plugin-solid": "2.11.8",
62
66
  "vitepress": "1.6.4",
63
67
  "vitepress-plugin-group-icons": "1.6.3",
64
68
  "vitest": "3.2.4",
@@ -76,6 +80,11 @@
76
80
  "require": "./dist/cjs/react/index.js",
77
81
  "import": "./dist/esm/react/index.js"
78
82
  },
83
+ "./preact": {
84
+ "types": "./dist/preact/index.d.ts",
85
+ "require": "./dist/cjs/preact/index.js",
86
+ "import": "./dist/esm/preact/index.js"
87
+ },
79
88
  "./solid": {
80
89
  "types": "./dist/solid/index.d.ts",
81
90
  "require": "./dist/cjs/solid/index.js",
@@ -86,6 +95,11 @@
86
95
  "require": "./dist/cjs/adapters/mobx/index.js",
87
96
  "import": "./dist/esm/adapters/mobx/index.js"
88
97
  },
98
+ "./adapters/mobx-preact": {
99
+ "types": "./dist/adapters/mobx-preact.d.ts",
100
+ "require": "./dist/cjs/adapters/mobx-preact/index.js",
101
+ "import": "./dist/esm/adapters/mobx-preact/index.js"
102
+ },
89
103
  "./adapters/solid": {
90
104
  "types": "./dist/adapters/solid.d.ts",
91
105
  "require": "./dist/cjs/adapters/solid/index.js",
@@ -95,6 +109,11 @@
95
109
  "types": "./dist/adapters/kr-observable.d.ts",
96
110
  "require": "./dist/cjs/adapters/kr-observable/index.js",
97
111
  "import": "./dist/esm/adapters/kr-observable/index.js"
112
+ },
113
+ "./adapters/kr-observable-preact": {
114
+ "types": "./dist/adapters/kr-observable-preact.d.ts",
115
+ "require": "./dist/cjs/adapters/kr-observable-preact/index.js",
116
+ "import": "./dist/esm/adapters/kr-observable-preact/index.js"
98
117
  }
99
118
  },
100
119
  "main": "dist/cjs/index.js",