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