From 9f519bc930b134f66a84c2109dd0ff1626a7dc72 Mon Sep 17 00:00:00 2001 From: Javi Velasco Date: Thu, 28 Apr 2022 18:03:47 +0200 Subject: [PATCH] Extract `absolutePagePath` util --- packages/next/server/dev/next-dev-server.ts | 21 +++++++++---------- packages/next/server/page-path-utils.ts | 23 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/packages/next/server/dev/next-dev-server.ts b/packages/next/server/dev/next-dev-server.ts index 975cdc6fb8add..61462cf9dd98c 100644 --- a/packages/next/server/dev/next-dev-server.ts +++ b/packages/next/server/dev/next-dev-server.ts @@ -40,7 +40,7 @@ import { isDynamicRoute, } from '../../shared/lib/router/utils' import Server, { WrappedBuildError } from '../next-server' -import { normalizePagePath } from '../page-path-utils' +import { absolutePathToPage, normalizePagePath } from '../page-path-utils' import Router from '../router' import { getPathMatch } from '../../shared/lib/router/utils/path-match' import { hasBasePath, replaceBasePath } from '../router-utils' @@ -242,10 +242,8 @@ export default class DevServer extends Server { let resolved = false return new Promise((resolve, reject) => { - const pagesDir = this.pagesDir - // Watchpack doesn't emit an event for an empty directory - fs.readdir(pagesDir!, (_, files) => { + fs.readdir(this.pagesDir, (_, files) => { if (files?.length) { return } @@ -257,7 +255,7 @@ export default class DevServer extends Server { }) let wp = (this.webpackWatcher = new Watchpack()) - wp.watch([], [pagesDir!], 0) + wp.watch([], [this.pagesDir], 0) wp.on('aggregated', async () => { const routedMiddleware = [] @@ -270,20 +268,21 @@ export default class DevServer extends Server { continue } + const pageName = absolutePathToPage( + this.pagesDir, + fileName, + this.nextConfig.pageExtensions + ) + if (regexMiddleware.test(fileName)) { routedMiddleware.push( - `/${relative(pagesDir!, fileName).replace(/\\+/g, '/')}` + `/${relative(this.pagesDir, fileName).replace(/\\+/g, '/')}` .replace(/^\/+/g, '/') .replace(regexMiddleware, '/') ) continue } - let pageName = - '/' + relative(pagesDir!, fileName).replace(/\\+/g, '/') - pageName = pageName.replace(regexPageExtension, '') - pageName = pageName.replace(/\/index$/, '') || '/' - invalidatePageRuntimeCache(fileName, safeTime) const pageRuntimeConfig = await getPageRuntime( fileName, diff --git a/packages/next/server/page-path-utils.ts b/packages/next/server/page-path-utils.ts index 27d93f8605e9b..e41a3476faf3d 100644 --- a/packages/next/server/page-path-utils.ts +++ b/packages/next/server/page-path-utils.ts @@ -1,5 +1,5 @@ import { isDynamicRoute } from '../shared/lib/router/utils' -import { join, posix } from '../shared/lib/isomorphic/path' +import { join, posix, relative } from '../shared/lib/isomorphic/path' import { flatten } from '../shared/lib/flatten' /** @@ -100,3 +100,24 @@ export function getPagePaths(normalizedPagePath: string, extensions: string[]) { }) ) } + +/** + * Given the absolute path to the pages folder, an absolute file path for a + * page and the page extensions, this function will return the page path + * relative to the pages folder. It doesn't consider index tail. Example: + * - `/Users/rick/my-project/pages/foo/bar/baz.js` -> `/foo/bar/baz` + * + * @param pagesDir Absolute path to the pages folder. + * @param filepath Absolute path to the page. + * @param extensions Extensions allowed for the page. + */ +export function absolutePathToPage( + pagesDir: string, + pagePath: string, + extensions: string[] +) { + return removePagePathTail( + normalizePathSep(ensureLeadingSlash(relative(pagesDir, pagePath))), + extensions + ) +}