94 lines
3.2 KiB
TypeScript
94 lines
3.2 KiB
TypeScript
const route = {
|
|
methods: {
|
|
/**
|
|
* Define a route by the data given,
|
|
* ex: route('name', { 'parameter': 'value' }).
|
|
*/
|
|
route(
|
|
routeName: string,
|
|
parameters: Record<
|
|
string,
|
|
string | number | Array<string | number>
|
|
> = {}
|
|
): string | null {
|
|
const routes = route.flattenProperties(window.__SYSTEM._routes);
|
|
const routeUrl =
|
|
Object.keys(routes).indexOf(routeName) !== -1
|
|
? (routes[routeName] as string)
|
|
: null;
|
|
if (!routeUrl) {
|
|
return routeUrl;
|
|
}
|
|
// flatten parameter array
|
|
for (const parameterIndex in parameters) {
|
|
const parameter = parameters[parameterIndex];
|
|
if (!Array.isArray(parameter)) {
|
|
continue;
|
|
}
|
|
delete parameters[parameterIndex];
|
|
parameter.forEach(
|
|
(parameter, index) =>
|
|
(parameters[`${parameterIndex}[${index}]`] = parameter)
|
|
);
|
|
// still append empty entry if empty array
|
|
if (!parameter.length) {
|
|
parameters[`${parameterIndex}`] = "";
|
|
}
|
|
}
|
|
|
|
const flattenParameters = parameters as Record<
|
|
string,
|
|
string | number
|
|
>;
|
|
|
|
// copy parameters
|
|
const iParameters = Object.assign({}, flattenParameters),
|
|
origin = window.location.origin,
|
|
url = new URL(
|
|
`${origin}${routeUrl.replace(origin, "")}${
|
|
window.location.search
|
|
}${window.location.hash}`
|
|
);
|
|
|
|
// Replace in path name.
|
|
for (const paramName in iParameters) {
|
|
const paramValue = flattenParameters[paramName];
|
|
if (url.pathname.indexOf(paramName) !== -1) {
|
|
url.pathname = url.pathname.replace(
|
|
paramName,
|
|
paramValue as string
|
|
);
|
|
delete flattenParameters[paramName];
|
|
}
|
|
}
|
|
|
|
// Append remaining parameters to url
|
|
for (const paramName in flattenParameters) {
|
|
const paramValue = flattenParameters[paramName];
|
|
url.searchParams.set(paramName, String(paramValue));
|
|
}
|
|
return url.toString();
|
|
},
|
|
},
|
|
flattenProperties(
|
|
obj: Record<PropertyKey, unknown>,
|
|
parent: string | null = null,
|
|
res: Record<PropertyKey, unknown> = {}
|
|
): Record<PropertyKey, unknown> {
|
|
for (const key of Object.keys(obj)) {
|
|
const propName = parent ? parent + "." + key : key;
|
|
if (obj[key] instanceof Object) {
|
|
route.flattenProperties(
|
|
obj[key] as Record<PropertyKey, unknown>,
|
|
propName,
|
|
res
|
|
);
|
|
} else {
|
|
res[propName] = obj[key];
|
|
}
|
|
}
|
|
return res;
|
|
},
|
|
};
|
|
|
|
export default route;
|