reactive-route 0.0.1-alpha.2 → 0.0.1-alpha.20

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 (141) 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/kr-observable.d.ts +3 -0
  4. package/dist/adapters/kr-observable.d.ts.map +1 -0
  5. package/dist/adapters/mobx-preact.d.ts +3 -0
  6. package/dist/adapters/mobx-preact.d.ts.map +1 -0
  7. package/dist/adapters/mobx-solid.d.ts +3 -0
  8. package/dist/adapters/mobx-solid.d.ts.map +1 -0
  9. package/dist/adapters/mobx.d.ts +3 -0
  10. package/dist/adapters/mobx.d.ts.map +1 -0
  11. package/dist/adapters/solid.d.ts +3 -0
  12. package/dist/adapters/solid.d.ts.map +1 -0
  13. package/dist/cjs/adapters/kr-observable/index.js +39 -0
  14. package/dist/cjs/adapters/kr-observable/package.json +1 -0
  15. package/dist/cjs/adapters/kr-observable-preact/index.js +39 -0
  16. package/dist/cjs/adapters/kr-observable-preact/package.json +1 -0
  17. package/dist/cjs/adapters/mobx/index.js +43 -0
  18. package/dist/cjs/adapters/mobx/package.json +1 -0
  19. package/dist/cjs/adapters/mobx-preact/index.js +43 -0
  20. package/dist/cjs/adapters/mobx-preact/package.json +1 -0
  21. package/dist/cjs/adapters/mobx-solid/index.js +42 -0
  22. package/dist/cjs/adapters/mobx-solid/package.json +1 -0
  23. package/dist/cjs/adapters/solid/index.js +45 -0
  24. package/dist/cjs/adapters/solid/package.json +1 -0
  25. package/dist/cjs/index.js +92 -100
  26. package/dist/cjs/preact/index.js +104 -0
  27. package/dist/cjs/preact/package.json +1 -0
  28. package/dist/cjs/react/index.js +56 -102
  29. package/dist/cjs/solid/index.js +51 -75
  30. package/dist/{types/core → core}/createRouterConfig.d.ts +1 -1
  31. package/dist/core/createRouterConfig.d.ts.map +1 -0
  32. package/dist/core/createRouterStore.d.ts +4 -0
  33. package/dist/core/createRouterStore.d.ts.map +1 -0
  34. package/dist/{types/core → core}/index.d.ts +1 -1
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/{types/core → core}/types/InterfaceRouterStore.d.ts +12 -7
  37. package/dist/core/types/InterfaceRouterStore.d.ts.map +1 -0
  38. package/dist/core/types/TypeCurrentRoute.d.ts.map +1 -0
  39. package/dist/core/types/TypeLifecycleConfig.d.ts.map +1 -0
  40. package/dist/core/types/TypePropsRouter.d.ts.map +1 -0
  41. package/dist/{types/core → core}/types/TypeRedirectToParams.d.ts +0 -4
  42. package/dist/core/types/TypeRedirectToParams.d.ts.map +1 -0
  43. package/dist/core/types/TypeRoute.d.ts.map +1 -0
  44. package/dist/core/types/TypeRouteRaw.d.ts.map +1 -0
  45. package/dist/core/types/TypeRouteWithParams.d.ts.map +1 -0
  46. package/dist/core/types/TypeValidator.d.ts.map +1 -0
  47. package/dist/core/utils/addNames.d.ts.map +1 -0
  48. package/dist/core/utils/constants.d.ts.map +1 -0
  49. package/dist/core/utils/dynamic.d.ts.map +1 -0
  50. package/dist/core/utils/findRouteByPathname.d.ts.map +1 -0
  51. package/dist/core/utils/getDynamicValues.d.ts.map +1 -0
  52. package/dist/{types/core → core}/utils/getInitialRoute.d.ts +1 -2
  53. package/dist/core/utils/getInitialRoute.d.ts.map +1 -0
  54. package/dist/core/utils/getQueryValues.d.ts.map +1 -0
  55. package/dist/core/utils/getTypedEntries.d.ts.map +1 -0
  56. package/dist/core/utils/history.d.ts.map +1 -0
  57. package/dist/core/utils/loadComponentToConfig.d.ts.map +1 -0
  58. package/dist/core/utils/replaceDynamicValues.d.ts.map +1 -0
  59. package/dist/esm/adapters/kr-observable/index.js +18 -0
  60. package/dist/esm/adapters/kr-observable/package.json +1 -0
  61. package/dist/esm/adapters/kr-observable-preact/index.js +18 -0
  62. package/dist/esm/adapters/kr-observable-preact/package.json +1 -0
  63. package/dist/esm/adapters/mobx/index.js +22 -0
  64. package/dist/esm/adapters/mobx/package.json +1 -0
  65. package/dist/esm/adapters/mobx-preact/index.js +22 -0
  66. package/dist/esm/adapters/mobx-preact/package.json +1 -0
  67. package/dist/esm/adapters/mobx-solid/index.js +21 -0
  68. package/dist/esm/adapters/mobx-solid/package.json +1 -0
  69. package/dist/esm/adapters/solid/index.js +24 -0
  70. package/dist/esm/adapters/solid/package.json +1 -0
  71. package/dist/esm/index.js +92 -100
  72. package/dist/esm/preact/index.js +81 -0
  73. package/dist/esm/preact/package.json +1 -0
  74. package/dist/esm/react/index.js +56 -102
  75. package/dist/esm/solid/index.js +50 -74
  76. package/dist/preact/Router.d.ts +3 -0
  77. package/dist/preact/Router.d.ts.map +1 -0
  78. package/dist/preact/index.d.ts.map +1 -0
  79. package/dist/react/Router.d.ts +5 -0
  80. package/dist/react/Router.d.ts.map +1 -0
  81. package/dist/react/index.d.ts.map +1 -0
  82. package/dist/solid/Router.d.ts.map +1 -0
  83. package/dist/solid/index.d.ts +2 -0
  84. package/dist/solid/index.d.ts.map +1 -0
  85. package/dist/tsconfig.types.react.tsbuildinfo +1 -0
  86. package/dist/tsconfig.types.solid.tsbuildinfo +1 -0
  87. package/package.json +76 -26
  88. package/dist/types/core/createRouterConfig.d.ts.map +0 -1
  89. package/dist/types/core/createRouterStore.d.ts +0 -4
  90. package/dist/types/core/createRouterStore.d.ts.map +0 -1
  91. package/dist/types/core/index.d.ts.map +0 -1
  92. package/dist/types/core/types/InterfaceRouterStore.d.ts.map +0 -1
  93. package/dist/types/core/types/TypeCurrentRoute.d.ts.map +0 -1
  94. package/dist/types/core/types/TypeLifecycleConfig.d.ts.map +0 -1
  95. package/dist/types/core/types/TypePropsRouter.d.ts.map +0 -1
  96. package/dist/types/core/types/TypeRedirectToParams.d.ts.map +0 -1
  97. package/dist/types/core/types/TypeRoute.d.ts.map +0 -1
  98. package/dist/types/core/types/TypeRouteRaw.d.ts.map +0 -1
  99. package/dist/types/core/types/TypeRouteWithParams.d.ts.map +0 -1
  100. package/dist/types/core/types/TypeValidator.d.ts.map +0 -1
  101. package/dist/types/core/utils/addNames.d.ts.map +0 -1
  102. package/dist/types/core/utils/constants.d.ts.map +0 -1
  103. package/dist/types/core/utils/dynamic.d.ts.map +0 -1
  104. package/dist/types/core/utils/findRouteByPathname.d.ts.map +0 -1
  105. package/dist/types/core/utils/getDynamicValues.d.ts.map +0 -1
  106. package/dist/types/core/utils/getInitialRoute.d.ts.map +0 -1
  107. package/dist/types/core/utils/getQueryValues.d.ts.map +0 -1
  108. package/dist/types/core/utils/getTypedEntries.d.ts.map +0 -1
  109. package/dist/types/core/utils/history.d.ts.map +0 -1
  110. package/dist/types/core/utils/loadComponentToConfig.d.ts.map +0 -1
  111. package/dist/types/core/utils/replaceDynamicValues.d.ts.map +0 -1
  112. package/dist/types/react/Router.d.ts +0 -5
  113. package/dist/types/react/Router.d.ts.map +0 -1
  114. package/dist/types/react/index.d.ts.map +0 -1
  115. package/dist/types/react/useStore.d.ts +0 -8
  116. package/dist/types/react/useStore.d.ts.map +0 -1
  117. package/dist/types/solid/Router.d.ts.map +0 -1
  118. package/dist/types/solid/index.d.ts.map +0 -1
  119. package/dist/types/solid/useStore.d.ts +0 -7
  120. package/dist/types/solid/useStore.d.ts.map +0 -1
  121. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
  122. /package/dist/{types/core → core}/types/TypeCurrentRoute.d.ts +0 -0
  123. /package/dist/{types/core → core}/types/TypeLifecycleConfig.d.ts +0 -0
  124. /package/dist/{types/core → core}/types/TypePropsRouter.d.ts +0 -0
  125. /package/dist/{types/core → core}/types/TypeRoute.d.ts +0 -0
  126. /package/dist/{types/core → core}/types/TypeRouteRaw.d.ts +0 -0
  127. /package/dist/{types/core → core}/types/TypeRouteWithParams.d.ts +0 -0
  128. /package/dist/{types/core → core}/types/TypeValidator.d.ts +0 -0
  129. /package/dist/{types/core → core}/utils/addNames.d.ts +0 -0
  130. /package/dist/{types/core → core}/utils/constants.d.ts +0 -0
  131. /package/dist/{types/core → core}/utils/dynamic.d.ts +0 -0
  132. /package/dist/{types/core → core}/utils/findRouteByPathname.d.ts +0 -0
  133. /package/dist/{types/core → core}/utils/getDynamicValues.d.ts +0 -0
  134. /package/dist/{types/core → core}/utils/getQueryValues.d.ts +0 -0
  135. /package/dist/{types/core → core}/utils/getTypedEntries.d.ts +0 -0
  136. /package/dist/{types/core → core}/utils/history.d.ts +0 -0
  137. /package/dist/{types/core → core}/utils/loadComponentToConfig.d.ts +0 -0
  138. /package/dist/{types/core → core}/utils/replaceDynamicValues.d.ts +0 -0
  139. /package/dist/{types/react → preact}/index.d.ts +0 -0
  140. /package/dist/{types/solid → react}/index.d.ts +0 -0
  141. /package/dist/{types/solid → solid}/Router.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replaceDynamicValues.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/replaceDynamicValues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAMnE,wBAAgB,oBAAoB,CAClC,UAAU,SAAS,SAAS,GAAG,mBAAmB,GAAG,gBAAgB,CAAC,SAAS,CAAC,EAChF,EACA,KAAK,EACL,MAAkB,GACnB,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;CACrD,GAAG,MAAM,CAcT"}
