From 28301a2ca350fef818501fa5a1b61155ed4192cc Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Fri, 27 May 2022 14:02:45 +0200 Subject: [PATCH 1/8] Temp progress --- .../build/webpack/loaders/next-app-loader.ts | 2 + packages/next/client/app-index.tsx | 72 +----------------- .../client/components/app-router.client.tsx | 75 +++++++++++++++++++ packages/next/server/app-render.tsx | 23 +++++- 4 files changed, 99 insertions(+), 73 deletions(-) create mode 100644 packages/next/client/components/app-router.client.tsx diff --git a/packages/next/build/webpack/loaders/next-app-loader.ts b/packages/next/build/webpack/loaders/next-app-loader.ts index 3d21024d84a33..f8a1764c24261 100644 --- a/packages/next/build/webpack/loaders/next-app-loader.ts +++ b/packages/next/build/webpack/loaders/next-app-loader.ts @@ -117,6 +117,8 @@ const nextAppLoader: webpack.LoaderDefinitionFunction<{ ${componentsCode.join(',\n')} }; + export const AppRouter = require('next/dist/client/components/app-router.client.js').default + export const __next_app_webpack_require__ = __webpack_require__ ` return result diff --git a/packages/next/client/app-index.tsx b/packages/next/client/app-index.tsx index c0b958017bc3b..21df8aeb919e4 100644 --- a/packages/next/client/app-index.tsx +++ b/packages/next/client/app-index.tsx @@ -4,10 +4,7 @@ import '../build/polyfills/polyfill-module' import ReactDOMClient from 'react-dom/client' // @ts-ignore startTransition exists when using React 18 import React from 'react' -import { - createFromFetch, - createFromReadableStream, -} from 'next/dist/compiled/react-server-dom-webpack' +import { createFromReadableStream } from 'next/dist/compiled/react-server-dom-webpack' /// @@ -151,76 +148,11 @@ const RSCComponent = () => { return } -function fetchFlight(href: string) { - const url = new URL(href, location.origin) - const searchParams = url.searchParams - searchParams.append('__flight__', '1') - - return fetch(url.toString()) -} - -function useServerResponse(cacheKey: string) { - let response = rscCache.get(cacheKey) - if (response) return response - - response = createFromFetch(fetchFlight(getCacheKey())) - - rscCache.set(cacheKey, response) - return response -} - -const AppRouterContext = React.createContext({}) - -// TODO: move to client component when handling is implemented -function AppRouter({ initialUrl, children }: any) { - const initialState = { - url: initialUrl, - } - const previousUrlRef = React.useRef(initialState) - const [current, setCurrent] = React.useState(initialState) - - const appRouter = React.useMemo(() => { - return { - push: (url: string) => { - previousUrlRef.current = current - setCurrent({ ...current, url }) - // TODO: update url eagerly or not? - window.history.pushState(current, '', url) - }, - url: current.url, - } - }, [current]) - - // @ts-ignore TODO: for testing - window.appRouter = appRouter - - console.log({ - appRouter, - previous: previousUrlRef.current, - current, - }) - - let root - if (current.url !== previousUrlRef.current?.url) { - // eslint-disable-next-line - const data = useServerResponse(current.url) - root = data.readRoot() - } - - return ( - - {root ? root : children} - - ) -} - export function hydrate() { renderReactElement(appElement!, () => ( - - - + )) diff --git a/packages/next/client/components/app-router.client.tsx b/packages/next/client/components/app-router.client.tsx new file mode 100644 index 0000000000000..e071257d70207 --- /dev/null +++ b/packages/next/client/components/app-router.client.tsx @@ -0,0 +1,75 @@ +import React from 'react' +// import { createFromFetch } from 'next/dist/compiled/react-server-dom-webpack' + +// function createResponseCache() { +// return new Map() +// } +// const rscCache = createResponseCache() + +// const getCacheKey = () => { +// const { pathname, search } = location +// return pathname + search +// } + +// function fetchFlight(href: string) { +// const url = new URL(href, location.origin) +// const searchParams = url.searchParams +// searchParams.append('__flight__', '1') + +// return fetch(url.toString()) +// } + +// function fetchServerResponse(cacheKey: string) { +// let response = rscCache.get(cacheKey) +// if (response) return response + +// response = createFromFetch(fetchFlight(getCacheKey())) + +// rscCache.set(cacheKey, response) +// return response +// } + +// const AppRouterContext = React.createContext({}) + +// TODO: move to client component when handling is implemented +export default function AppRouter({ initialUrl, children }: any) { + return ( + <> +

Router

+ + ) + // const initialState = { + // url: initialUrl, + // } + // const previousUrlRef = React.useRef(initialState) + // const [current, setCurrent] = React.useState(initialState) + // const appRouter = React.useMemo(() => { + // return { + // push: (url: string) => { + // previousUrlRef.current = current + // setCurrent({ ...current, url }) + // // TODO: update url eagerly or not? + // window.history.pushState(current, '', url) + // }, + // url: current.url, + // } + // }, [current]) + // // @ts-ignore TODO: for testing + // window.appRouter = appRouter + // console.log({ + // appRouter, + // previous: previousUrlRef.current, + // current, + // }) + // let root + // if (current.url !== previousUrlRef.current?.url) { + // // eslint-disable-next-line + // const data = fetchServerResponse(current.url) + // root = data.readRoot() + // } + // return ( + // + // {root ? root : children} + // + // ) +} diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 7dcbd2046a4aa..13a3aa6eca785 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -350,6 +350,15 @@ export async function renderToHTML( // } } + const AppRouter = ComponentMod.AppRouter + const WrappedComponentWithRouter = () => { + return ( + + + + ) + } + const bootstrapScripts = !isSubtreeRender ? buildManifest.rootMainFiles.map((src) => '/_next/' + src) : undefined @@ -362,13 +371,21 @@ export async function renderToHTML( serverComponentsInlinedTransformStream = new TransformStream() const search = stringifyQuery(query) + const handler2 = { + get(target, prop, receiver) { + console.log({ target, prop }) + return '' + }, + } + + const proxy2 = new Proxy(serverComponentManifest, handler2) const Component = createServerComponentRenderer( - WrappedComponent, + WrappedComponentWithRouter, ComponentMod, { cachePrefix: pathname + (search ? `?${search}` : ''), transformStream: serverComponentsInlinedTransformStream, - serverComponentManifest, + serverComponentManifest: proxy2, } ) @@ -388,7 +405,7 @@ export async function renderToHTML( if (renderServerComponentData) { return new RenderResult( renderToReadableStream( - , + , serverComponentManifest ).pipeThrough(createBufferedTransformStream()) ) From ccb0011247a0931b47d8213d55659d5685a1ae0d Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Fri, 27 May 2022 15:06:01 +0200 Subject: [PATCH 2/8] support for cjs exports in flight manifest --- .../webpack/plugins/flight-manifest-plugin.ts | 37 ++++++++++++++++--- packages/next/server/app-render.tsx | 10 +---- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/packages/next/build/webpack/plugins/flight-manifest-plugin.ts b/packages/next/build/webpack/plugins/flight-manifest-plugin.ts index ee10b4a3e563b..5d1e570da766f 100644 --- a/packages/next/build/webpack/plugins/flight-manifest-plugin.ts +++ b/packages/next/build/webpack/plugins/flight-manifest-plugin.ts @@ -87,16 +87,41 @@ export class FlightManifestPlugin { const moduleExports: any = manifest[resource] || {} const exportsInfo = compilation.moduleGraph.getExportsInfo(mod) - const moduleExportedKeys = ['', '*'].concat( - [...exportsInfo.exports] - .map((exportInfo) => { + const cjsExports = [ + ...new Set( + [].concat( + mod.dependencies.map((dep: any) => { + // Match CommonJsSelfReferenceDependency + if (dep.type === 'cjs self exports reference') { + // `module.exports = ...` + if (dep.base === 'module.exports') { + return 'default' + } + + // `exports.foo = ...`, `exports.default = ...` + if (dep.base === 'exports') { + return dep.names.filter( + (name: any) => name !== '__esModule' + ) + } + } + return null + }) + ) + ), + ] + + const moduleExportedKeys = ['', '*'] + .concat( + [...exportsInfo.exports].map((exportInfo) => { if (exportInfo.provided) { return exportInfo.name } return null - }) - .filter(Boolean) - ) + }), + ...cjsExports + ) + .filter((name) => name !== null) moduleExportedKeys.forEach((name) => { if (!moduleExports[name]) { diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 13a3aa6eca785..8c4a343383e66 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -371,21 +371,13 @@ export async function renderToHTML( serverComponentsInlinedTransformStream = new TransformStream() const search = stringifyQuery(query) - const handler2 = { - get(target, prop, receiver) { - console.log({ target, prop }) - return '' - }, - } - - const proxy2 = new Proxy(serverComponentManifest, handler2) const Component = createServerComponentRenderer( WrappedComponentWithRouter, ComponentMod, { cachePrefix: pathname + (search ? `?${search}` : ''), transformStream: serverComponentsInlinedTransformStream, - serverComponentManifest: proxy2, + serverComponentManifest, } ) From 6a31e85d20c091103e81d989d20aa8ebe5728292 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 29 May 2022 13:27:57 +0200 Subject: [PATCH 3/8] Pass url --- packages/next/server/app-render.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 8c4a343383e66..dbb48ae81977e 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -353,7 +353,7 @@ export async function renderToHTML( const AppRouter = ComponentMod.AppRouter const WrappedComponentWithRouter = () => { return ( - + ) From a2a2e4c7127794003ebc2be9a93b9332a51438a2 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 29 May 2022 13:28:36 +0200 Subject: [PATCH 4/8] Add router as client component --- .../client/components/app-router.client.tsx | 121 +++++++++--------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/packages/next/client/components/app-router.client.tsx b/packages/next/client/components/app-router.client.tsx index e071257d70207..1b0d3ba14c6c4 100644 --- a/packages/next/client/components/app-router.client.tsx +++ b/packages/next/client/components/app-router.client.tsx @@ -1,75 +1,74 @@ import React from 'react' -// import { createFromFetch } from 'next/dist/compiled/react-server-dom-webpack' +import { createFromFetch } from 'next/dist/compiled/react-server-dom-webpack' +import { RouterContext } from '../../shared/lib/router-context' -// function createResponseCache() { -// return new Map() -// } -// const rscCache = createResponseCache() - -// const getCacheKey = () => { -// const { pathname, search } = location -// return pathname + search -// } +function createResponseCache() { + return new Map() +} +const rscCache = createResponseCache() -// function fetchFlight(href: string) { -// const url = new URL(href, location.origin) -// const searchParams = url.searchParams -// searchParams.append('__flight__', '1') +const getCacheKey = () => { + const { pathname, search } = location + return pathname + search +} -// return fetch(url.toString()) -// } +function fetchFlight(href: string) { + const url = new URL(href, location.origin) + const searchParams = url.searchParams + searchParams.append('__flight__', '1') -// function fetchServerResponse(cacheKey: string) { -// let response = rscCache.get(cacheKey) -// if (response) return response + return fetch(url.toString()) +} -// response = createFromFetch(fetchFlight(getCacheKey())) +function fetchServerResponse(cacheKey: string) { + let response = rscCache.get(cacheKey) + if (response) return response -// rscCache.set(cacheKey, response) -// return response -// } + response = createFromFetch(fetchFlight(getCacheKey())) -// const AppRouterContext = React.createContext({}) + rscCache.set(cacheKey, response) + return response +} // TODO: move to client component when handling is implemented export default function AppRouter({ initialUrl, children }: any) { + const initialState = { + url: initialUrl, + } + const previousUrlRef = React.useRef(initialState) + const [current, setCurrent] = React.useState(initialState) + const appRouter = React.useMemo(() => { + return { + prefetch: () => {}, + replace: () => {}, + push: (url: string) => { + previousUrlRef.current = current + setCurrent({ ...current, url }) + // TODO: update url eagerly or not? + window.history.pushState(current, '', url) + }, + url: current.url, + } + }, [current]) + if (typeof window !== 'undefined') { + // @ts-ignore TODO: for testing + window.appRouter = appRouter + console.log({ + appRouter, + previous: previousUrlRef.current, + current, + }) + } + + let root + if (current.url !== previousUrlRef.current?.url) { + // eslint-disable-next-line + const data = fetchServerResponse(current.url) + root = data.readRoot() + } return ( - <> -

Router

- + + {root ? root : children} + ) - // const initialState = { - // url: initialUrl, - // } - // const previousUrlRef = React.useRef(initialState) - // const [current, setCurrent] = React.useState(initialState) - // const appRouter = React.useMemo(() => { - // return { - // push: (url: string) => { - // previousUrlRef.current = current - // setCurrent({ ...current, url }) - // // TODO: update url eagerly or not? - // window.history.pushState(current, '', url) - // }, - // url: current.url, - // } - // }, [current]) - // // @ts-ignore TODO: for testing - // window.appRouter = appRouter - // console.log({ - // appRouter, - // previous: previousUrlRef.current, - // current, - // }) - // let root - // if (current.url !== previousUrlRef.current?.url) { - // // eslint-disable-next-line - // const data = fetchServerResponse(current.url) - // root = data.readRoot() - // } - // return ( - // - // {root ? root : children} - // - // ) } From 37eec4d35151433f44c810861dad39c88e220c6c Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 29 May 2022 13:29:10 +0200 Subject: [PATCH 5/8] use RouterContext instead of useRouter --- packages/next/client/link.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next/client/link.tsx b/packages/next/client/link.tsx index 86ca88c684347..d299471236468 100644 --- a/packages/next/client/link.tsx +++ b/packages/next/client/link.tsx @@ -9,7 +9,7 @@ import { PrefetchOptions, resolveHref, } from '../shared/lib/router/router' -import { useRouter } from './router' +import { RouterContext } from '../shared/lib/router-context' import { useIntersection } from './use-intersection' type Url = string | UrlObject @@ -269,7 +269,7 @@ const Link = React.forwardRef( } const p = prefetchProp !== false - const router = useRouter() + const router = React.useContext(RouterContext) const { href, as } = React.useMemo(() => { const [resolvedHref, resolvedAs] = resolveHref(router, hrefProp, true) From 9bae4886c0b61fce540870e53b04c9420ad75947 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 29 May 2022 13:36:56 +0200 Subject: [PATCH 6/8] Create separate context for app router --- packages/next/client/components/app-router.client.tsx | 6 +++--- packages/next/client/link.tsx | 8 +++++++- packages/next/shared/lib/app-router-context.ts | 7 +++++++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 packages/next/shared/lib/app-router-context.ts diff --git a/packages/next/client/components/app-router.client.tsx b/packages/next/client/components/app-router.client.tsx index 1b0d3ba14c6c4..44a2f25142478 100644 --- a/packages/next/client/components/app-router.client.tsx +++ b/packages/next/client/components/app-router.client.tsx @@ -1,6 +1,6 @@ import React from 'react' import { createFromFetch } from 'next/dist/compiled/react-server-dom-webpack' -import { RouterContext } from '../../shared/lib/router-context' +import { AppRouterContext } from '../../shared/lib/app-router-context' function createResponseCache() { return new Map() @@ -67,8 +67,8 @@ export default function AppRouter({ initialUrl, children }: any) { root = data.readRoot() } return ( - + {root ? root : children} - + ) } diff --git a/packages/next/client/link.tsx b/packages/next/client/link.tsx index d299471236468..0f0123ebbf518 100644 --- a/packages/next/client/link.tsx +++ b/packages/next/client/link.tsx @@ -10,6 +10,7 @@ import { resolveHref, } from '../shared/lib/router/router' import { RouterContext } from '../shared/lib/router-context' +import { AppRouterContext } from '../shared/lib/app-router-context' import { useIntersection } from './use-intersection' type Url = string | UrlObject @@ -269,7 +270,12 @@ const Link = React.forwardRef( } const p = prefetchProp !== false - const router = React.useContext(RouterContext) + let router = React.useContext(RouterContext) + + const appRouter = React.useContext(AppRouterContext) + if (appRouter) { + router = appRouter + } const { href, as } = React.useMemo(() => { const [resolvedHref, resolvedAs] = resolveHref(router, hrefProp, true) diff --git a/packages/next/shared/lib/app-router-context.ts b/packages/next/shared/lib/app-router-context.ts new file mode 100644 index 0000000000000..2d01ff67dcd68 --- /dev/null +++ b/packages/next/shared/lib/app-router-context.ts @@ -0,0 +1,7 @@ +import React from 'react' + +export const AppRouterContext = React.createContext(null as any) + +if (process.env.NODE_ENV !== 'production') { + AppRouterContext.displayName = 'AppRouterContext' +} From 19d677a6054040eeaa962afb27ebe5f96e75391f Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 29 May 2022 16:13:30 +0200 Subject: [PATCH 7/8] Update index page handling --- packages/next/build/webpack/loaders/next-app-loader.ts | 2 +- packages/next/server/base-server.ts | 7 ++----- .../slow/{index => }/page.server.js | 0 .../nested/{index => }/page.server.js | 0 .../slow/{index => }/page.server.js | 0 .../getstaticprops-only/slow/{index => }/page.server.js | 0 .../app/app/client-nested/{index => }/page.server.js | 0 test/e2e/app-dir/app/app/dashboard/index/page.server.js | 4 ++-- .../app/dashboard/integrations/{index => }/page.server.js | 0 test/e2e/app-dir/app/app/dashboard/page.server.js | 7 +++++++ 10 files changed, 12 insertions(+), 8 deletions(-) rename test/e2e/app-dir/app-rendering/app/getserversideprops-only/slow/{index => }/page.server.js (100%) rename test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/nested/{index => }/page.server.js (100%) rename test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/slow/{index => }/page.server.js (100%) rename test/e2e/app-dir/app-rendering/app/getstaticprops-only/slow/{index => }/page.server.js (100%) rename test/e2e/app-dir/app/app/client-nested/{index => }/page.server.js (100%) rename test/e2e/app-dir/app/app/dashboard/integrations/{index => }/page.server.js (100%) create mode 100644 test/e2e/app-dir/app/app/dashboard/page.server.js diff --git a/packages/next/build/webpack/loaders/next-app-loader.ts b/packages/next/build/webpack/loaders/next-app-loader.ts index f8a1764c24261..83ec9ecb73cb2 100644 --- a/packages/next/build/webpack/loaders/next-app-loader.ts +++ b/packages/next/build/webpack/loaders/next-app-loader.ts @@ -106,7 +106,7 @@ const nextAppLoader: webpack.LoaderDefinitionFunction<{ // Add page itself to the list of components componentsCode.push( `'${pathToUrlPath(pagePath).replace( - new RegExp(`/page+(${extensions.join('|')})$`), + new RegExp(`(${extensions.join('|')})$`), '' // use require so that we can bust the require cache )}': () => require('${pagePath}')` diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 0e7d48c52c05a..3a75341111786 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -1703,13 +1703,10 @@ export default abstract class Server { let page = pathname const bubbleNoFallback = !!query._nextBubbleNoFallback delete query._nextBubbleNoFallback - // map the route to the actual bundle name e.g. - // `/dashboard/rootonly/hello` -> `/dashboard+rootonly/hello` + // map the route to the actual bundle name const getOriginalappPath = (appPath: string) => { if (this.nextConfig.experimental.appDir) { - const originalappPath = - this.appPathRoutes?.[`${appPath}/index`] || - this.appPathRoutes?.[`${appPath}`] + const originalappPath = this.appPathRoutes?.[appPath] if (!originalappPath) { return null diff --git a/test/e2e/app-dir/app-rendering/app/getserversideprops-only/slow/index/page.server.js b/test/e2e/app-dir/app-rendering/app/getserversideprops-only/slow/page.server.js similarity index 100% rename from test/e2e/app-dir/app-rendering/app/getserversideprops-only/slow/index/page.server.js rename to test/e2e/app-dir/app-rendering/app/getserversideprops-only/slow/page.server.js diff --git a/test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/nested/index/page.server.js b/test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/nested/page.server.js similarity index 100% rename from test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/nested/index/page.server.js rename to test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/nested/page.server.js diff --git a/test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/slow/index/page.server.js b/test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/slow/page.server.js similarity index 100% rename from test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/slow/index/page.server.js rename to test/e2e/app-dir/app-rendering/app/getstaticprops-getserversideprops-combined/slow/page.server.js diff --git a/test/e2e/app-dir/app-rendering/app/getstaticprops-only/slow/index/page.server.js b/test/e2e/app-dir/app-rendering/app/getstaticprops-only/slow/page.server.js similarity index 100% rename from test/e2e/app-dir/app-rendering/app/getstaticprops-only/slow/index/page.server.js rename to test/e2e/app-dir/app-rendering/app/getstaticprops-only/slow/page.server.js diff --git a/test/e2e/app-dir/app/app/client-nested/index/page.server.js b/test/e2e/app-dir/app/app/client-nested/page.server.js similarity index 100% rename from test/e2e/app-dir/app/app/client-nested/index/page.server.js rename to test/e2e/app-dir/app/app/client-nested/page.server.js diff --git a/test/e2e/app-dir/app/app/dashboard/index/page.server.js b/test/e2e/app-dir/app/app/dashboard/index/page.server.js index f80ed6fe91206..7eea5b3463b5a 100644 --- a/test/e2e/app-dir/app/app/dashboard/index/page.server.js +++ b/test/e2e/app-dir/app/app/dashboard/index/page.server.js @@ -1,7 +1,7 @@ -export default function DashboardPage(props) { +export default function DashboardIndexPage() { return ( <> -

hello from root/dashboard

+

hello from root/dashboard/index

) } diff --git a/test/e2e/app-dir/app/app/dashboard/integrations/index/page.server.js b/test/e2e/app-dir/app/app/dashboard/integrations/page.server.js similarity index 100% rename from test/e2e/app-dir/app/app/dashboard/integrations/index/page.server.js rename to test/e2e/app-dir/app/app/dashboard/integrations/page.server.js diff --git a/test/e2e/app-dir/app/app/dashboard/page.server.js b/test/e2e/app-dir/app/app/dashboard/page.server.js new file mode 100644 index 0000000000000..f80ed6fe91206 --- /dev/null +++ b/test/e2e/app-dir/app/app/dashboard/page.server.js @@ -0,0 +1,7 @@ +export default function DashboardPage(props) { + return ( + <> +

hello from root/dashboard

+ + ) +} From 66774b025fc5f027c86bc8230a821e537cab0f42 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Sun, 29 May 2022 16:21:30 +0200 Subject: [PATCH 8/8] Add test for /index --- test/e2e/app-dir/index.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/e2e/app-dir/index.test.ts b/test/e2e/app-dir/index.test.ts index ea3c668d11bf3..aee586482a0af 100644 --- a/test/e2e/app-dir/index.test.ts +++ b/test/e2e/app-dir/index.test.ts @@ -52,11 +52,16 @@ describe('views dir', () => { expect(html).toContain('hello world') }) - it('should serve from root', async () => { + it('should serve from app', async () => { const html = await renderViaHTTP(next.url, '/dashboard') expect(html).toContain('hello from root/dashboard') }) + it('should serve /index as separate page', async () => { + const html = await renderViaHTTP(next.url, '/dashboard/index') + expect(html).toContain('hello from root/dashboard/index') + }) + it('should include layouts when no direct parent layout', async () => { const html = await renderViaHTTP(next.url, '/dashboard/integrations') const $ = cheerio.load(html)