Initial commit: Plane
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
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
This commit is contained in:
84
apps/web/app/routes.ts
Normal file
84
apps/web/app/routes.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user