@@ -0,0 +1,18 @@
1
+ // packages/adapters/kr-observable.ts
2
+ import { autorun, makeObservable } from "kr-observable";
3
+ import { observer } from "kr-observable/react";
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,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.ts
2
+ import { autorun, observable, runInAction } from "mobx";
3
+ import { observer } from "mobx-react-lite";
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,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,21 @@
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
+ immediateSetComponent: true
18
+ };
19
+ export {
20
+ adapters
21
+ };
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,24 @@
1
+ // packages/adapters/solid.ts
2
+ import { batch, createRenderEffect } from "solid-js";
3
+ import { createMutable, modifyMutable, produce } from "solid-js/store";
4
+ var adapters = {
5
+ batch,
6
+ autorun: createRenderEffect,
7
+ replaceObject: (obj, newObj) => {
8
+ modifyMutable(
9
+ obj,
10
+ produce((state) => {
11
+ if (typeof state === "object" && state != null) {
12
+ for (const variableKey in state) {
13
+ delete state[variableKey];
14
+ }
15
+ }
16
+ Object.assign(state || {}, newObj);
17
+ })
18
+ );
19
+ },
20
+ makeObservable: createMutable
21
+ };
22
+ export {
23
+ adapters
24
+ };
@@ -0,0 +1 @@
1
+ {"type": "module"}
package/dist/esm/index.js CHANGED
@@ -47,6 +47,37 @@ function getDynamicValues(params) {
47
47
  return dynamicParams;
48
48
  }
