Some checks failed
Branch Build CE / Build Setup (push) Has been cancelled
Branch Build CE / Build-Push Admin Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Web Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Space Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Live Collaboration Docker Image (push) Has been cancelled
Branch Build CE / Build-Push API Server Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Proxy Docker Image (push) Has been cancelled
Branch Build CE / Build-Push AIO Docker Image (push) Has been cancelled
Branch Build CE / Upload Build Assets (push) Has been cancelled
Branch Build CE / Build Release (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Codespell / Check for spelling errors (push) Has been cancelled
Sync Repositories / sync_changes (push) Has been cancelled
Synced from upstream: 8853637e981ed7d8a6cff32bd98e7afe20f54362
85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
import { route } from "@react-router/dev/routes";
|
|
import type { RouteConfigEntry } from "@react-router/dev/routes";
|
|
import { coreRoutes } from "./routes/core";
|
|
import { extendedRoutes } from "./routes/extended";
|
|
|
|
/**
|
|
* Merges two route configurations intelligently.
|
|
* - Deep merges children when the same layout file exists in both arrays
|
|
* - Deduplicates routes by file property, preferring extended over core
|
|
* - Maintains order: core routes first, then extended routes at each level
|
|
*/
|
|
function mergeRoutes(core: RouteConfigEntry[], extended: RouteConfigEntry[]): RouteConfigEntry[] {
|
|
// Step 1: Create a Map to track routes by file path
|
|
const routeMap = new Map<string, RouteConfigEntry>();
|
|
|
|
// Step 2: Process core routes first
|
|
for (const coreRoute of core) {
|
|
const fileKey = coreRoute.file;
|
|
routeMap.set(fileKey, coreRoute);
|
|
}
|
|
|
|
// Step 3: Process extended routes
|
|
for (const extendedRoute of extended) {
|
|
const fileKey = extendedRoute.file;
|
|
|
|
if (routeMap.has(fileKey)) {
|
|
// Route exists in both - need to merge
|
|
const coreRoute = routeMap.get(fileKey)!;
|
|
|
|
// Check if both have children (layouts that need deep merging)
|
|
if (coreRoute.children && extendedRoute.children) {
|
|
// Deep merge: recursively merge children
|
|
const mergedChildren = mergeRoutes(
|
|
Array.isArray(coreRoute.children) ? coreRoute.children : [],
|
|
Array.isArray(extendedRoute.children) ? extendedRoute.children : []
|
|
);
|
|
routeMap.set(fileKey, {
|
|
...extendedRoute,
|
|
children: mergedChildren,
|
|
});
|
|
} else {
|
|
// No children or only one has children - prefer extended
|
|
routeMap.set(fileKey, extendedRoute);
|
|
}
|
|
} else {
|
|
// Route only exists in extended
|
|
routeMap.set(fileKey, extendedRoute);
|
|
}
|
|
}
|
|
|
|
// Step 4: Build final array maintaining order (core first, then extended-only)
|
|
const result: RouteConfigEntry[] = [];
|
|
|
|
// Add all core routes (now merged or original)
|
|
for (const coreRoute of core) {
|
|
const fileKey = coreRoute.file;
|
|
if (routeMap.has(fileKey)) {
|
|
result.push(routeMap.get(fileKey)!);
|
|
routeMap.delete(fileKey); // Remove so we don't add it again
|
|
}
|
|
}
|
|
|
|
// Add remaining extended-only routes
|
|
for (const extendedRoute of extended) {
|
|
const fileKey = extendedRoute.file;
|
|
if (routeMap.has(fileKey)) {
|
|
result.push(routeMap.get(fileKey)!);
|
|
routeMap.delete(fileKey);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Main Routes Configuration
|
|
* This file serves as the entry point for the route configuration.
|
|
*/
|
|
const mergedRoutes: RouteConfigEntry[] = mergeRoutes(coreRoutes, extendedRoutes);
|
|
|
|
// Add catch-all route at the end (404 handler)
|
|
const routes: RouteConfigEntry[] = [...mergedRoutes, route("*", "./not-found.tsx")];
|
|
|
|
export default routes;
|