reactive-route 0.0.1-alpha.0 → 0.0.1-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/adapters/kr-observable/index.js +40 -0
- package/dist/cjs/adapters/kr-observable/package.json +1 -0
- package/dist/cjs/adapters/mobx/index.js +44 -0
- package/dist/cjs/adapters/mobx/package.json +1 -0
- package/dist/cjs/adapters/solid/index.js +48 -0
- package/dist/cjs/adapters/solid/package.json +1 -0
- package/dist/cjs/index.js +204 -13
- package/dist/cjs/react/index.js +56 -98
- package/dist/cjs/solid/index.js +38 -97
- package/dist/esm/adapters/kr-observable/index.js +19 -0
- package/dist/esm/adapters/kr-observable/package.json +1 -0
- package/dist/esm/adapters/mobx/index.js +23 -0
- package/dist/esm/adapters/mobx/package.json +1 -0
- package/dist/esm/adapters/solid/index.js +27 -0
- package/dist/esm/adapters/solid/package.json +1 -0
- package/dist/esm/index.js +204 -13
- package/dist/esm/react/index.js +56 -98
- package/dist/esm/solid/index.js +37 -96
- package/dist/types/adapters/kr-observable.d.ts +3 -0
- package/dist/types/adapters/kr-observable.d.ts.map +1 -0
- package/dist/types/adapters/mobx.d.ts +3 -0
- package/dist/types/adapters/mobx.d.ts.map +1 -0
- package/dist/types/adapters/solid.d.ts +3 -0
- package/dist/types/adapters/solid.d.ts.map +1 -0
- package/dist/types/core/createRouterConfig.d.ts +2 -6
- package/dist/types/core/createRouterConfig.d.ts.map +1 -1
- package/dist/types/core/createRouterStore.d.ts +2 -11
- package/dist/types/core/createRouterStore.d.ts.map +1 -1
- package/dist/types/core/index.d.ts +3 -1
- package/dist/types/core/index.d.ts.map +1 -1
- package/dist/types/core/types/InterfaceRouterStore.d.ts +22 -1
- package/dist/types/core/types/InterfaceRouterStore.d.ts.map +1 -1
- package/dist/types/core/types/TypeLifecycleConfig.d.ts +13 -0
- package/dist/types/core/types/TypeLifecycleConfig.d.ts.map +1 -0
- package/dist/types/core/types/TypePropsRouter.d.ts +10 -0
- package/dist/types/core/types/TypePropsRouter.d.ts.map +1 -0
- package/dist/types/core/types/TypeRouteRaw.d.ts +3 -24
- package/dist/types/core/types/TypeRouteRaw.d.ts.map +1 -1
- package/dist/types/react/Router.d.ts +3 -11
- package/dist/types/react/Router.d.ts.map +1 -1
- package/dist/types/solid/Router.d.ts +2 -10
- package/dist/types/solid/Router.d.ts.map +1 -1
- package/dist/types/tsconfig.types.react.tsbuildinfo +1 -0
- package/dist/types/tsconfig.types.solid.tsbuildinfo +1 -0
- package/package.json +48 -21
- package/tsconfig.solid.json +9 -0
- package/tsconfig.types.react.json +11 -0
- package/tsconfig.types.solid.json +14 -0
- package/dist/types/react/useStore.d.ts +0 -8
- package/dist/types/react/useStore.d.ts.map +0 -1
- package/dist/types/solid/replaceObject.d.ts +0 -2
- package/dist/types/solid/replaceObject.d.ts.map +0 -1
- package/dist/types/solid/useStore.d.ts +0 -7
- package/dist/types/solid/useStore.d.ts.map +0 -1
- package/dist/types/tsconfig.types.tsbuildinfo +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/adapters/kr-observable.ts
|
|
21
|
+
var kr_observable_exports = {};
|
|
22
|
+
__export(kr_observable_exports, {
|
|
23
|
+
adapters: () => adapters
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(kr_observable_exports);
|
|
26
|
+
var import_kr_observable = require("kr-observable");
|
|
27
|
+
var import_react = require("kr-observable/react");
|
|
28
|
+
var adapters = {
|
|
29
|
+
batch: (cb) => cb(),
|
|
30
|
+
autorun: import_kr_observable.autorun,
|
|
31
|
+
replaceObject: (obj, newObj) => {
|
|
32
|
+
for (const variableKey in obj) {
|
|
33
|
+
delete obj[variableKey];
|
|
34
|
+
}
|
|
35
|
+
Object.assign(obj, newObj);
|
|
36
|
+
},
|
|
37
|
+
makeObservable: import_kr_observable.makeObservable,
|
|
38
|
+
makeAutoObservable: import_kr_observable.makeObservable,
|
|
39
|
+
observer: import_react.observer
|
|
40
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/adapters/mobx.ts
|
|
21
|
+
var mobx_exports = {};
|
|
22
|
+
__export(mobx_exports, {
|
|
23
|
+
adapters: () => adapters
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(mobx_exports);
|
|
26
|
+
var import_mobx = require("mobx");
|
|
27
|
+
var import_mobx_react_lite = require("mobx-react-lite");
|
|
28
|
+
var adapters = {
|
|
29
|
+
batch: import_mobx.runInAction,
|
|
30
|
+
autorun: import_mobx.autorun,
|
|
31
|
+
observer: import_mobx_react_lite.observer,
|
|
32
|
+
replaceObject: (obj, newObj) => {
|
|
33
|
+
(0, import_mobx.runInAction)(() => {
|
|
34
|
+
for (const variableKey in obj) {
|
|
35
|
+
if (obj.hasOwnProperty(variableKey)) {
|
|
36
|
+
delete obj[variableKey];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
Object.assign(obj, newObj);
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
makeObservable: import_mobx.observable,
|
|
43
|
+
makeAutoObservable: import_mobx.makeAutoObservable
|
|
44
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/adapters/solid.ts
|
|
21
|
+
var solid_exports = {};
|
|
22
|
+
__export(solid_exports, {
|
|
23
|
+
adapters: () => adapters
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(solid_exports);
|
|
26
|
+
var import_solid_js = require("solid-js");
|
|
27
|
+
var import_store = require("solid-js/store");
|
|
28
|
+
var adapters = {
|
|
29
|
+
batch: import_solid_js.batch,
|
|
30
|
+
autorun: import_solid_js.createRenderEffect,
|
|
31
|
+
replaceObject: (obj, newObj) => {
|
|
32
|
+
(0, import_store.modifyMutable)(
|
|
33
|
+
obj,
|
|
34
|
+
(0, import_store.produce)((state) => {
|
|
35
|
+
if (typeof state === "object" && state != null) {
|
|
36
|
+
for (const variableKey in state) {
|
|
37
|
+
if (state.hasOwnProperty(variableKey)) {
|
|
38
|
+
delete state[variableKey];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
Object.assign(state || {}, newObj);
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
},
|
|
46
|
+
makeObservable: import_store.createMutable,
|
|
47
|
+
makeAutoObservable: import_store.createMutable
|
|
48
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var core_exports = {};
|
|
32
32
|
__export(core_exports, {
|
|
33
33
|
createRouterConfig: () => createRouterConfig,
|
|
34
|
+
createRouterStore: () => createRouterStore,
|
|
34
35
|
findRouteByPathname: () => findRouteByPathname,
|
|
35
36
|
getInitialRoute: () => getInitialRoute,
|
|
36
37
|
history: () => history,
|
|
@@ -53,6 +54,9 @@ function createRouterConfig(config) {
|
|
|
53
54
|
return addNames(config);
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
// packages/core/createRouterStore.ts
|
|
58
|
+
var import_query_string2 = __toESM(require("query-string"));
|
|
59
|
+
|
|
56
60
|
// packages/core/utils/constants.ts
|
|
57
61
|
var constants = {
|
|
58
62
|
dynamicSeparator: ":",
|
|
@@ -73,6 +77,19 @@ function isDynamicRoute(route) {
|
|
|
73
77
|
return "params" in route;
|
|
74
78
|
}
|
|
75
79
|
|
|
80
|
+
// packages/core/utils/getDynamicValues.ts
|
|
81
|
+
function getDynamicValues(params) {
|
|
82
|
+
const { route, pathname } = params;
|
|
83
|
+
const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean).map((str) => decodeURIComponent(str));
|
|
84
|
+
const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
|
|
85
|
+
const dynamicParams = {};
|
|
86
|
+
for (let i = 0; i < routePathnameArray.length; i++) {
|
|
87
|
+
const paramName = routePathnameArray[i];
|
|
88
|
+
if (isDynamic(paramName)) dynamicParams[clearDynamic(paramName)] = pathnameArray[i];
|
|
89
|
+
}
|
|
90
|
+
return dynamicParams;
|
|
91
|
+
}
|
|
92
|
+
|
|
76
93
|
// packages/core/utils/findRouteByPathname.ts
|
|
77
94
|
function completeStaticMatch(pathname, path) {
|
|
78
95
|
return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
|
|
@@ -104,19 +121,6 @@ function findRouteByPathname({
|
|
|
104
121
|
return dynamicRouteMatch;
|
|
105
122
|
}
|
|
106
123
|
|
|
107
|
-
// packages/core/utils/getDynamicValues.ts
|
|
108
|
-
function getDynamicValues(params) {
|
|
109
|
-
const { route, pathname } = params;
|
|
110
|
-
const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean).map((str) => decodeURIComponent(str));
|
|
111
|
-
const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
|
|
112
|
-
const dynamicParams = {};
|
|
113
|
-
for (let i = 0; i < routePathnameArray.length; i++) {
|
|
114
|
-
const paramName = routePathnameArray[i];
|
|
115
|
-
if (isDynamic(paramName)) dynamicParams[clearDynamic(paramName)] = pathnameArray[i];
|
|
116
|
-
}
|
|
117
|
-
return dynamicParams;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
124
|
// packages/core/utils/getQueryValues.ts
|
|
121
125
|
var import_query_string = __toESM(require("query-string"));
|
|
122
126
|
|
|
@@ -184,3 +188,190 @@ function replaceDynamicValues({
|
|
|
184
188
|
return encodeURIComponent(value);
|
|
185
189
|
});
|
|
186
190
|
}
|
|
191
|
+
|
|
192
|
+
// packages/core/createRouterStore.ts
|
|
193
|
+
function createRouterStore({
|
|
194
|
+
adapters,
|
|
195
|
+
routes,
|
|
196
|
+
routeError500,
|
|
197
|
+
lifecycleParams
|
|
198
|
+
}) {
|
|
199
|
+
const routerStore = adapters.makeObservable({
|
|
200
|
+
routesHistory: [],
|
|
201
|
+
currentRoute: {},
|
|
202
|
+
isRedirecting: false,
|
|
203
|
+
redirectTo: void 0,
|
|
204
|
+
restoreFromURL: void 0,
|
|
205
|
+
restoreFromServer: void 0,
|
|
206
|
+
adapters
|
|
207
|
+
});
|
|
208
|
+
routerStore.restoreFromServer = function restoreFromServer(obj) {
|
|
209
|
+
adapters.batch(() => {
|
|
210
|
+
routerStore.routesHistory.push(...obj.routesHistory || []);
|
|
211
|
+
Object.assign(routerStore.currentRoute, obj.currentRoute);
|
|
212
|
+
});
|
|
213
|
+
const preloadedRouteName = Object.keys(routes).find(
|
|
214
|
+
(routeName) => routerStore.currentRoute.name === routeName
|
|
215
|
+
);
|
|
216
|
+
return loadComponentToConfig({ route: routes[preloadedRouteName] });
|
|
217
|
+
};
|
|
218
|
+
routerStore.restoreFromURL = function restoreFromURL(params) {
|
|
219
|
+
return routerStore.redirectTo(getInitialRoute({ routes, ...params }));
|
|
220
|
+
};
|
|
221
|
+
routerStore.redirectTo = async function redirectTo(config) {
|
|
222
|
+
const { route: routeName, noHistoryPush, asClient } = config;
|
|
223
|
+
const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
|
|
224
|
+
let currentRoute;
|
|
225
|
+
let currentPathname;
|
|
226
|
+
let currentUrl;
|
|
227
|
+
let currentSearch;
|
|
228
|
+
let currentQuery;
|
|
229
|
+
if (routerStore.currentRoute?.name) {
|
|
230
|
+
currentRoute = routes[routerStore.currentRoute.name];
|
|
231
|
+
currentPathname = replaceDynamicValues({
|
|
232
|
+
route: currentRoute,
|
|
233
|
+
params: routerStore.currentRoute.params
|
|
234
|
+
});
|
|
235
|
+
currentUrl = import_query_string2.default.stringifyUrl({
|
|
236
|
+
url: currentPathname,
|
|
237
|
+
query: routerStore.currentRoute.query
|
|
238
|
+
});
|
|
239
|
+
currentQuery = routerStore.currentRoute.query;
|
|
240
|
+
currentSearch = import_query_string2.default.stringify(routerStore.currentRoute.query);
|
|
241
|
+
}
|
|
242
|
+
const nextRoute = routes[routeName];
|
|
243
|
+
const nextPathname = replaceDynamicValues({
|
|
244
|
+
route: nextRoute,
|
|
245
|
+
params: "params" in config ? config.params : void 0
|
|
246
|
+
});
|
|
247
|
+
let nextQuery;
|
|
248
|
+
let nextUrl = nextPathname;
|
|
249
|
+
let nextSearch;
|
|
250
|
+
if ("query" in config && config.query) {
|
|
251
|
+
const clearedQuery = getQueryValues({
|
|
252
|
+
route: nextRoute,
|
|
253
|
+
pathname: `${nextPathname}?${import_query_string2.default.stringify(config.query)}`
|
|
254
|
+
});
|
|
255
|
+
if (Object.keys(clearedQuery).length > 0) {
|
|
256
|
+
nextQuery = clearedQuery;
|
|
257
|
+
nextSearch = import_query_string2.default.stringify(clearedQuery);
|
|
258
|
+
nextUrl = import_query_string2.default.stringifyUrl({ url: nextPathname, query: clearedQuery });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (currentUrl === nextUrl) return Promise.resolve();
|
|
262
|
+
if (currentPathname === nextPathname) {
|
|
263
|
+
if (currentSearch !== nextSearch) {
|
|
264
|
+
adapters.batch(() => {
|
|
265
|
+
adapters.replaceObject(routerStore.currentRoute.query, nextQuery || {});
|
|
266
|
+
routerStore.routesHistory.push(nextUrl);
|
|
267
|
+
});
|
|
268
|
+
if (history && !noHistoryPush) {
|
|
269
|
+
history.push({
|
|
270
|
+
hash: history.location.hash,
|
|
271
|
+
search: nextSearch,
|
|
272
|
+
pathname: nextPathname
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return Promise.resolve();
|
|
277
|
+
}
|
|
278
|
+
adapters.batch(() => {
|
|
279
|
+
routerStore.isRedirecting = true;
|
|
280
|
+
});
|
|
281
|
+
try {
|
|
282
|
+
await currentRoute?.beforeLeave?.(
|
|
283
|
+
{
|
|
284
|
+
nextUrl,
|
|
285
|
+
nextRoute,
|
|
286
|
+
nextQuery,
|
|
287
|
+
nextSearch,
|
|
288
|
+
nextPathname,
|
|
289
|
+
currentUrl,
|
|
290
|
+
currentQuery,
|
|
291
|
+
currentRoute,
|
|
292
|
+
currentSearch,
|
|
293
|
+
currentPathname
|
|
294
|
+
},
|
|
295
|
+
...lifecycleParams || []
|
|
296
|
+
);
|
|
297
|
+
const redirectConfig = await nextRoute.beforeEnter?.(
|
|
298
|
+
{
|
|
299
|
+
nextUrl,
|
|
300
|
+
nextRoute,
|
|
301
|
+
nextQuery,
|
|
302
|
+
nextSearch,
|
|
303
|
+
nextPathname,
|
|
304
|
+
currentUrl,
|
|
305
|
+
currentQuery,
|
|
306
|
+
currentRoute,
|
|
307
|
+
currentSearch,
|
|
308
|
+
currentPathname
|
|
309
|
+
},
|
|
310
|
+
...lifecycleParams || []
|
|
311
|
+
);
|
|
312
|
+
if (typeof redirectConfig === "object") {
|
|
313
|
+
if (isClient) return redirectTo({ ...redirectConfig, asClient });
|
|
314
|
+
const redirectRoute = routes[redirectConfig.route];
|
|
315
|
+
const redirectParams = "params" in redirectConfig && redirectConfig.params ? redirectConfig.params : void 0;
|
|
316
|
+
let redirectUrl = replaceDynamicValues({
|
|
317
|
+
params: redirectParams,
|
|
318
|
+
route: redirectRoute
|
|
319
|
+
});
|
|
320
|
+
if ("query" in redirectConfig && redirectConfig.query) {
|
|
321
|
+
const clearedQuery = getQueryValues({
|
|
322
|
+
route: nextRoute,
|
|
323
|
+
pathname: `${nextPathname}?${import_query_string2.default.stringify(redirectConfig.query)}`
|
|
324
|
+
});
|
|
325
|
+
if (Object.keys(clearedQuery).length > 0) {
|
|
326
|
+
redirectUrl = import_query_string2.default.stringifyUrl({ url: redirectUrl, query: clearedQuery });
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
throw Object.assign(new Error(redirectUrl), { name: constants.errorRedirect });
|
|
330
|
+
}
|
|
331
|
+
await loadComponentToConfig({ route: routes[nextRoute.name] });
|
|
332
|
+
} catch (error) {
|
|
333
|
+
if (error?.name === constants.errorPrevent) return Promise.resolve();
|
|
334
|
+
if (error?.name === constants.errorRedirect) {
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
console.error(error);
|
|
338
|
+
await loadComponentToConfig({ route: routeError500 });
|
|
339
|
+
adapters.batch(() => {
|
|
340
|
+
adapters.replaceObject(routerStore.currentRoute, {
|
|
341
|
+
name: routeError500.name,
|
|
342
|
+
path: routeError500.path,
|
|
343
|
+
props: routes[routeError500.name].props,
|
|
344
|
+
query: {},
|
|
345
|
+
params: {},
|
|
346
|
+
pageName: routes[routeError500.name].pageName
|
|
347
|
+
});
|
|
348
|
+
routerStore.isRedirecting = false;
|
|
349
|
+
});
|
|
350
|
+
return Promise.resolve();
|
|
351
|
+
}
|
|
352
|
+
adapters.batch(() => {
|
|
353
|
+
adapters.replaceObject(routerStore.currentRoute, {
|
|
354
|
+
name: nextRoute.name,
|
|
355
|
+
path: nextRoute.path,
|
|
356
|
+
props: routes[nextRoute.name].props,
|
|
357
|
+
query: getQueryValues({ route: nextRoute, pathname: nextUrl }),
|
|
358
|
+
params: getDynamicValues({ route: nextRoute, pathname: nextUrl }),
|
|
359
|
+
pageName: routes[nextRoute.name].pageName
|
|
360
|
+
});
|
|
361
|
+
const lastUrl = routerStore.routesHistory[routerStore.routesHistory.length - 1];
|
|
362
|
+
if (lastUrl !== nextUrl) {
|
|
363
|
+
routerStore.routesHistory.push(nextUrl);
|
|
364
|
+
}
|
|
365
|
+
if (history && !noHistoryPush) {
|
|
366
|
+
history.push({
|
|
367
|
+
hash: history.location.hash,
|
|
368
|
+
search: "query" in config ? `?${import_query_string2.default.stringify(config.query)}` : "",
|
|
369
|
+
pathname: nextPathname
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
routerStore.isRedirecting = false;
|
|
373
|
+
});
|
|
374
|
+
return Promise.resolve();
|
|
375
|
+
};
|
|
376
|
+
return routerStore;
|
|
377
|
+
}
|
package/dist/cjs/react/index.js
CHANGED
|
@@ -25,124 +25,82 @@ __export(react_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(react_exports);
|
|
26
26
|
|
|
27
27
|
// packages/react/Router.tsx
|
|
28
|
-
var import_mobx2 = require("mobx");
|
|
29
|
-
var import_mobx_react_lite = require("mobx-react-lite");
|
|
30
|
-
var import_reactive_route = require("reactive-route");
|
|
31
|
-
|
|
32
|
-
// packages/react/useStore.ts
|
|
33
|
-
var import_mobx = require("mobx");
|
|
34
28
|
var import_react = require("react");
|
|
35
|
-
|
|
36
|
-
const isFirstRenderRef = (0, import_react.useRef)(true);
|
|
37
|
-
const [vm] = (0, import_react.useState)(() => {
|
|
38
|
-
const instance = new ViewModel(props || {});
|
|
39
|
-
(0, import_mobx.runInAction)(() => {
|
|
40
|
-
instance.beforeMount?.();
|
|
41
|
-
});
|
|
42
|
-
return instance;
|
|
43
|
-
});
|
|
44
|
-
(0, import_react.useEffect)(() => {
|
|
45
|
-
if (isFirstRenderRef.current) {
|
|
46
|
-
isFirstRenderRef.current = false;
|
|
47
|
-
} else if (props) {
|
|
48
|
-
(0, import_mobx.runInAction)(() => {
|
|
49
|
-
vm.props = props || {};
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}, [props]);
|
|
53
|
-
(0, import_react.useEffect)(() => {
|
|
54
|
-
vm.afterMount?.();
|
|
55
|
-
return () => {
|
|
56
|
-
vm.autorunDisposers?.forEach((disposer) => disposer());
|
|
57
|
-
};
|
|
58
|
-
}, []);
|
|
59
|
-
return vm;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// packages/react/Router.tsx
|
|
29
|
+
var import_reactive_route = require("reactive-route");
|
|
63
30
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
(0, import_mobx2.makeAutoObservable)(
|
|
68
|
-
this,
|
|
69
|
-
{ loadedComponent: false, setLoadedComponent: false, props: false },
|
|
70
|
-
{ autoBind: true }
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
autorunDisposers = [];
|
|
74
|
-
loadedComponentName = void 0;
|
|
75
|
-
loadedComponentPage = void 0;
|
|
76
|
-
loadedComponent;
|
|
77
|
-
currentProps = {};
|
|
78
|
-
beforeMount() {
|
|
79
|
-
this.props.beforeMount?.();
|
|
80
|
-
this.redirectOnHistoryPop();
|
|
81
|
-
this.setLoadedComponent();
|
|
82
|
-
this.autorunDisposers.push((0, import_mobx2.autorun)(this.setLoadedComponent));
|
|
83
|
-
}
|
|
84
|
-
redirectOnHistoryPop() {
|
|
31
|
+
function RouterInner(props) {
|
|
32
|
+
const disposerRef = (0, import_react.useRef)(null);
|
|
33
|
+
const redirectOnHistoryPop = (0, import_react.useCallback)(() => {
|
|
85
34
|
if (!import_reactive_route.history) return;
|
|
86
35
|
import_reactive_route.history.listen((params) => {
|
|
87
36
|
if (params.action !== "POP") return;
|
|
88
|
-
const previousRoutePathname =
|
|
37
|
+
const previousRoutePathname = props.routerStore.routesHistory[props.routerStore.routesHistory.length - 2];
|
|
89
38
|
if (previousRoutePathname === params.location.pathname) {
|
|
90
|
-
|
|
39
|
+
props.routerStore.adapters.batch(() => props.routerStore.routesHistory.pop());
|
|
91
40
|
}
|
|
92
|
-
void
|
|
41
|
+
void props.routerStore.redirectTo({
|
|
93
42
|
noHistoryPush: true,
|
|
94
43
|
...(0, import_reactive_route.getInitialRoute)({
|
|
95
|
-
routes:
|
|
44
|
+
routes: props.routes,
|
|
96
45
|
pathname: import_reactive_route.history.location.pathname,
|
|
97
46
|
fallback: "error404"
|
|
98
47
|
})
|
|
99
48
|
});
|
|
100
49
|
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
50
|
+
}, []);
|
|
51
|
+
const [config] = (0, import_react.useState)(
|
|
52
|
+
() => props.routerStore.adapters.makeObservable({
|
|
53
|
+
loadedComponentName: void 0,
|
|
54
|
+
loadedComponentPage: void 0,
|
|
55
|
+
currentProps: {}
|
|
56
|
+
})
|
|
57
|
+
);
|
|
58
|
+
const setLoadedComponent = (0, import_react.useCallback)(() => {
|
|
59
|
+
const { loadedComponentName, loadedComponentPage } = config;
|
|
60
|
+
const { currentRoute, isRedirecting } = props.routerStore;
|
|
61
|
+
const componentConfig = props.routes[currentRoute.name];
|
|
107
62
|
let preventRedirect = false;
|
|
108
63
|
if (isRedirecting) preventRedirect = true;
|
|
109
|
-
else if (loadedComponentName ===
|
|
110
|
-
else if (loadedComponentPage != null &&
|
|
111
|
-
if (loadedComponentPage ===
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
64
|
+
else if (loadedComponentName === currentRoute.name) preventRedirect = true;
|
|
65
|
+
else if (loadedComponentPage != null && currentRoute.name != null) {
|
|
66
|
+
if (loadedComponentPage === currentRoute.pageName) {
|
|
67
|
+
props.routerStore.adapters.batch(() => {
|
|
68
|
+
config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
|
|
69
|
+
config[Symbol.for("$adm")]?.batch();
|
|
115
70
|
});
|
|
116
71
|
preventRedirect = true;
|
|
117
72
|
}
|
|
118
73
|
}
|
|
119
74
|
if (preventRedirect) return;
|
|
120
|
-
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
75
|
+
props.routerStore.adapters.batch(() => {
|
|
76
|
+
if (loadedComponentName) props.beforeUpdatePageComponent?.();
|
|
77
|
+
props.beforeSetPageComponent?.(componentConfig);
|
|
78
|
+
config.currentProps = "props" in componentConfig ? componentConfig.props || {} : {};
|
|
79
|
+
config.loadedComponentName = currentRoute.name;
|
|
80
|
+
config.loadedComponentPage = componentConfig.pageName;
|
|
81
|
+
config[Symbol.for("$adm")]?.batch();
|
|
127
82
|
});
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
this.loadedComponentName = currentRouteName;
|
|
136
|
-
this.loadedComponentPage = componentConfig.pageName;
|
|
137
|
-
this.loadedComponent = RouteComponent;
|
|
83
|
+
}, []);
|
|
84
|
+
(0, import_react.useState)(() => {
|
|
85
|
+
props.routerStore.adapters.batch(() => {
|
|
86
|
+
props.beforeMount?.();
|
|
87
|
+
redirectOnHistoryPop();
|
|
88
|
+
setLoadedComponent();
|
|
89
|
+
disposerRef.current = props.routerStore.adapters.autorun(setLoadedComponent);
|
|
138
90
|
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
91
|
+
});
|
|
92
|
+
(0, import_react.useEffect)(() => {
|
|
93
|
+
return () => {
|
|
94
|
+
disposerRef.current?.();
|
|
95
|
+
};
|
|
96
|
+
}, []);
|
|
97
|
+
if (!config.loadedComponentName) return null;
|
|
98
|
+
const LoadedComponent = props.routes[config.loadedComponentName]?.component || null;
|
|
99
|
+
if (LoadedComponent) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadedComponent, { ...config.currentProps });
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function RouterWrapper(props) {
|
|
103
|
+
const Component = props.routerStore.adapters.observer ? props.routerStore.adapters.observer(RouterInner) : RouterInner;
|
|
104
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...props });
|
|
105
|
+
}
|
|
106
|
+
var Router = (0, import_react.memo)(RouterWrapper);
|