reactive-route 0.0.1-alpha.3 → 0.0.1-alpha.30

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 (160) hide show
  1. package/adapters/kr-observable-preact.cjs +39 -0
  2. package/adapters/kr-observable-preact.d.ts +3 -0
  3. package/adapters/kr-observable-preact.d.ts.map +1 -0
  4. package/adapters/kr-observable-preact.mjs +18 -0
  5. package/adapters/kr-observable-react.cjs +39 -0
  6. package/adapters/kr-observable-react.d.ts +3 -0
  7. package/adapters/kr-observable-react.d.ts.map +1 -0
  8. package/adapters/kr-observable-react.mjs +18 -0
  9. package/adapters/kr-observable-solid.cjs +37 -0
  10. package/adapters/kr-observable-solid.d.ts +3 -0
  11. package/adapters/kr-observable-solid.d.ts.map +1 -0
  12. package/adapters/kr-observable-solid.mjs +16 -0
  13. package/adapters/mobx-preact.cjs +43 -0
  14. package/adapters/mobx-preact.d.ts +3 -0
  15. package/adapters/mobx-preact.d.ts.map +1 -0
  16. package/adapters/mobx-preact.mjs +22 -0
  17. package/adapters/mobx-react.cjs +43 -0
  18. package/adapters/mobx-react.d.ts +3 -0
  19. package/adapters/mobx-react.d.ts.map +1 -0
  20. package/adapters/mobx-react.mjs +22 -0
  21. package/adapters/mobx-solid.cjs +42 -0
  22. package/adapters/mobx-solid.d.ts +3 -0
  23. package/adapters/mobx-solid.d.ts.map +1 -0
  24. package/adapters/mobx-solid.mjs +21 -0
  25. package/adapters/solid.cjs +45 -0
  26. package/adapters/solid.d.ts +3 -0
  27. package/adapters/solid.d.ts.map +1 -0
  28. package/adapters/solid.mjs +24 -0
  29. package/adapters/vue.cjs +40 -0
  30. package/adapters/vue.d.ts +3 -0
  31. package/adapters/vue.d.ts.map +1 -0
  32. package/adapters/vue.mjs +19 -0
  33. package/core/createRouter.d.ts +9 -0
  34. package/core/createRouter.d.ts.map +1 -0
  35. package/{dist/types/core/createRouterConfig.d.ts → core/createRoutes.d.ts} +4 -4
  36. package/core/createRoutes.d.ts.map +1 -0
  37. package/core/index.d.ts +13 -0
  38. package/core/index.d.ts.map +1 -0
  39. package/core/types/TypeAdapters.d.ts +9 -0
  40. package/core/types/TypeAdapters.d.ts.map +1 -0
  41. package/{dist/types/core → core}/types/TypeCurrentRoute.d.ts +1 -1
  42. package/core/types/TypeCurrentRoute.d.ts.map +1 -0
  43. package/{dist/types/core → core}/types/TypeLifecycleConfig.d.ts +2 -0
  44. package/core/types/TypeLifecycleConfig.d.ts.map +1 -0
  45. package/{dist/types/core → core}/types/TypePropsRouter.d.ts +2 -3
  46. package/core/types/TypePropsRouter.d.ts.map +1 -0
  47. package/{dist/types/core/types/TypeRedirectToParams.d.ts → core/types/TypeRedirectParams.d.ts} +6 -10
  48. package/core/types/TypeRedirectParams.d.ts.map +1 -0
  49. package/{dist/types/core → core}/types/TypeRoute.d.ts +0 -1
  50. package/core/types/TypeRoute.d.ts.map +1 -0
  51. package/{dist/types/core → core}/types/TypeRouteRaw.d.ts +1 -0
  52. package/core/types/TypeRouteRaw.d.ts.map +1 -0
  53. package/core/types/TypeRouter.d.ts +22 -0
  54. package/core/types/TypeRouter.d.ts.map +1 -0
  55. package/core/types/TypeValidator.d.ts.map +1 -0
  56. package/core/utils/PreventError.d.ts +4 -0
  57. package/core/utils/PreventError.d.ts.map +1 -0
  58. package/core/utils/RedirectError.d.ts +4 -0
  59. package/core/utils/RedirectError.d.ts.map +1 -0
  60. package/core/utils/addNames.d.ts.map +1 -0
  61. package/{dist/types/core → core}/utils/constants.d.ts +0 -2
  62. package/core/utils/constants.d.ts.map +1 -0
  63. package/core/utils/dynamic.d.ts.map +1 -0
  64. package/core/utils/findRouteByPathname.d.ts.map +1 -0
  65. package/core/utils/getDynamicValues.d.ts.map +1 -0
  66. package/core/utils/getInitialRoute.d.ts +7 -0
  67. package/core/utils/getInitialRoute.d.ts.map +1 -0
  68. package/core/utils/getQueryValues.d.ts.map +1 -0
  69. package/core/utils/getTypedEntries.d.ts.map +1 -0
  70. package/core/utils/history.d.ts.map +1 -0
  71. package/core/utils/loadComponentToConfig.d.ts.map +1 -0
  72. package/core/utils/queryString.d.ts +8 -0
  73. package/core/utils/queryString.d.ts.map +1 -0
  74. package/{dist/types/core → core}/utils/replaceDynamicValues.d.ts +1 -2
  75. package/core/utils/replaceDynamicValues.d.ts.map +1 -0
  76. package/{dist/cjs/index.js → index.cjs} +198 -200
  77. package/index.mjs +356 -0
  78. package/package.json +66 -56
  79. package/preact/Router.d.ts +3 -0
  80. package/preact/Router.d.ts.map +1 -0
  81. package/preact/index.cjs +102 -0
  82. package/preact/index.d.ts.map +1 -0
  83. package/preact/index.mjs +79 -0
  84. package/react/Router.d.ts +5 -0
  85. package/react/Router.d.ts.map +1 -0
  86. package/react/index.cjs +101 -0
  87. package/react/index.d.ts.map +1 -0
  88. package/react/index.mjs +78 -0
  89. package/solid/Router.d.ts.map +1 -0
  90. package/solid/index.cjs +113 -0
  91. package/solid/index.d.ts +2 -0
  92. package/solid/index.d.ts.map +1 -0
  93. package/solid/index.mjs +90 -0
  94. package/vue/index.cjs +0 -0
  95. package/vue/index.d.ts +2 -0
  96. package/vue/index.d.ts.map +1 -0
  97. package/vue/index.mjs +0 -0
  98. package/LICENSE +0 -21
  99. package/README.md +0 -10
  100. package/dist/cjs/package.json +0 -1
  101. package/dist/cjs/react/index.js +0 -149
  102. package/dist/cjs/react/package.json +0 -1
  103. package/dist/cjs/solid/index.js +0 -130
  104. package/dist/cjs/solid/package.json +0 -1
  105. package/dist/esm/index.js +0 -348
  106. package/dist/esm/package.json +0 -1
  107. package/dist/esm/react/index.js +0 -126
  108. package/dist/esm/react/package.json +0 -1
  109. package/dist/esm/solid/index.js +0 -107
  110. package/dist/esm/solid/package.json +0 -1
  111. package/dist/types/core/createRouterConfig.d.ts.map +0 -1
  112. package/dist/types/core/createRouterStore.d.ts +0 -4
  113. package/dist/types/core/createRouterStore.d.ts.map +0 -1
  114. package/dist/types/core/index.d.ts +0 -14
  115. package/dist/types/core/index.d.ts.map +0 -1
  116. package/dist/types/core/types/InterfaceRouterStore.d.ts +0 -24
  117. package/dist/types/core/types/InterfaceRouterStore.d.ts.map +0 -1
  118. package/dist/types/core/types/TypeCurrentRoute.d.ts.map +0 -1
  119. package/dist/types/core/types/TypeLifecycleConfig.d.ts.map +0 -1
  120. package/dist/types/core/types/TypePropsRouter.d.ts.map +0 -1
  121. package/dist/types/core/types/TypeRedirectToParams.d.ts.map +0 -1
  122. package/dist/types/core/types/TypeRoute.d.ts.map +0 -1
  123. package/dist/types/core/types/TypeRouteRaw.d.ts.map +0 -1
  124. package/dist/types/core/types/TypeRouteWithParams.d.ts +0 -6
  125. package/dist/types/core/types/TypeRouteWithParams.d.ts.map +0 -1
  126. package/dist/types/core/types/TypeValidator.d.ts.map +0 -1
  127. package/dist/types/core/utils/addNames.d.ts.map +0 -1
  128. package/dist/types/core/utils/constants.d.ts.map +0 -1
  129. package/dist/types/core/utils/dynamic.d.ts.map +0 -1
  130. package/dist/types/core/utils/findRouteByPathname.d.ts.map +0 -1
  131. package/dist/types/core/utils/getDynamicValues.d.ts.map +0 -1
  132. package/dist/types/core/utils/getInitialRoute.d.ts +0 -8
  133. package/dist/types/core/utils/getInitialRoute.d.ts.map +0 -1
  134. package/dist/types/core/utils/getQueryValues.d.ts.map +0 -1
  135. package/dist/types/core/utils/getTypedEntries.d.ts.map +0 -1
  136. package/dist/types/core/utils/history.d.ts.map +0 -1
  137. package/dist/types/core/utils/loadComponentToConfig.d.ts.map +0 -1
  138. package/dist/types/core/utils/replaceDynamicValues.d.ts.map +0 -1
  139. package/dist/types/react/Router.d.ts +0 -5
  140. package/dist/types/react/Router.d.ts.map +0 -1
  141. package/dist/types/react/index.d.ts.map +0 -1
  142. package/dist/types/react/useStore.d.ts +0 -8
  143. package/dist/types/react/useStore.d.ts.map +0 -1
  144. package/dist/types/solid/Router.d.ts.map +0 -1
  145. package/dist/types/solid/index.d.ts.map +0 -1
  146. package/dist/types/solid/useStore.d.ts +0 -7
  147. package/dist/types/solid/useStore.d.ts.map +0 -1
  148. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
  149. /package/{dist/types/core → core}/types/TypeValidator.d.ts +0 -0
  150. /package/{dist/types/core → core}/utils/addNames.d.ts +0 -0
  151. /package/{dist/types/core → core}/utils/dynamic.d.ts +0 -0
  152. /package/{dist/types/core → core}/utils/findRouteByPathname.d.ts +0 -0
  153. /package/{dist/types/core → core}/utils/getDynamicValues.d.ts +0 -0
  154. /package/{dist/types/core → core}/utils/getQueryValues.d.ts +0 -0
  155. /package/{dist/types/core → core}/utils/getTypedEntries.d.ts +0 -0
  156. /package/{dist/types/core → core}/utils/history.d.ts +0 -0
  157. /package/{dist/types/core → core}/utils/loadComponentToConfig.d.ts +0 -0
  158. /package/{dist/types/react → preact}/index.d.ts +0 -0
  159. /package/{dist/types/solid → react}/index.d.ts +0 -0
  160. /package/{dist/types/solid → solid}/Router.d.ts +0 -0
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,53 +15,25 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // packages/core/index.ts
31
21
  var core_exports = {};
