diff --git a/.changeset/red-pugs-itch.md b/.changeset/red-pugs-itch.md new file mode 100644 index 0000000000..39fd463d92 --- /dev/null +++ b/.changeset/red-pugs-itch.md @@ -0,0 +1,5 @@ +--- +"@react-router/fs-routes": patch +--- + +Resolve route file outside of app directory relative to app directory diff --git a/packages/react-router-fs-routes/__tests__/flatRoutes-test.ts b/packages/react-router-fs-routes/__tests__/flatRoutes-test.ts index 5e7b2e8e1d..4ce23adc02 100644 --- a/packages/react-router-fs-routes/__tests__/flatRoutes-test.ts +++ b/packages/react-router-fs-routes/__tests__/flatRoutes-test.ts @@ -912,4 +912,27 @@ describe("flatRoutes", () => { ); }); }); + + describe("generates route manifest entry files relative to the app directory", () => { + let testCases: [string, string][] = [ + [path.posix.join(APP_DIR, "routes"), "routes"], + [ + path.posix.join(APP_DIR, "..", "routes"), + path.posix.join("..", "routes"), + ], + ]; + + let fileName = "route.tsx"; + + testCases.forEach(([routesDir, expected]) => { + test(`for routes directory "${routesDir}"`, () => { + let routeFile = path.posix.join(routesDir, fileName); + let routeInfo = flatRoutesUniversal(APP_DIR, [routeFile]); + let routes = Object.values(routeInfo); + + expect(routes).toHaveLength(1); + expect(routes[0].file).toBe(path.posix.join(expected, fileName)); + }); + }); + }); }); diff --git a/packages/react-router-fs-routes/flatRoutes.ts b/packages/react-router-fs-routes/flatRoutes.ts index 63265f84d1..49c015bf39 100644 --- a/packages/react-router-fs-routes/flatRoutes.ts +++ b/packages/react-router-fs-routes/flatRoutes.ts @@ -134,6 +134,8 @@ export function flatRoutesUniversal( let prefixLookup = new PrefixLookupTrie(); let uniqueRoutes = new Map(); let routeIdConflicts = new Map(); + let normalizedApp = normalizeSlashes(appDirectory); + let appWithPrefix = path.posix.join(normalizedApp, prefix); // id -> file let routeIds = new Map(); @@ -142,9 +144,8 @@ export function flatRoutesUniversal( let normalizedFile = normalizeSlashes(file); let routeExt = path.extname(normalizedFile); let routeDir = path.dirname(normalizedFile); - let normalizedApp = normalizeSlashes(appDirectory); let routeId = - routeDir === path.posix.join(normalizedApp, prefix) + routeDir === appWithPrefix ? path.posix .relative(normalizedApp, normalizedFile) .slice(0, -routeExt.length) @@ -174,7 +175,7 @@ export function flatRoutesUniversal( let pathname = createRoutePath(segments, raw, index); routeManifest[routeId] = { - file: file.slice(appDirectory.length + 1), + file: path.posix.relative(normalizedApp, file), id: routeId, path: pathname, };