reactive-route 0.0.1-alpha.21 → 0.0.1-alpha.22
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.
- package/dist/cjs/index.js +116 -93
- package/dist/cjs/preact/index.js +10 -10
- package/dist/cjs/react/index.js +10 -10
- package/dist/cjs/solid/index.js +14 -14
- package/dist/core/createRouter.d.ts +4 -0
- package/dist/core/createRouter.d.ts.map +1 -0
- package/dist/core/{createRouterConfig.d.ts → createRoutes.d.ts} +2 -2
- package/dist/core/createRoutes.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/types/TypeLifecycleConfig.d.ts +2 -0
- package/dist/core/types/TypeLifecycleConfig.d.ts.map +1 -1
- package/dist/core/types/TypePropsRouter.d.ts +1 -1
- package/dist/core/types/TypePropsRouter.d.ts.map +1 -1
- package/dist/core/utils/PreventError.d.ts +4 -0
- package/dist/core/utils/PreventError.d.ts.map +1 -0
- package/dist/core/utils/RedirectError.d.ts +4 -0
- package/dist/core/utils/RedirectError.d.ts.map +1 -0
- package/dist/core/utils/constants.d.ts +0 -2
- package/dist/core/utils/constants.d.ts.map +1 -1
- package/dist/core/utils/getQueryValues.d.ts.map +1 -1
- package/dist/core/utils/queryString.d.ts +8 -0
- package/dist/core/utils/queryString.d.ts.map +1 -0
- package/dist/esm/index.js +114 -81
- package/dist/esm/preact/index.js +10 -10
- package/dist/esm/react/index.js +10 -10
- package/dist/esm/solid/index.js +14 -14
- package/dist/preact/Router.d.ts.map +1 -1
- package/dist/tsconfig.types.react.tsbuildinfo +1 -1
- package/package.json +2 -3
- package/dist/core/createRouterConfig.d.ts.map +0 -1
- package/dist/core/createRouterStore.d.ts +0 -4
- package/dist/core/createRouterStore.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreventError.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/PreventError.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedirectError.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/RedirectError.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;CAIrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getQueryValues.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/getQueryValues.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getQueryValues.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/getQueryValues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,wBAAgB,cAAc,CAAC,MAAM,SAAS,SAAS,EAAE,MAAM,EAAE;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAkBjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryString.d.ts","sourceRoot":"","sources":["../../../packages/core/utils/queryString.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW;mBACP,MAAM;iBAOR,MAAM;;;mBAGJ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
|
-
// packages/core/utils/addNames.ts
|
|
2
|
-
function addNames(obj) {
|
|
3
|
-
Object.entries(obj).forEach(([key, value]) => {
|
|
4
|
-
value.name = key;
|
|
5
|
-
});
|
|
6
|
-
return obj;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// packages/core/createRouterConfig.ts
|
|
10
|
-
function createRouterConfig(config) {
|
|
11
|
-
return addNames(config);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// packages/core/createRouterStore.ts
|
|
15
|
-
import queryString2 from "query-string";
|
|
16
|
-
|
|
17
1
|
// packages/core/utils/constants.ts
|
|
18
2
|
var constants = {
|
|
19
3
|
dynamicSeparator: ":",
|
|
20
4
|
pathPartSeparator: "/",
|
|
21
|
-
isClient: typeof window !== "undefined"
|
|
22
|
-
errorRedirect: "REDIRECT",
|
|
23
|
-
errorPrevent: "PREVENT_REDIRECT"
|
|
5
|
+
isClient: typeof window !== "undefined"
|
|
24
6
|
};
|
|
25
7
|
|
|
26
8
|
// packages/core/utils/dynamic.ts
|
|
@@ -78,12 +60,28 @@ function findRouteByPathname({
|
|
|
78
60
|
return dynamicRouteMatch;
|
|
79
61
|
}
|
|
80
62
|
|
|
81
|
-
// packages/core/utils/getQueryValues.ts
|
|
82
|
-
import queryString from "query-string";
|
|
83
|
-
|
|
84
63
|
// packages/core/utils/getTypedEntries.ts
|
|
85
64
|
var getTypedEntries = Object.entries;
|
|
86
65
|
|
|
66
|
+
// packages/core/utils/queryString.ts
|
|
67
|
+
function removeHash(input) {
|
|
68
|
+
const hashStart = input.indexOf("#");
|
|
69
|
+
return hashStart === -1 ? input : input.slice(0, hashStart);
|
|
70
|
+
}
|
|
71
|
+
var queryString = {
|
|
72
|
+
extract(input) {
|
|
73
|
+
const inputNoHash = removeHash(input);
|
|
74
|
+
const queryStart = inputNoHash.indexOf("?");
|
|
75
|
+
return queryStart === -1 ? "" : inputNoHash.slice(queryStart + 1);
|
|
76
|
+
},
|
|
77
|
+
parse(input) {
|
|
78
|
+
return Object.fromEntries(new URLSearchParams(input));
|
|
79
|
+
},
|
|
80
|
+
stringify(obj) {
|
|
81
|
+
return new URLSearchParams(obj).toString();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
87
85
|
// packages/core/utils/getQueryValues.ts
|
|
88
86
|
function getQueryValues(params) {
|
|
89
87
|
const { route, pathname } = params;
|
|
@@ -128,6 +126,22 @@ function loadComponentToConfig(params) {
|
|
|
128
126
|
return Promise.resolve();
|
|
129
127
|
}
|
|
130
128
|
|
|
129
|
+
// packages/core/utils/PreventError.ts
|
|
130
|
+
var PreventError = class extends Error {
|
|
131
|
+
constructor(message) {
|
|
132
|
+
super(message);
|
|
133
|
+
this.name = "PreventError";
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// packages/core/utils/RedirectError.ts
|
|
138
|
+
var RedirectError = class extends Error {
|
|
139
|
+
constructor(message) {
|
|
140
|
+
super(message);
|
|
141
|
+
this.name = "RedirectError";
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
131
145
|
// packages/core/utils/replaceDynamicValues.ts
|
|
132
146
|
var re = new RegExp(`[^${constants.pathPartSeparator}]+`, "g");
|
|
133
147
|
function replaceDynamicValues({
|
|
@@ -146,53 +160,52 @@ function replaceDynamicValues({
|
|
|
146
160
|
});
|
|
147
161
|
}
|
|
148
162
|
|
|
149
|
-
// packages/core/
|
|
150
|
-
function
|
|
163
|
+
// packages/core/createRouter.ts
|
|
164
|
+
function createRouter({
|
|
151
165
|
adapters,
|
|
152
166
|
routes,
|
|
153
167
|
lifecycleParams
|
|
154
168
|
}) {
|
|
155
|
-
const
|
|
169
|
+
const router = adapters.makeObservable({
|
|
156
170
|
routesHistory: [],
|
|
157
171
|
currentRoute: {},
|
|
158
172
|
isRedirecting: false,
|
|
159
173
|
redirectTo: void 0,
|
|
160
174
|
restoreFromURL: void 0,
|
|
161
175
|
restoreFromServer: void 0,
|
|
162
|
-
adapters
|
|
176
|
+
get adapters() {
|
|
177
|
+
return adapters;
|
|
178
|
+
}
|
|
163
179
|
});
|
|
164
|
-
|
|
180
|
+
router.restoreFromServer = function restoreFromServer(obj) {
|
|
165
181
|
adapters.batch(() => {
|
|
166
|
-
|
|
167
|
-
Object.assign(
|
|
182
|
+
router.routesHistory.push(...obj.routesHistory || []);
|
|
183
|
+
Object.assign(router.currentRoute, obj.currentRoute);
|
|
168
184
|
});
|
|
169
185
|
const preloadedRouteName = Object.keys(routes).find(
|
|
170
|
-
(routeName) =>
|
|
186
|
+
(routeName) => router.currentRoute.name === routeName
|
|
171
187
|
);
|
|
172
188
|
return loadComponentToConfig({ route: routes[preloadedRouteName] });
|
|
173
189
|
};
|
|
174
|
-
|
|
175
|
-
return
|
|
190
|
+
router.restoreFromURL = function restoreFromURL(params) {
|
|
191
|
+
return router.redirectTo(getInitialRoute({ routes, pathname: params.pathname }));
|
|
176
192
|
};
|
|
177
|
-
|
|
193
|
+
router.redirectTo = async function redirectTo(config) {
|
|
178
194
|
const { route: routeName, noHistoryPush } = config;
|
|
179
195
|
let currentRoute;
|
|
180
196
|
let currentPathname;
|
|
181
197
|
let currentUrl;
|
|
182
198
|
let currentSearch;
|
|
183
199
|
let currentQuery;
|
|
184
|
-
if (
|
|
185
|
-
currentRoute = routes[
|
|
200
|
+
if (router.currentRoute?.name) {
|
|
201
|
+
currentRoute = routes[router.currentRoute.name];
|
|
186
202
|
currentPathname = replaceDynamicValues({
|
|
187
203
|
route: currentRoute,
|
|
188
|
-
params:
|
|
189
|
-
});
|
|
190
|
-
currentUrl = queryString2.stringifyUrl({
|
|
191
|
-
url: currentPathname,
|
|
192
|
-
query: routerStore.currentRoute.query
|
|
204
|
+
params: router.currentRoute.params
|
|
193
205
|
});
|
|
194
|
-
currentQuery =
|
|
195
|
-
currentSearch =
|
|
206
|
+
currentQuery = router.currentRoute.query;
|
|
207
|
+
currentSearch = queryString.stringify(router.currentRoute.query);
|
|
208
|
+
currentUrl = `${currentPathname}${currentSearch ? `?${currentSearch}` : ""}`;
|
|
196
209
|
}
|
|
197
210
|
const nextRoute = routes[routeName];
|
|
198
211
|
const nextPathname = replaceDynamicValues({
|
|
@@ -205,23 +218,23 @@ function createRouterStore({
|
|
|
205
218
|
if ("query" in config && config.query) {
|
|
206
219
|
const clearedQuery = getQueryValues({
|
|
207
220
|
route: nextRoute,
|
|
208
|
-
pathname: `${nextPathname}?${
|
|
221
|
+
pathname: `${nextPathname}?${queryString.stringify(config.query)}`
|
|
209
222
|
});
|
|
210
223
|
if (Object.keys(clearedQuery).length > 0) {
|
|
211
224
|
nextQuery = clearedQuery;
|
|
212
|
-
nextSearch =
|
|
213
|
-
nextUrl =
|
|
225
|
+
nextSearch = queryString.stringify(clearedQuery);
|
|
226
|
+
nextUrl = `${nextPathname}?${nextSearch}`;
|
|
214
227
|
}
|
|
215
228
|
}
|
|
216
229
|
if (currentUrl === nextUrl) return Promise.resolve();
|
|
217
230
|
if (currentPathname === nextPathname) {
|
|
218
231
|
if (currentSearch !== nextSearch) {
|
|
219
232
|
adapters.batch(() => {
|
|
220
|
-
adapters.replaceObject(
|
|
221
|
-
...
|
|
233
|
+
adapters.replaceObject(router.currentRoute, {
|
|
234
|
+
...router.currentRoute,
|
|
222
235
|
query: nextQuery || {}
|
|
223
236
|
});
|
|
224
|
-
|
|
237
|
+
router.routesHistory.push(nextUrl);
|
|
225
238
|
});
|
|
226
239
|
if (history && !noHistoryPush) {
|
|
227
240
|
history.push({
|
|
@@ -234,7 +247,7 @@ function createRouterStore({
|
|
|
234
247
|
return Promise.resolve();
|
|
235
248
|
}
|
|
236
249
|
adapters.batch(() => {
|
|
237
|
-
|
|
250
|
+
router.isRedirecting = true;
|
|
238
251
|
});
|
|
239
252
|
try {
|
|
240
253
|
const config2 = {
|
|
@@ -247,39 +260,45 @@ function createRouterStore({
|
|
|
247
260
|
currentQuery,
|
|
248
261
|
currentRoute,
|
|
249
262
|
currentSearch,
|
|
250
|
-
currentPathname
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
let redirectUrl = replaceDynamicValues({
|
|
259
|
-
params: redirectParams,
|
|
260
|
-
route: redirectRoute
|
|
261
|
-
});
|
|
262
|
-
if ("query" in redirectConfig && redirectConfig.query) {
|
|
263
|
-
const clearedQuery = getQueryValues({
|
|
264
|
-
route: nextRoute,
|
|
265
|
-
pathname: `${nextPathname}?${queryString2.stringify(redirectConfig.query)}`
|
|
263
|
+
currentPathname,
|
|
264
|
+
redirect: (redirectConfig2) => {
|
|
265
|
+
if (constants.isClient) return redirectConfig2;
|
|
266
|
+
const redirectRoute = routes[redirectConfig2.route];
|
|
267
|
+
const redirectParams = "params" in redirectConfig2 && redirectConfig2.params ? redirectConfig2.params : void 0;
|
|
268
|
+
let redirectUrl = replaceDynamicValues({
|
|
269
|
+
params: redirectParams,
|
|
270
|
+
route: redirectRoute
|
|
266
271
|
});
|
|
267
|
-
if (
|
|
268
|
-
|
|
272
|
+
if ("query" in redirectConfig2 && redirectConfig2.query) {
|
|
273
|
+
const clearedQuery = getQueryValues({
|
|
274
|
+
route: nextRoute,
|
|
275
|
+
pathname: `${nextPathname}?${queryString.stringify(redirectConfig2.query)}`
|
|
276
|
+
});
|
|
277
|
+
if (Object.keys(clearedQuery).length > 0) {
|
|
278
|
+
redirectUrl = `${redirectUrl}?${queryString.stringify(clearedQuery)}`;
|
|
279
|
+
}
|
|
269
280
|
}
|
|
281
|
+
throw new RedirectError(redirectUrl);
|
|
282
|
+
},
|
|
283
|
+
preventRedirect: () => {
|
|
284
|
+
throw new PreventError(`Redirect to ${nextUrl} was prevented`);
|
|
270
285
|
}
|
|
271
|
-
|
|
272
|
-
|
|
286
|
+
};
|
|
287
|
+
await currentRoute?.beforeLeave?.(config2, ...lifecycleParams || []);
|
|
288
|
+
const redirectConfig = await nextRoute.beforeEnter?.(config2, ...lifecycleParams || []);
|
|
289
|
+
if (redirectConfig) return redirectTo(redirectConfig);
|
|
273
290
|
await loadComponentToConfig({ route: routes[nextRoute.name] });
|
|
274
291
|
} catch (error) {
|
|
275
|
-
if (error
|
|
276
|
-
|
|
292
|
+
if (error instanceof PreventError) {
|
|
293
|
+
return Promise.resolve();
|
|
294
|
+
}
|
|
295
|
+
if (error instanceof RedirectError) {
|
|
277
296
|
throw error;
|
|
278
297
|
}
|
|
279
298
|
console.error(error);
|
|
280
299
|
await loadComponentToConfig({ route: routes.internalError });
|
|
281
300
|
adapters.batch(() => {
|
|
282
|
-
adapters.replaceObject(
|
|
301
|
+
adapters.replaceObject(router.currentRoute, {
|
|
283
302
|
name: routes.internalError.name,
|
|
284
303
|
path: routes.internalError.path,
|
|
285
304
|
props: routes[routes.internalError.name].props,
|
|
@@ -287,12 +306,12 @@ function createRouterStore({
|
|
|
287
306
|
params: adapters.makeObservable({}),
|
|
288
307
|
pageName: routes[routes.internalError.name].pageName
|
|
289
308
|
});
|
|
290
|
-
|
|
309
|
+
router.isRedirecting = false;
|
|
291
310
|
});
|
|
292
311
|
return Promise.resolve();
|
|
293
312
|
}
|
|
294
313
|
adapters.batch(() => {
|
|
295
|
-
adapters.replaceObject(
|
|
314
|
+
adapters.replaceObject(router.currentRoute, {
|
|
296
315
|
name: nextRoute.name,
|
|
297
316
|
path: nextRoute.path,
|
|
298
317
|
props: routes[nextRoute.name].props,
|
|
@@ -300,26 +319,40 @@ function createRouterStore({
|
|
|
300
319
|
params: getDynamicValues({ route: nextRoute, pathname: nextUrl }),
|
|
301
320
|
pageName: routes[nextRoute.name].pageName
|
|
302
321
|
});
|
|
303
|
-
const lastUrl =
|
|
322
|
+
const lastUrl = router.routesHistory[router.routesHistory.length - 1];
|
|
304
323
|
if (lastUrl !== nextUrl) {
|
|
305
|
-
|
|
324
|
+
router.routesHistory.push(nextUrl);
|
|
306
325
|
}
|
|
307
326
|
if (history && !noHistoryPush) {
|
|
308
327
|
history.push({
|
|
309
328
|
hash: history.location.hash,
|
|
310
|
-
search: "query" in config ? `?${
|
|
329
|
+
search: "query" in config ? `?${queryString.stringify(config.query)}` : "",
|
|
311
330
|
pathname: nextPathname
|
|
312
331
|
});
|
|
313
332
|
}
|
|
314
|
-
|
|
333
|
+
router.isRedirecting = false;
|
|
315
334
|
});
|
|
316
335
|
return Promise.resolve();
|
|
317
336
|
};
|
|
318
|
-
return
|
|
337
|
+
return router;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// packages/core/utils/addNames.ts
|
|
341
|
+
function addNames(obj) {
|
|
342
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
343
|
+
value.name = key;
|
|
344
|
+
});
|
|
345
|
+
return obj;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// packages/core/createRoutes.ts
|
|
349
|
+
function createRoutes(config) {
|
|
350
|
+
return addNames(config);
|
|
319
351
|
}
|
|
320
352
|
export {
|
|
321
|
-
|
|
322
|
-
|
|
353
|
+
RedirectError,
|
|
354
|
+
createRouter,
|
|
355
|
+
createRoutes,
|
|
323
356
|
findRouteByPathname,
|
|
324
357
|
getInitialRoute,
|
|
325
358
|
history,
|
package/dist/esm/preact/index.js
CHANGED
|
@@ -8,11 +8,11 @@ function RouterInner(props) {
|
|
|
8
8
|
if (!history) return;
|
|
9
9
|
history.listen((params) => {
|
|
10
10
|
if (params.action !== "POP") return;
|
|
11
|
-
const previousRoutePathname = props.
|
|
11
|
+
const previousRoutePathname = props.router.routesHistory[props.router.routesHistory.length - 2];
|
|
12
12
|
if (previousRoutePathname === params.location.pathname) {
|
|
13
|
-
props.
|
|
13
|
+
props.router.adapters.batch(() => props.router.routesHistory.pop());
|
|
14
14
|
}
|
|
15
|
-
void props.
|
|
15
|
+
void props.router.redirectTo({
|
|
16
16
|
noHistoryPush: true,
|
|
17
17
|
...getInitialRoute({
|
|
18
18
|
routes: props.routes,
|
|
@@ -22,7 +22,7 @@ function RouterInner(props) {
|
|
|
22
22
|
});
|
|
23
23
|
}, []);
|
|
24
24
|
const [config] = useState(
|
|
25
|
-
() => props.
|
|
25
|
+
() => props.router.adapters.makeObservable({
|
|
26
26
|
loadedComponentName: void 0,
|
|
27
27
|
loadedComponentPage: void 0,
|
|
28
28
|
currentProps: {}
|
|
@@ -30,21 +30,21 @@ function RouterInner(props) {
|
|
|
30
30
|
);
|
|
31
31
|
const setLoadedComponent = useCallback(() => {
|
|
32
32
|
const { loadedComponentName, loadedComponentPage } = config;
|
|
33
|
-
const { currentRoute, isRedirecting } = props.
|
|
33
|
+
const { currentRoute, isRedirecting } = props.router;
|
|
34
34
|
const componentConfig = props.routes[currentRoute.name];
|
|
35
35
|
let preventRedirect = false;
|
|
36
36
|
if (isRedirecting) preventRedirect = true;
|
|
37
37
|
else if (loadedComponentName === currentRoute.name) preventRedirect = true;
|
|
38
38
|
else if (loadedComponentPage != null && currentRoute.name != null) {
|
|
39
39
|
if (loadedComponentPage === currentRoute.pageName) {
|
|
40
|
-
props.
|
|
40
|
+
props.router.adapters.batch(() => {
|
|
41
41
|
config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
|
|
42
42
|
});
|
|
43
43
|
preventRedirect = true;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
if (preventRedirect) return;
|
|
47
|
-
props.
|
|
47
|
+
props.router.adapters.batch(() => {
|
|
48
48
|
if (loadedComponentName) props.beforeUpdatePageComponent?.();
|
|
49
49
|
props.beforeSetPageComponent?.(componentConfig);
|
|
50
50
|
config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
|
|
@@ -53,11 +53,11 @@ function RouterInner(props) {
|
|
|
53
53
|
});
|
|
54
54
|
}, []);
|
|
55
55
|
useState(() => {
|
|
56
|
-
props.
|
|
56
|
+
props.router.adapters.batch(() => {
|
|
57
57
|
props.beforeMount?.();
|
|
58
58
|
redirectOnHistoryPop();
|
|
59
59
|
setLoadedComponent();
|
|
60
|
-
disposerRef.current = props.
|
|
60
|
+
disposerRef.current = props.router.adapters.autorun(setLoadedComponent);
|
|
61
61
|
});
|
|
62
62
|
});
|
|
63
63
|
useEffect(() => {
|
|
@@ -72,7 +72,7 @@ function RouterInner(props) {
|
|
|
72
72
|
}
|
|
73
73
|
function Router(props) {
|
|
74
74
|
const [Component] = useState(
|
|
75
|
-
() => props.
|
|
75
|
+
() => props.router.adapters.observer ? props.router.adapters.observer(RouterInner) : RouterInner
|
|
76
76
|
);
|
|
77
77
|
return /* @__PURE__ */ jsx(Component, { ...props });
|
|
78
78
|
}
|
package/dist/esm/react/index.js
CHANGED
|
@@ -8,11 +8,11 @@ function RouterInner(props) {
|
|
|
8
8
|
if (!history) return;
|
|
9
9
|
history.listen((params) => {
|
|
10
10
|
if (params.action !== "POP") return;
|
|
11
|
-
const previousRoutePathname = props.
|
|
11
|
+
const previousRoutePathname = props.router.routesHistory[props.router.routesHistory.length - 2];
|
|
12
12
|
if (previousRoutePathname === params.location.pathname) {
|
|
13
|
-
props.
|
|
13
|
+
props.router.adapters.batch(() => props.router.routesHistory.pop());
|
|
14
14
|
}
|
|
15
|
-
void props.
|
|
15
|
+
void props.router.redirectTo({
|
|
16
16
|
noHistoryPush: true,
|
|
17
17
|
...getInitialRoute({
|
|
18
18
|
routes: props.routes,
|
|
@@ -22,7 +22,7 @@ function RouterInner(props) {
|
|
|
22
22
|
});
|
|
23
23
|
}, []);
|
|
24
24
|
const [config] = useState(
|
|
25
|
-
() => props.
|
|
25
|
+
() => props.router.adapters.makeObservable({
|
|
26
26
|
loadedComponentName: void 0,
|
|
27
27
|
loadedComponentPage: void 0,
|
|
28
28
|
currentProps: {}
|
|
@@ -30,21 +30,21 @@ function RouterInner(props) {
|
|
|
30
30
|
);
|
|
31
31
|
const setLoadedComponent = useCallback(() => {
|
|
32
32
|
const { loadedComponentName, loadedComponentPage } = config;
|
|
33
|
-
const { currentRoute, isRedirecting } = props.
|
|
33
|
+
const { currentRoute, isRedirecting } = props.router;
|
|
34
34
|
const componentConfig = props.routes[currentRoute.name];
|
|
35
35
|
let preventRedirect = false;
|
|
36
36
|
if (isRedirecting) preventRedirect = true;
|
|
37
37
|
else if (loadedComponentName === currentRoute.name) preventRedirect = true;
|
|
38
38
|
else if (loadedComponentPage != null && currentRoute.name != null) {
|
|
39
39
|
if (loadedComponentPage === currentRoute.pageName) {
|
|
40
|
-
props.
|
|
40
|
+
props.router.adapters.batch(() => {
|
|
41
41
|
config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
|
|
42
42
|
});
|
|
43
43
|
preventRedirect = true;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
if (preventRedirect) return;
|
|
47
|
-
props.
|
|
47
|
+
props.router.adapters.batch(() => {
|
|
48
48
|
if (loadedComponentName) props.beforeUpdatePageComponent?.();
|
|
49
49
|
props.beforeSetPageComponent?.(componentConfig);
|
|
50
50
|
config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
|
|
@@ -53,11 +53,11 @@ function RouterInner(props) {
|
|
|
53
53
|
});
|
|
54
54
|
}, []);
|
|
55
55
|
useState(() => {
|
|
56
|
-
props.
|
|
56
|
+
props.router.adapters.batch(() => {
|
|
57
57
|
props.beforeMount?.();
|
|
58
58
|
redirectOnHistoryPop();
|
|
59
59
|
setLoadedComponent();
|
|
60
|
-
disposerRef.current = props.
|
|
60
|
+
disposerRef.current = props.router.adapters.autorun(setLoadedComponent);
|
|
61
61
|
});
|
|
62
62
|
});
|
|
63
63
|
useEffect(() => {
|
|
@@ -71,7 +71,7 @@ function RouterInner(props) {
|
|
|
71
71
|
return null;
|
|
72
72
|
}
|
|
73
73
|
function RouterWrapper(props) {
|
|
74
|
-
const Component = props.
|
|
74
|
+
const Component = props.router.adapters.observer ? props.router.adapters.observer(RouterInner) : RouterInner;
|
|
75
75
|
return /* @__PURE__ */ jsx(Component, { ...props });
|
|
76
76
|
}
|
|
77
77
|
var Router = memo(RouterWrapper);
|
package/dist/esm/solid/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { getInitialRoute, history } from "reactive-route";
|
|
|
5
5
|
import { Show } from "solid-js";
|
|
6
6
|
import { Dynamic } from "solid-js/web";
|
|
7
7
|
function Router(props) {
|
|
8
|
-
const config = props.
|
|
8
|
+
const config = props.router.adapters.makeObservable({
|
|
9
9
|
loadedComponentName: void 0,
|
|
10
10
|
loadedComponentPage: void 0,
|
|
11
11
|
currentProps: {}
|
|
@@ -14,11 +14,11 @@ function Router(props) {
|
|
|
14
14
|
if (!history) return;
|
|
15
15
|
history.listen((params) => {
|
|
16
16
|
if (params.action !== "POP") return;
|
|
17
|
-
const previousRoutePathname = props.
|
|
17
|
+
const previousRoutePathname = props.router.routesHistory[props.router.routesHistory.length - 2];
|
|
18
18
|
if (previousRoutePathname === params.location.pathname) {
|
|
19
|
-
props.
|
|
19
|
+
props.router.routesHistory.pop();
|
|
20
20
|
}
|
|
21
|
-
void props.
|
|
21
|
+
void props.router.redirectTo({
|
|
22
22
|
noHistoryPush: true,
|
|
23
23
|
...getInitialRoute({
|
|
24
24
|
routes: props.routes,
|
|
@@ -28,27 +28,27 @@ function Router(props) {
|
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
function setLoadedComponent() {
|
|
31
|
-
const currentRouteName = props.
|
|
32
|
-
const currentRoutePage = props.
|
|
31
|
+
const currentRouteName = props.router.currentRoute.name;
|
|
32
|
+
const currentRoutePage = props.router.currentRoute.pageName;
|
|
33
33
|
const componentConfig = props.routes[currentRouteName];
|
|
34
34
|
let preventRedirect = false;
|
|
35
|
-
if (props.
|
|
35
|
+
if (props.router.isRedirecting) preventRedirect = true;
|
|
36
36
|
else if (config.loadedComponentName === currentRouteName) {
|
|
37
37
|
preventRedirect = true;
|
|
38
38
|
} else if (config.loadedComponentPage != null && currentRouteName != null) {
|
|
39
39
|
if (config.loadedComponentPage === currentRoutePage) {
|
|
40
|
-
props.
|
|
40
|
+
props.router.adapters.replaceObject(config.currentProps, "props" in componentConfig ? componentConfig.props : {});
|
|
41
41
|
preventRedirect = true;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
if (preventRedirect) return;
|
|
45
|
-
props.
|
|
45
|
+
props.router.adapters.batch(() => {
|
|
46
46
|
if (config.loadedComponentName) {
|
|
47
47
|
props.beforeUpdatePageComponent?.();
|
|
48
48
|
}
|
|
49
49
|
props.beforeSetPageComponent?.(componentConfig);
|
|
50
|
-
props.
|
|
51
|
-
props.
|
|
50
|
+
props.router.adapters.batch(() => {
|
|
51
|
+
props.router.adapters.replaceObject(config.currentProps, "props" in componentConfig ? componentConfig.props : {});
|
|
52
52
|
config.loadedComponentName = currentRouteName;
|
|
53
53
|
config.loadedComponentPage = componentConfig.pageName;
|
|
54
54
|
});
|
|
@@ -56,12 +56,12 @@ function Router(props) {
|
|
|
56
56
|
}
|
|
57
57
|
props.beforeMount?.();
|
|
58
58
|
redirectOnHistoryPop();
|
|
59
|
-
if (props.
|
|
60
|
-
props.
|
|
59
|
+
if (props.router.adapters.immediateSetComponent) {
|
|
60
|
+
props.router.adapters.batch(() => {
|
|
61
61
|
setLoadedComponent();
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
|
-
props.
|
|
64
|
+
props.router.adapters.autorun(() => setLoadedComponent());
|
|
65
65
|
return (
|
|
66
66
|
// @ts-ignore
|
|
67
67
|
_$createComponent(Show, {
|
|
@@ -1 +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,
|
|
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,GAK1D,GAAG,CACzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../packages/adapters/kr-observable-preact.ts","../packages/adapters/kr-observable-react.ts","../packages/adapters/kr-observable-solid.ts","../packages/adapters/mobx-preact.ts","../packages/adapters/mobx-react.ts","../packages/adapters/mobx-solid.ts","../packages/adapters/solid.ts","../packages/core/
|
|
1
|
+
{"root":["../packages/adapters/kr-observable-preact.ts","../packages/adapters/kr-observable-react.ts","../packages/adapters/kr-observable-solid.ts","../packages/adapters/mobx-preact.ts","../packages/adapters/mobx-react.ts","../packages/adapters/mobx-solid.ts","../packages/adapters/solid.ts","../packages/core/createRouter.ts","../packages/core/createRoutes.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/PreventError.ts","../packages/core/utils/RedirectError.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/queryString.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.
|
|
5
|
+
"version": "0.0.1-alpha.22",
|
|
6
6
|
"description": "Reactive Router for different frameworks",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -29,8 +29,7 @@
|
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"history": "5.3.0"
|
|
33
|
-
"query-string": "7.1.3"
|
|
32
|
+
"history": "5.3.0"
|
|
34
33
|
},
|
|
35
34
|
"devDependencies": {
|
|
36
35
|
"@types/babel__core": "7.20.5",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createRouterConfig.d.ts","sourceRoot":"","sources":["../../packages/core/createRouterConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,wBAAgB,kBAAkB,CAChC,OAAO,SAAS;KAAG,GAAG,IAAI,MAAM,OAAO,GAAG,UAAU,GAAG,eAAe,GAAG,YAAY;CAAE,EAEvF,MAAM,EAAE,OAAO,GACd;KACA,GAAG,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG;QACrC,IAAI,EAAE,GAAG,CAAC;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,GAAG,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;CACF,CAEA"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { InterfaceRouterStore, TypeCreateRouterStore } from './types/InterfaceRouterStore';
|
|
2
|
-
import { TypeRoute } from './types/TypeRoute';
|
|
3
|
-
export declare function createRouterStore<TRoutes extends Record<string | 'notFound' | 'internalError', TypeRoute>>({ adapters, routes, lifecycleParams, }: TypeCreateRouterStore<TRoutes>): InterfaceRouterStore<TRoutes>;
|
|
4
|
-
//# sourceMappingURL=createRouterStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|