32
22
  __export(core_exports, {
33
- createRouterConfig: () => createRouterConfig,
34
- createRouterStore: () => createRouterStore,
35
- findRouteByPathname: () => findRouteByPathname,
36
- getInitialRoute: () => getInitialRoute,
23
+ RedirectError: () => RedirectError,
24
+ createRouter: () => createRouter,
25
+ createRoutes: () => createRoutes,
37
26
  history: () => history,
38
- isDynamicRoute: () => isDynamicRoute,
39
27
  loadComponentToConfig: () => loadComponentToConfig,
40
28
  replaceDynamicValues: () => replaceDynamicValues
41
29
  });
42
30
  module.exports = __toCommonJS(core_exports);
43
31
 
44
- // packages/core/utils/addNames.ts
45
- function addNames(obj) {
46
- Object.entries(obj).forEach(([key, value]) => {
47
- value.name = key;
48
- });
49
- return obj;
50
- }
51
-
52
- // packages/core/createRouterConfig.ts
53
- function createRouterConfig(config) {
54
- return addNames(config);
55
- }
56
-
57
- // packages/core/createRouterStore.ts
58
- var import_query_string2 = __toESM(require("query-string"));
59
-
60
32
  // packages/core/utils/constants.ts
61
33
  var constants = {
62
34
  dynamicSeparator: ":",
63
35
  pathPartSeparator: "/",
64
- isClient: typeof window !== "undefined",
65
- errorRedirect: "REDIRECT",
66
- errorPrevent: "PREVENT_REDIRECT"
36
+ isClient: typeof window !== "undefined"
67
37
  };
