reactive-route 0.0.1-alpha.1 → 0.0.1-alpha.11
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 +46 -0
- package/dist/cjs/adapters/solid/package.json +1 -0
- package/dist/cjs/index.js +68 -54
- 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 +25 -0
- package/dist/esm/adapters/solid/package.json +1 -0
- package/dist/esm/index.js +68 -54
- 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 +2 -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,46 @@
|
|
|
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
|
+
delete state[variableKey];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
Object.assign(state || {}, newObj);
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
},
|
|
44
|
+
makeObservable: import_store.createMutable,
|
|
45
|
+
makeAutoObservable: import_store.createMutable
|
|
46
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -90,6 +90,37 @@ function getDynamicValues(params) {
|
|
|
90
90
|
return dynamicParams;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
// packages/core/utils/findRouteByPathname.ts
|
|
94
|
+
function completeStaticMatch(pathname, path) {
|
|
95
|
+
return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
|
|
96
|
+
}
|
|
97
|
+
function findRouteByPathname({
|
|
98
|
+
pathname,
|
|
99
|
+
routes
|
|
100
|
+
}) {
|
|
101
|
+
let dynamicRouteMatch;
|
|
102
|
+
const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
|
|
103
|
+
for (const routeName in routes) {
|
|
104
|
+
if (!Object.hasOwn(routes, routeName)) continue;
|
|
105
|
+
const route = routes[routeName];
|
|
106
|
+
if (completeStaticMatch(pathname, route.path)) return route;
|
|
107
|
+
if (dynamicRouteMatch) continue;
|
|
108
|
+
const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
|
|
109
|
+
if (routePathnameArray.length !== pathnameArray.length) continue;
|
|
110
|
+
const someParamInvalid = routePathnameArray.some((paramName, i) => {
|
|
111
|
+
const paramFromUrl = pathnameArray[i];
|
|
112
|
+
if (!isDynamic(paramName)) return paramName !== paramFromUrl;
|
|
113
|
+
const validator = route.params?.[clearDynamic(paramName)];
|
|
114
|
+
if (typeof validator !== "function") {
|
|
115
|
+
throw new Error(`findRoute: missing validator for param "${paramName}"`);
|
|
116
|
+
}
|
|
117
|
+
return !validator(paramFromUrl);
|
|
118
|
+
});
|
|
119
|
+
if (!someParamInvalid) dynamicRouteMatch = route;
|
|
120
|
+
}
|
|
121
|
+
return dynamicRouteMatch;
|
|
122
|
+
}
|
|
123
|
+
|
|
93
124
|
// packages/core/utils/getQueryValues.ts
|
|
94
125
|
var import_query_string = __toESM(require("query-string"));
|
|
95
126
|
|
|
@@ -111,6 +142,16 @@ function getQueryValues(params) {
|
|
|
111
142
|
return query;
|
|
112
143
|
}
|
|
113
144
|
|
|
145
|
+
// packages/core/utils/getInitialRoute.ts
|
|
146
|
+
function getInitialRoute(params) {
|
|
147
|
+
const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes[params.fallback];
|
|
148
|
+
return {
|
|
149
|
+
route: route.name,
|
|
150
|
+
query: getQueryValues({ route, pathname: params.pathname }),
|
|
151
|
+
params: getDynamicValues({ route, pathname: params.pathname })
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
114
155
|
// packages/core/utils/history.ts
|
|
115
156
|
var import_history = require("history");
|
|
116
157
|
var history = constants.isClient ? (0, import_history.createBrowserHistory)() : null;
|
|
@@ -150,19 +191,33 @@ function replaceDynamicValues({
|
|
|
150
191
|
|
|
151
192
|
// packages/core/createRouterStore.ts
|
|
152
193
|
function createRouterStore({
|
|
153
|
-
|
|
194
|
+
adapters,
|
|
154
195
|
routes,
|
|
155
196
|
routeError500,
|
|
156
|
-
|
|
157
|
-
lifecycleParams,
|
|
158
|
-
replaceObject
|
|
197
|
+
lifecycleParams
|
|
159
198
|
}) {
|
|
160
|
-
const routerStore = makeObservable({
|
|
199
|
+
const routerStore = adapters.makeObservable({
|
|
161
200
|
routesHistory: [],
|
|
162
201
|
currentRoute: {},
|
|
163
202
|
isRedirecting: false,
|
|
164
|
-
redirectTo: void 0
|
|
203
|
+
redirectTo: void 0,
|
|
204
|
+
restoreFromURL: void 0,
|
|
205
|
+
restoreFromServer: void 0,
|
|
206
|
+
adapters
|
|
165
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
|
+
};
|
|
166
221
|
routerStore.redirectTo = async function redirectTo(config) {
|
|
167
222
|
const { route: routeName, noHistoryPush, asClient } = config;
|
|
168
223
|
const isClient = typeof asClient === "boolean" ? asClient : constants.isClient;
|
|
@@ -206,8 +261,8 @@ function createRouterStore({
|
|
|
206
261
|
if (currentUrl === nextUrl) return Promise.resolve();
|
|
207
262
|
if (currentPathname === nextPathname) {
|
|
208
263
|
if (currentSearch !== nextSearch) {
|
|
209
|
-
batch(() => {
|
|
210
|
-
replaceObject(routerStore.currentRoute.query, nextQuery || {});
|
|
264
|
+
adapters.batch(() => {
|
|
265
|
+
adapters.replaceObject(routerStore.currentRoute.query, nextQuery || {});
|
|
211
266
|
routerStore.routesHistory.push(nextUrl);
|
|
212
267
|
});
|
|
213
268
|
if (history && !noHistoryPush) {
|
|
@@ -220,7 +275,7 @@ function createRouterStore({
|
|
|
220
275
|
}
|
|
221
276
|
return Promise.resolve();
|
|
222
277
|
}
|
|
223
|
-
batch(() => {
|
|
278
|
+
adapters.batch(() => {
|
|
224
279
|
routerStore.isRedirecting = true;
|
|
225
280
|
});
|
|
226
281
|
try {
|
|
@@ -281,8 +336,8 @@ function createRouterStore({
|
|
|
281
336
|
}
|
|
282
337
|
console.error(error);
|
|
283
338
|
await loadComponentToConfig({ route: routeError500 });
|
|
284
|
-
batch(() => {
|
|
285
|
-
replaceObject(routerStore.currentRoute, {
|
|
339
|
+
adapters.batch(() => {
|
|
340
|
+
adapters.replaceObject(routerStore.currentRoute, {
|
|
286
341
|
name: routeError500.name,
|
|
287
342
|
path: routeError500.path,
|
|
288
343
|
props: routes[routeError500.name].props,
|
|
@@ -294,8 +349,8 @@ function createRouterStore({
|
|
|
294
349
|
});
|
|
295
350
|
return Promise.resolve();
|
|
296
351
|
}
|
|
297
|
-
batch(() => {
|
|
298
|
-
replaceObject(routerStore.currentRoute, {
|
|
352
|
+
adapters.batch(() => {
|
|
353
|
+
adapters.replaceObject(routerStore.currentRoute, {
|
|
299
354
|
name: nextRoute.name,
|
|
300
355
|
path: nextRoute.path,
|
|
301
356
|
props: routes[nextRoute.name].props,
|
|
@@ -320,44 +375,3 @@ function createRouterStore({
|
|
|
320
375
|
};
|
|
321
376
|
return routerStore;
|
|
322
377
|
}
|
|
323
|
-
|
|
324
|
-
// packages/core/utils/findRouteByPathname.ts
|
|
325
|
-
function completeStaticMatch(pathname, path) {
|
|
326
|
-
return !path.includes(constants.dynamicSeparator) && (pathname === path || pathname === `${path}${constants.pathPartSeparator}`);
|
|
327
|
-
}
|
|
328
|
-
function findRouteByPathname({
|
|
329
|
-
pathname,
|
|
330
|
-
routes
|
|
331
|
-
}) {
|
|
332
|
-
let dynamicRouteMatch;
|
|
333
|
-
const pathnameArray = pathname.replace(/\?.+$/, "").split(constants.pathPartSeparator).filter(Boolean);
|
|
334
|
-
for (const routeName in routes) {
|
|
335
|
-
if (!Object.hasOwn(routes, routeName)) continue;
|
|
336
|
-
const route = routes[routeName];
|
|
337
|
-
if (completeStaticMatch(pathname, route.path)) return route;
|
|
338
|
-
if (dynamicRouteMatch) continue;
|
|
339
|
-
const routePathnameArray = route.path.split(constants.pathPartSeparator).filter(Boolean);
|
|
340
|
-
if (routePathnameArray.length !== pathnameArray.length) continue;
|
|
341
|
-
const someParamInvalid = routePathnameArray.some((paramName, i) => {
|
|
342
|
-
const paramFromUrl = pathnameArray[i];
|
|
343
|
-
if (!isDynamic(paramName)) return paramName !== paramFromUrl;
|
|
344
|
-
const validator = route.params?.[clearDynamic(paramName)];
|
|
345
|
-
if (typeof validator !== "function") {
|
|
346
|
-
throw new Error(`findRoute: missing validator for param "${paramName}"`);
|
|
347
|
-
}
|
|
348
|
-
return !validator(paramFromUrl);
|
|
349
|
-
});
|
|
350
|
-
if (!someParamInvalid) dynamicRouteMatch = route;
|
|
351
|
-
}
|
|
352
|
-
return dynamicRouteMatch;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
// packages/core/utils/getInitialRoute.ts
|
|
356
|
-
function getInitialRoute(params) {
|
|
357
|
-
const route = findRouteByPathname({ pathname: params.pathname, routes: params.routes }) || params.routes[params.fallback];
|
|
358
|
-
return {
|
|
359
|
-
route: route.name,
|
|
360
|
-
query: getQueryValues({ route, pathname: params.pathname }),
|
|
361
|
-
params: getDynamicValues({ route, pathname: params.pathname })
|
|
362
|
-
};
|
|
363
|
-
}
|
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);
|
package/dist/cjs/solid/index.js
CHANGED
|
@@ -28,133 +28,74 @@ module.exports = __toCommonJS(solid_exports);
|
|
|
28
28
|
var import_web = require("solid-js/web");
|
|
29
29
|
var import_web2 = require("solid-js/web");
|
|
30
30
|
var import_reactive_route = require("reactive-route");
|
|
31
|
-
var import_solid_js2 = require("solid-js");
|
|
32
|
-
var import_store2 = require("solid-js/store");
|
|
33
|
-
var import_web3 = require("solid-js/web");
|
|
34
|
-
|
|
35
|
-
// packages/solid/replaceObject.ts
|
|
36
|
-
var import_store = require("solid-js/store");
|
|
37
|
-
function replaceObject(obj, newObj) {
|
|
38
|
-
(0, import_store.modifyMutable)(obj, (0, import_store.produce)((state) => {
|
|
39
|
-
if (typeof state === "object" && state != null) {
|
|
40
|
-
for (const variableKey in state) {
|
|
41
|
-
delete state[variableKey];
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
Object.assign(state || {}, newObj);
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// packages/solid/useStore.ts
|
|
49
31
|
var import_solid_js = require("solid-js");
|
|
50
|
-
var
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
} while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype);
|
|
57
|
-
return properties;
|
|
58
|
-
};
|
|
59
|
-
function autoBind(self) {
|
|
60
|
-
for (const [object, key] of getAllProperties(self.constructor.prototype)) {
|
|
61
|
-
if (key === "constructor") continue;
|
|
62
|
-
const descriptor = Reflect.getOwnPropertyDescriptor(object, key);
|
|
63
|
-
if (descriptor && typeof descriptor.value === "function") {
|
|
64
|
-
self[key] = self[key].bind(self);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return self;
|
|
68
|
-
}
|
|
69
|
-
function useStore(ViewModel, props) {
|
|
70
|
-
const vm = new ViewModel(props);
|
|
71
|
-
autoBind(vm);
|
|
72
|
-
vm.beforeMount?.();
|
|
73
|
-
(0, import_solid_js.onMount)(() => {
|
|
74
|
-
vm.afterMount?.();
|
|
32
|
+
var import_web3 = require("solid-js/web");
|
|
33
|
+
function Router(props) {
|
|
34
|
+
const config = props.routerStore.adapters.makeObservable({
|
|
35
|
+
loadedComponentName: void 0,
|
|
36
|
+
loadedComponentPage: void 0,
|
|
37
|
+
currentProps: {}
|
|
75
38
|
});
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// packages/solid/Router.tsx
|
|
80
|
-
var VM = class {
|
|
81
|
-
constructor(props) {
|
|
82
|
-
this.props = props;
|
|
83
|
-
return (0, import_store2.createMutable)(this);
|
|
84
|
-
}
|
|
85
|
-
loadedComponentName = void 0;
|
|
86
|
-
loadedComponentPage = void 0;
|
|
87
|
-
currentProps = {};
|
|
88
|
-
beforeMount() {
|
|
89
|
-
this.props.beforeMount?.();
|
|
90
|
-
this.redirectOnHistoryPop();
|
|
91
|
-
(0, import_solid_js2.createRenderEffect)(() => this.setLoadedComponent());
|
|
92
|
-
}
|
|
93
|
-
redirectOnHistoryPop() {
|
|
39
|
+
function redirectOnHistoryPop() {
|
|
94
40
|
if (!import_reactive_route.history) return;
|
|
95
41
|
import_reactive_route.history.listen((params) => {
|
|
96
42
|
if (params.action !== "POP") return;
|
|
97
|
-
const previousRoutePathname =
|
|
43
|
+
const previousRoutePathname = props.routerStore.routesHistory[props.routerStore.routesHistory.length - 2];
|
|
98
44
|
if (previousRoutePathname === params.location.pathname) {
|
|
99
|
-
|
|
45
|
+
props.routerStore.routesHistory.pop();
|
|
100
46
|
}
|
|
101
|
-
void
|
|
47
|
+
void props.routerStore.redirectTo({
|
|
102
48
|
noHistoryPush: true,
|
|
103
49
|
...(0, import_reactive_route.getInitialRoute)({
|
|
104
|
-
routes:
|
|
50
|
+
routes: props.routes,
|
|
105
51
|
pathname: import_reactive_route.history.location.pathname,
|
|
106
52
|
fallback: "error404"
|
|
107
53
|
})
|
|
108
54
|
});
|
|
109
55
|
});
|
|
110
56
|
}
|
|
111
|
-
setLoadedComponent() {
|
|
112
|
-
const currentRouteName =
|
|
113
|
-
const currentRoutePage =
|
|
57
|
+
function setLoadedComponent() {
|
|
58
|
+
const currentRouteName = props.routerStore.currentRoute.name;
|
|
59
|
+
const currentRoutePage = props.routerStore.currentRoute.pageName;
|
|
60
|
+
const componentConfig = props.routes[currentRouteName];
|
|
114
61
|
let preventRedirect = false;
|
|
115
|
-
if (
|
|
116
|
-
else if (
|
|
62
|
+
if (props.routerStore.isRedirecting) preventRedirect = true;
|
|
63
|
+
else if (config.loadedComponentName === currentRouteName) {
|
|
117
64
|
preventRedirect = true;
|
|
118
|
-
} else if (
|
|
119
|
-
if (
|
|
120
|
-
|
|
121
|
-
replaceObject(this.currentProps, "props" in componentConfig ? componentConfig.props : {});
|
|
65
|
+
} else if (config.loadedComponentPage != null && currentRouteName != null) {
|
|
66
|
+
if (config.loadedComponentPage === currentRoutePage) {
|
|
67
|
+
props.routerStore.adapters.replaceObject(config.currentProps, "props" in componentConfig ? componentConfig.props : {});
|
|
122
68
|
preventRedirect = true;
|
|
123
69
|
}
|
|
124
70
|
}
|
|
125
71
|
if (preventRedirect) return;
|
|
126
|
-
|
|
127
|
-
if (
|
|
128
|
-
|
|
129
|
-
} else {
|
|
130
|
-
this.props.beforeUpdatePageComponent?.();
|
|
131
|
-
this.setComponent();
|
|
72
|
+
props.routerStore.adapters.batch(() => {
|
|
73
|
+
if (config.loadedComponentName) {
|
|
74
|
+
props.beforeUpdatePageComponent?.();
|
|
132
75
|
}
|
|
76
|
+
props.beforeSetPageComponent?.(componentConfig);
|
|
77
|
+
props.routerStore.adapters.batch(() => {
|
|
78
|
+
props.routerStore.adapters.replaceObject(config.currentProps, "props" in componentConfig ? componentConfig.props : {});
|
|
79
|
+
config.loadedComponentName = currentRouteName;
|
|
80
|
+
config.loadedComponentPage = componentConfig.pageName;
|
|
81
|
+
config[Symbol.for("$adm")]?.batch();
|
|
82
|
+
});
|
|
133
83
|
});
|
|
134
84
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
replaceObject(this.currentProps, "props" in componentConfig ? componentConfig.props : {});
|
|
141
|
-
this.loadedComponentName = currentRouteName;
|
|
142
|
-
this.loadedComponentPage = componentConfig.pageName;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
function Router(props) {
|
|
147
|
-
const vm = useStore(VM, props);
|
|
148
|
-
return (0, import_web.createComponent)(import_solid_js2.Show, {
|
|
85
|
+
props.beforeMount?.();
|
|
86
|
+
redirectOnHistoryPop();
|
|
87
|
+
setLoadedComponent();
|
|
88
|
+
props.routerStore.adapters.autorun(() => setLoadedComponent());
|
|
89
|
+
return (0, import_web.createComponent)(import_solid_js.Show, {
|
|
149
90
|
get when() {
|
|
150
|
-
return
|
|
91
|
+
return config.loadedComponentName;
|
|
151
92
|
},
|
|
152
93
|
get children() {
|
|
153
94
|
return (0, import_web.createComponent)(import_web3.Dynamic, (0, import_web2.mergeProps)({
|
|
154
95
|
get component() {
|
|
155
|
-
return props.routes[
|
|
96
|
+
return props.routes[config.loadedComponentName]?.component || void 0;
|
|
156
97
|
}
|
|
157
|
-
}, () =>
|
|
98
|
+
}, () => config.currentProps));
|
|
158
99
|
}
|
|
159
100
|
});
|
|
160
101
|
}
|