ldc-le-gaulois-pro/resources/ts/modules/route.ts
2023-01-13 17:21:29 +01:00

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;