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