68
38
 
69
39
  // packages/core/utils/dynamic.ts
@@ -73,9 +43,6 @@ function isDynamic(param) {
73
43
  function clearDynamic(param) {
74
44
  return param.replace(new RegExp(`^${constants.dynamicSeparator}`), "");
75
45
  }
76
- function isDynamicRoute(route) {
77
- return "params" in route;
78
- }
79
46
 
80
47
  // packages/core/utils/getDynamicValues.ts
81
48
  function getDynamicValues(params) {
@@ -90,18 +57,65 @@ function getDynamicValues(params) {
90
57
  return dynamicParams;
91
58
  }
92
59
 
93
- // packages/core/utils/getQueryValues.ts
94
- var import_query_string = __toESM(require("query-string"));
60
+ // packages/core/utils/findRouteByPathname.ts
61
+ function completeStaticMatch(pathname, path) {
62
+ return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
63
+ }
64
+ function findRouteByPathname({
65
+ pathname,
66
+ routes
67
+ }) {
68
+ let dynamicRouteMatch;
69
+ const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
70
+ for (const routeName in routes) {
71
+ if (!Object.hasOwn(routes, routeName)) continue;
72
+ const route = routes[routeName];
73
+ if (completeStaticMatch(pathname, route.path)) return route;
74
+ if (dynamicRouteMatch) continue;
75
+ const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
76
+ if (routePathnameArray.length !== pathnameArray.length) continue;
77
+ const someParamInvalid = routePathnameArray.some((paramName, i) => {
78
+ const paramFromUrl = pathnameArray[i];
79
+ if (!isDynamic(paramName)) return paramName !== paramFromUrl;
80
+ const validator = route.params?.[clearDynamic(paramName)];
81
+ if (typeof validator !== "function") {
82
+ throw new Error(`findRoute: missing validator for param "${paramName}"`);
83
+ }
84
+ return !validator(paramFromUrl);
85
+ });
86
+ if (!someParamInvalid) dynamicRouteMatch = route;
87
+ }
88
+ return dynamicRouteMatch;
89
+ }
95
90
 
96
91
  // packages/core/utils/getTypedEntries.ts
97
92
  var getTypedEntries = Object.entries;
98
93
 
94
+ // packages/core/utils/queryString.ts
95
+ function removeHash(input) {
96
+ const hashStart = input.indexOf("#");
97
+ return hashStart === -1 ? input : input.slice(0, hashStart);
98
+ }
99
+ var queryString = {
100
+ extract(input) {
101
+ const inputNoHash = removeHash(input);
102
+ const queryStart = inputNoHash.indexOf("?");
103
+ return queryStart === -1 ? "" : inputNoHash.slice(queryStart + 1);
104
+ },
105
+ parse(input) {
106
+ return Object.fromEntries(new URLSearchParams(input));
107
+ },
108
+ stringify(obj) {
109
+ return new URLSearchParams(obj).toString();
110
+ }
111
+ };
112
+
99
113
  // packages/core/utils/getQueryValues.ts
100
114
  function getQueryValues(params) {
101
115
  const { route, pathname } = params;
102
- const qs = import_query_string.default.extract(pathname);
116
+ const qs = queryString.extract(pathname);
103
117
  if (!qs || !route.query) return {};
104
- const query = import_query_string.default.parse(qs);
118
+ const query = queryString.parse(qs);
105
119
  getTypedEntries(query).forEach(([key, value]) => {
106
120
  const validator = route.query[key];
107
121
  if (typeof validator !== "function" || !validator(value)) {
@@ -111,6 +125,16 @@ function getQueryValues(params) {
111
125
  return query;
112
126
  }
113
127
 
128
+ // packages/core/utils/getInitialRoute.ts
129
+ function getInitialRoute(params) {
130
+ const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes.notFound;
131
+ return {
132
+ route: route.name,
133
+ query: getQueryValues({ route, pathname: params.pathname }),
134
+ params: getDynamicValues({ route, pathname: params.pathname })
135
+ };
136
+ }
137
+
114
138
  // packages/core/utils/history.ts
115
139
  var import_history = require("history");
116
140
  var history = constants.isClient ? (0, import_history.createBrowserHistory)() : null;
@@ -118,18 +142,32 @@ var history = constants.isClient ? (0, import_history.createBrowserHistory)() :
118
142
  // packages/core/utils/loadComponentToConfig.ts
119
143
  function loadComponentToConfig(params) {
120
144
  const { route } = params;
121
- if (!route.component && route.loader) {
122
- const loadingFn = route.loader;
123
- return loadingFn().then((module2) => {
124
- const { default: component, pageName, ...rest } = module2;
145
+ if (!route.component) {
146
+ return route.loader().then((module2) => {
147
+ const { default: component, ...rest } = module2;
125
148
  route.component = component;
126
149
  route.otherExports = rest;
127
- route.pageName = pageName;
128
150
  });
129
151
  }
130
152
  return Promise.resolve();
131
153
  }
132
154
 
155
+ // packages/core/utils/PreventError.ts
156
+ var PreventError = class extends Error {
157
+ constructor(message) {
158
+ super(message);
159
+ this.name = "PreventError";
160
+ }
161
+ };
162
+
163
+ // packages/core/utils/RedirectError.ts
164
+ var RedirectError = class extends Error {
165
+ constructor(message) {
166
+ super(message);
167
+ this.name = "RedirectError";
168
+ }
169
+ };
170
+
133
171
  // packages/core/utils/replaceDynamicValues.ts
134
172
  var re = new RegExp(`[^${constants.pathPartSeparator}]+`, "g");
135
173
  function replaceDynamicValues({
@@ -148,87 +186,85 @@ function replaceDynamicValues({
148
186
  });
149
187
  }
150
188
 
151
- // packages/core/createRouterStore.ts
152
- function createRouterStore({
153
- batch,
154
- routes,
155
- autorun,
156
- replaceObject,
157
- routeError500,
158
- makeObservable,
159
- lifecycleParams
160
- }) {
161
- const routerStore = makeObservable({
189
+ // packages/core/createRouter.ts
190
+ function createRouter(config) {
191
+ const router = config.adapters.makeObservable({
162
192
  routesHistory: [],
163
193
  currentRoute: {},
164
194
  isRedirecting: false,
165
- redirectTo: void 0,
195
+ redirect: void 0,
196
+ restoreFromURL: void 0,
166
197
  restoreFromServer: void 0,
167
- utils: {
168
- batch,
169
- autorun,
170
- replaceObject,
171
- makeObservable
198
+ get adapters() {
199
+ return config.adapters;
200
+ },
201
+ get routes() {
202
+ return config.routes;
203
+ },
204
+ get lifecycleParams() {
205
+ return config.lifecycleParams;
172
206
  }
173
207
  });
174
- routerStore.restoreFromServer = function restoreFromServer(obj) {
175
- batch(() => {
176
- routerStore.routesHistory.push(...obj.routesHistory || []);
177
- Object.assign(routerStore.currentRoute, obj.currentRoute);
208
+ router.restoreFromServer = function restoreFromServer(obj) {
209
+ router.adapters.batch(() => {
210
+ router.routesHistory.push(...obj.routesHistory || []);
211
+ Object.assign(router.currentRoute, obj.currentRoute);
178
212
  });
179
- const preloadedRouteName = Object.keys(routes).find(
180
- (routeName) => routerStore.currentRoute.name === routeName
213
+ const preloadedRouteName = Object.keys(router.routes).find(
214
+ (routeName) => router.currentRoute.name === routeName
181
215
  );
182
- return loadComponentToConfig({ route: routes[preloadedRouteName] });
216
+ return loadComponentToConfig({ route: router.routes[preloadedRouteName] });
217
+ };
218
+ router.restoreFromURL = function restoreFromURL(params) {
219
+ return router.redirect(getInitialRoute({ routes: router.routes, ...params }));
183
220
  };
184
- routerStore.redirectTo = async function redirectTo(config) {
185
- const { route: routeName, noHistoryPush, asClient } = config;
186
- const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
221
+ router.redirect = async function redirect(config2) {
222
+ const { route: routeName, replace } = config2;
187
223
  let currentRoute;
188
224
  let currentPathname;
189
225
  let currentUrl;
190
226
  let currentSearch;
191
227
  let currentQuery;
192
- if (routerStore.currentRoute?.name) {
193
- currentRoute = routes[routerStore.currentRoute.name];
228
+ if (router.currentRoute?.name) {
229
+ currentRoute = router.routes[router.currentRoute.name];
194
230
  currentPathname = replaceDynamicValues({
195
231
  route: currentRoute,
196
- params: routerStore.currentRoute.params
232
+ params: router.currentRoute.params
197
233
  });
198
- currentUrl = import_query_string2.default.stringifyUrl({
199
- url: currentPathname,
200
- query: routerStore.currentRoute.query
201
- });
202
- currentQuery = routerStore.currentRoute.query;
203
- currentSearch = import_query_string2.default.stringify(routerStore.currentRoute.query);
234
+ currentQuery = router.currentRoute.query;
235
+ currentSearch = queryString.stringify(router.currentRoute.query);
236
+ currentUrl = `${currentPathname}${currentSearch ? `?${currentSearch}` : ""}`;
204
237
  }
205
- const nextRoute = routes[routeName];
238
+ const nextRoute = router.routes[routeName];
206
239
  const nextPathname = replaceDynamicValues({
207
240
  route: nextRoute,
208
- params: "params" in config ? config.params : void 0
241
+ params: "params" in config2 ? config2.params : void 0
209
242
  });
210
243
  let nextQuery;
211
244
  let nextUrl = nextPathname;
212
245
  let nextSearch;
213
- if ("query" in config && config.query) {
246
+ if ("query" in config2 && config2.query) {
214
247
  const clearedQuery = getQueryValues({
215
248
  route: nextRoute,
216
- pathname: `${nextPathname}?${import_query_string2.default.stringify(config.query)}`
249
+ pathname: `${nextPathname}?${queryString.stringify(config2.query)}`
217
250
  });
218
251
  if (Object.keys(clearedQuery).length > 0) {
219
252
  nextQuery = clearedQuery;
220
- nextSearch = import_query_string2.default.stringify(clearedQuery);
221
- nextUrl = import_query_string2.default.stringifyUrl({ url: nextPathname, query: clearedQuery });
253
+ nextSearch = queryString.stringify(clearedQuery);
254
+ nextUrl = `${nextPathname}?${nextSearch}`;
222
255
  }
223
256
  }
224
257
  if (currentUrl === nextUrl) return Promise.resolve();
225
258
  if (currentPathname === nextPathname) {
226
259
  if (currentSearch !== nextSearch) {
227
- batch(() => {
228
- replaceObject(routerStore.currentRoute.query, nextQuery || {});
229
- routerStore.routesHistory.push(nextUrl);
260
+ router.adapters.batch(() => {
261
+ router.adapters.replaceObject(router.currentRoute, {
262
+ ...router.currentRoute,
263
+ query: nextQuery || {}
264
+ });
265
+ router.routesHistory.push(nextUrl);
230
266
  });
231
- if (history && !noHistoryPush) {
267
+ if (history && !replace) {
232
268
  history.push({
233
269
  hash: history.location.hash,
234
270
  search: nextSearch,
@@ -238,144 +274,106 @@ function createRouterStore({
238
274
  }
239
275
  return Promise.resolve();
240
276
  }
241
- batch(() => {
242
- routerStore.isRedirecting = true;
277
+ router.adapters.batch(() => {
278
+ router.isRedirecting = true;
243
279
  });
244
280
  try {
245
- await currentRoute?.beforeLeave?.(
246
- {
247
- nextUrl,
248
- nextRoute,
249
- nextQuery,
250
- nextSearch,
251
- nextPathname,
252
- currentUrl,
253
- currentQuery,
254
- currentRoute,
255
- currentSearch,
256
- currentPathname
257
- },
258
- ...lifecycleParams || []
259
- );
260
- const redirectConfig = await nextRoute.beforeEnter?.(
261
- {
262
- nextUrl,
263
- nextRoute,
264
- nextQuery,
265
- nextSearch,
266
- nextPathname,
267
- currentUrl,
268
- currentQuery,
269
- currentRoute,
270
- currentSearch,
271
- currentPathname
272
- },
273
- ...lifecycleParams || []
274
- );
275
- if (typeof redirectConfig === "object") {
276
- if (isClient) return redirectTo({ ...redirectConfig, asClient });
277
- const redirectRoute = routes[redirectConfig.route];
278
- const redirectParams = "params" in redirectConfig && redirectConfig.params ? redirectConfig.params : void 0;
279
- let redirectUrl = replaceDynamicValues({
280
- params: redirectParams,
281
- route: redirectRoute
282
- });
283
- if ("query" in redirectConfig && redirectConfig.query) {
284
- const clearedQuery = getQueryValues({
285
- route: nextRoute,
286
- pathname: `${nextPathname}?${import_query_string2.default.stringify(redirectConfig.query)}`
281
+ const config3 = {
282
+ nextUrl,
283
+ nextRoute,
284
+ nextQuery,
285
+ nextSearch,
286
+ nextPathname,
287
+ currentUrl,
288
+ currentQuery,
289
+ currentRoute,
290
+ currentSearch,
291
+ currentPathname,
292
+ redirect: (redirectConfig2) => {
293
+ if (constants.isClient) return redirectConfig2;
294
+ const redirectRoute = router.routes[redirectConfig2.route];
295
+ const redirectParams = "params" in redirectConfig2 && redirectConfig2.params ? redirectConfig2.params : void 0;
296
+ let redirectUrl = replaceDynamicValues({
297
+ params: redirectParams,
298
+ route: redirectRoute
287
299
  });
288
- if (Object.keys(clearedQuery).length > 0) {
289
- redirectUrl = import_query_string2.default.stringifyUrl({ url: redirectUrl, query: clearedQuery });
300
+ if ("query" in redirectConfig2 && redirectConfig2.query) {
301
+ const clearedQuery = getQueryValues({
302
+ route: nextRoute,
303
+ pathname: `${nextPathname}?${queryString.stringify(redirectConfig2.query)}`
304
+ });
305
+ if (Object.keys(clearedQuery).length > 0) {
306
+ redirectUrl = `${redirectUrl}?${queryString.stringify(clearedQuery)}`;
307
+ }
290
308
  }
309
+ throw new RedirectError(redirectUrl);
310
+ },
311
+ preventRedirect: () => {
312
+ throw new PreventError(`Redirect to ${nextUrl} was prevented`);
291
313
  }
292
- throw Object.assign(new Error(redirectUrl), { name: constants.errorRedirect });
293
- }
294
- await loadComponentToConfig({ route: routes[nextRoute.name] });
314
+ };
315
+ await currentRoute?.beforeLeave?.(config3, ...router.lifecycleParams || []);
316
+ const redirectConfig = await nextRoute.beforeEnter?.(config3, ...router.lifecycleParams || []);
317
+ if (redirectConfig) return redirect(redirectConfig);
318
+ await loadComponentToConfig({ route: router.routes[nextRoute.name] });
295
319
  } catch (error) {
296
- if (error?.name === constants.errorPrevent) return Promise.resolve();
297
- if (error?.name === constants.errorRedirect) {
320
+ if (error instanceof PreventError) {
321
+ return Promise.resolve();
322
+ }
323
+ if (error instanceof RedirectError) {
298
324
  throw error;
299
325
  }
300
326
  console.error(error);
301
- await loadComponentToConfig({ route: routeError500 });
302
- batch(() => {
303
- replaceObject(routerStore.currentRoute, {
304
- name: routeError500.name,
305
- path: routeError500.path,
306
- props: routes[routeError500.name].props,
307
- query: {},
308
- params: {},
309
- pageName: routes[routeError500.name].pageName
327
+ await loadComponentToConfig({ route: router.routes.internalError });
328
+ router.adapters.batch(() => {
329
+ router.adapters.replaceObject(router.currentRoute, {
330
+ name: router.routes.internalError.name,
331
+ path: router.routes.internalError.path,
332
+ props: router.routes[router.routes.internalError.name].props,
333
+ query: router.adapters.makeObservable({}),
334
+ params: router.adapters.makeObservable({}),
335
+ pageId: router.routes[router.routes.internalError.name].pageId
310
336
  });
311
- routerStore.isRedirecting = false;
337
+ router.isRedirecting = false;
312
338
  });
313
339
  return Promise.resolve();
314
340
  }
315
- batch(() => {
316
- replaceObject(routerStore.currentRoute, {
341
+ router.adapters.batch(() => {
342
+ router.adapters.replaceObject(router.currentRoute, {
317
343
  name: nextRoute.name,
318
344
  path: nextRoute.path,
319
- props: routes[nextRoute.name].props,
345
+ props: router.routes[nextRoute.name].props,
320
346
  query: getQueryValues({ route: nextRoute, pathname: nextUrl }),
321
347
  params: getDynamicValues({ route: nextRoute, pathname: nextUrl }),
322
- pageName: routes[nextRoute.name].pageName
348
+ pageId: router.routes[nextRoute.name].pageId
323
349
  });
324
- const lastUrl = routerStore.routesHistory[routerStore.routesHistory.length - 1];
350
+ const lastUrl = router.routesHistory[router.routesHistory.length - 1];
325
351
  if (lastUrl !== nextUrl) {
326
- routerStore.routesHistory.push(nextUrl);
352
+ router.routesHistory.push(nextUrl);
327
353
  }
328
- if (history && !noHistoryPush) {
354
+ if (history && !replace) {
329
355
  history.push({
330
356
  hash: history.location.hash,
331
- search: "query" in config ? `?${import_query_string2.default.stringify(config.query)}` : "",
357
+ search: "query" in config2 ? `?${queryString.stringify(config2.query)}` : "",
332
358
  pathname: nextPathname
333
359
  });
334
360
  }
335
- routerStore.isRedirecting = false;
361
+ router.isRedirecting = false;
336
362
  });
337
363
  return Promise.resolve();
338
364
  };
339
- return routerStore;
365
+ return router;
340
366
  }
341
367
 
342
- // packages/core/utils/findRouteByPathname.ts
343
- function completeStaticMatch(pathname, path) {
344
- return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
345
- }
346
- function findRouteByPathname({
347
- pathname,
348
- routes
349
- }) {
350
- let dynamicRouteMatch;
351
- const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
352
- for (const routeName in routes) {
353
- if (!Object.hasOwn(routes, routeName)) continue;
354
- const route = routes[routeName];
355
- if (completeStaticMatch(pathname, route.path)) return route;
356
- if (dynamicRouteMatch) continue;
357
- const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
358
- if (routePathnameArray.length !== pathnameArray.length) continue;
359
- const someParamInvalid = routePathnameArray.some((paramName, i) => {
360
- const paramFromUrl = pathnameArray[i];
361
- if (!isDynamic(paramName)) return paramName !== paramFromUrl;
362
- const validator = route.params?.[clearDynamic(paramName)];
363
- if (typeof validator !== "function") {
364
- throw new Error(`findRoute: missing validator for param "${paramName}"`);
365
- }
366
- return !validator(paramFromUrl);
367
- });
368
- if (!someParamInvalid) dynamicRouteMatch = route;
369
- }
370
- return dynamicRouteMatch;
368
+ // packages/core/utils/addNames.ts
369
+ function addNames(obj) {
370
+ Object.entries(obj).forEach(([key, value]) => {
371
+ value.name = key;
372
+ });
373
+ return obj;
371
374
  }
372
375
 
373
- // packages/core/utils/getInitialRoute.ts
374
- function getInitialRoute(params) {
375
- const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes[params.fallback];
376
- return {
377
- route: route.name,
378
- query: getQueryValues({ route, pathname: params.pathname }),
379
- params: getDynamicValues({ route, pathname: params.pathname })
380
- };
376
+ // packages/core/createRoutes.ts
377
+ function createRoutes(config) {
378
+ return addNames(config);
381
379
  }