49
49
 
50
+ // packages/core/utils/findRouteByPathname.ts
51
+ function completeStaticMatch(pathname, path) {
52
+ return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
53
+ }
54
+ function findRouteByPathname({
55
+ pathname,
56
+ routes
57
+ }) {
58
+ let dynamicRouteMatch;
59
+ const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
60
+ for (const routeName in routes) {
61
+ if (!Object.hasOwn(routes, routeName)) continue;
62
+ const route = routes[routeName];
63
+ if (completeStaticMatch(pathname, route.path)) return route;
64
+ if (dynamicRouteMatch) continue;
65
+ const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
66
+ if (routePathnameArray.length !== pathnameArray.length) continue;
67
+ const someParamInvalid = routePathnameArray.some((paramName, i) => {
68
+ const paramFromUrl = pathnameArray[i];
69
+ if (!isDynamic(paramName)) return paramName !== paramFromUrl;
70
+ const validator = route.params?.[clearDynamic(paramName)];
71
+ if (typeof validator !== "function") {
72
+ throw new Error(`findRoute: missing validator for param "${paramName}"`);
73
+ }
74
+ return !validator(paramFromUrl);
75
+ });
76
+ if (!someParamInvalid) dynamicRouteMatch = route;
77
+ }
78
+ return dynamicRouteMatch;
79
+ }
80
+
50
81
  // packages/core/utils/getQueryValues.ts
51
82
  import queryString from "query-string";
52
83
 
@@ -68,6 +99,16 @@ function getQueryValues(params) {
68
99
  return query;
69
100
  }
70
101
 
102
+ // packages/core/utils/getInitialRoute.ts
103
+ function getInitialRoute(params) {
104
+ const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes.notFound;
105
+ return {
106
+ route: route.name,
107
+ query: getQueryValues({ route, pathname: params.pathname }),
108
+ params: getDynamicValues({ route, pathname: params.pathname })
109
+ };
110
+ }
111
+
71
112
  // packages/core/utils/history.ts
72
113
  import { createBrowserHistory } from "history";
73
114
  var history = constants.isClient ? createBrowserHistory() : null;
@@ -107,29 +148,34 @@ function replaceDynamicValues({
107
148
 
108
149
  // packages/core/createRouterStore.ts
109
150
  function createRouterStore({
110
- batch,
151
+ adapters,
111
152
  routes,
112
- autorun,
113
- replaceObject,
114
- routeError500,
115
- makeObservable,
116
153
  lifecycleParams
117
154
  }) {
118
- const routerStore = makeObservable({
155
+ const routerStore = adapters.makeObservable({
119
156
  routesHistory: [],
120
157
  currentRoute: {},
121
158
  isRedirecting: false,
122
159
  redirectTo: void 0,
123
- utils: {
124
- batch,
125
- autorun,
126
- replaceObject,
127
- makeObservable
128
- }
160
+ restoreFromURL: void 0,
161
+ restoreFromServer: void 0,
162
+ adapters
129
163
  });
164
+ routerStore.restoreFromServer = function restoreFromServer(obj) {
165
+ adapters.batch(() => {
166
+ routerStore.routesHistory.push(...obj.routesHistory || []);
167
+ Object.assign(routerStore.currentRoute, obj.currentRoute);
168
+ });
169
+ const preloadedRouteName = Object.keys(routes).find(
170
+ (routeName) => routerStore.currentRoute.name === routeName
171
+ );
172
+ return loadComponentToConfig({ route: routes[preloadedRouteName] });
173
+ };
174
+ routerStore.restoreFromURL = function restoreFromURL(params) {
175
+ return routerStore.redirectTo(getInitialRoute({ routes, pathname: params.pathname }));
176
+ };
130
177
  routerStore.redirectTo = async function redirectTo(config) {
131
- const { route: routeName, noHistoryPush, asClient } = config;
132
- const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
178
+ const { route: routeName, noHistoryPush } = config;
133
179
  let currentRoute;
134
180
  let currentPathname;
135
181
  let currentUrl;
@@ -170,8 +216,11 @@ function createRouterStore({
170
216
  if (currentUrl === nextUrl) return Promise.resolve();
171
217
  if (currentPathname === nextPathname) {
172
218
  if (currentSearch !== nextSearch) {
173
- batch(() => {
174
- replaceObject(routerStore.currentRoute.query, nextQuery || {});
219
+ adapters.batch(() => {
220
+ adapters.replaceObject(routerStore.currentRoute, {
221
+ ...routerStore.currentRoute,
222
+ query: nextQuery || {}
223
+ });
175
224
  routerStore.routesHistory.push(nextUrl);
176
225
  });
177
226
  if (history && !noHistoryPush) {
@@ -184,42 +233,26 @@ function createRouterStore({
184
233
  }
185
234
  return Promise.resolve();
186
235
  }
187
- batch(() => {
236
+ adapters.batch(() => {
188
237
  routerStore.isRedirecting = true;
189
238
  });
190
239
  try {
191
- await currentRoute?.beforeLeave?.(
192
- {
193
- nextUrl,
194
- nextRoute,
195
- nextQuery,
196
- nextSearch,
197
- nextPathname,
198
- currentUrl,
199
- currentQuery,
200
- currentRoute,
201
- currentSearch,
202
- currentPathname
203
- },
204
- ...lifecycleParams || []
205
- );
206
- const redirectConfig = await nextRoute.beforeEnter?.(
207
- {
208
- nextUrl,
209
- nextRoute,
210
- nextQuery,
211
- nextSearch,
212
- nextPathname,
213
- currentUrl,
214
- currentQuery,
215
- currentRoute,
216
- currentSearch,
217
- currentPathname
218
- },
219
- ...lifecycleParams || []
220
- );
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 || []);
221
254
  if (typeof redirectConfig === "object") {
222
- if (isClient) return redirectTo({ ...redirectConfig, asClient });
255
+ if (constants.isClient) return redirectTo(redirectConfig);
223
256
  const redirectRoute = routes[redirectConfig.route];
224
257
  const redirectParams = "params" in redirectConfig && redirectConfig.params ? redirectConfig.params : void 0;
225
258
  let redirectUrl = replaceDynamicValues({
@@ -244,22 +277,22 @@ function createRouterStore({
244
277
  throw error;
245
278
  }
246
279
  console.error(error);
247
- await loadComponentToConfig({ route: routeError500 });
248
- batch(() => {
249
- replaceObject(routerStore.currentRoute, {
250
- name: routeError500.name,
251
- path: routeError500.path,
252
- props: routes[routeError500.name].props,
253
- query: {},
254
- params: {},
255
- pageName: routes[routeError500.name].pageName
280
+ await loadComponentToConfig({ route: routes.internalError });
281
+ adapters.batch(() => {
282
+ adapters.replaceObject(routerStore.currentRoute, {
283
+ name: routes.internalError.name,
284
+ path: routes.internalError.path,
285
+ props: routes[routes.internalError.name].props,
286
+ query: adapters.makeObservable({}),
287
+ params: adapters.makeObservable({}),
288
+ pageName: routes[routes.internalError.name].pageName
256
289
  });
257
290
  routerStore.isRedirecting = false;
258
291
  });
259
292
  return Promise.resolve();
260
293
  }
261
- batch(() => {
262
- replaceObject(routerStore.currentRoute, {
294
+ adapters.batch(() => {
295
+ adapters.replaceObject(routerStore.currentRoute, {
263
296
  name: nextRoute.name,
264
297
  path: nextRoute.path,
265
298
  props: routes[nextRoute.name].props,
@@ -284,47 +317,6 @@ function createRouterStore({
284
317
  };
285
318
  return routerStore;
286
319
  }
287
-
288
- // packages/core/utils/findRouteByPathname.ts
289
- function completeStaticMatch(pathname, path) {
290
- return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
291
- }
292
- function findRouteByPathname({
293
- pathname,
294
- routes
295
- }) {
296
- let dynamicRouteMatch;
297
- const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
298
- for (const routeName in routes) {
299
- if (!Object.hasOwn(routes, routeName)) continue;
300
- const route = routes[routeName];
301
- if (completeStaticMatch(pathname, route.path)) return route;
302
- if (dynamicRouteMatch) continue;
303
- const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
304
- if (routePathnameArray.length !== pathnameArray.length) continue;
305
- const someParamInvalid = routePathnameArray.some((paramName, i) => {
306
- const paramFromUrl = pathnameArray[i];
307
- if (!isDynamic(paramName)) return paramName !== paramFromUrl;
308
- const validator = route.params?.[clearDynamic(paramName)];
309
- if (typeof validator !== "function") {
310
- throw new Error(`findRoute: missing validator for param "${paramName}"`);
311
- }
312
- return !validator(paramFromUrl);
313
- });
314
- if (!someParamInvalid) dynamicRouteMatch = route;
315
- }
316
- return dynamicRouteMatch;
317
- }
318
-
319
- // packages/core/utils/getInitialRoute.ts
320
- function getInitialRoute(params) {
321
- const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes[params.fallback];
322
- return {
323
- route: route.name,
324
- query: getQueryValues({ route, pathname: params.pathname }),
325
- params: getDynamicValues({ route, pathname: params.pathname })
326
- };
327
- }
328
320
  export {
329
321
  createRouterConfig,
330
322
  createRouterStore,
@@ -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"}