From b320f5bd593a8c9221ada03c6bcb090ab7562ceb Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 31 Oct 2019 15:26:47 -0500 Subject: [PATCH] Add handling for exportTrailingSlash for iSSG pages (#9258) * Add handling for exportTrailingSlash for iSSG pages * Update index.test.js --- packages/next/export/index.ts | 9 +++++-- .../integration/prerender/pages/blog/index.js | 25 +++++++++++++++++++ test/integration/prerender/test/index.test.js | 23 ++++++++++++----- 3 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 test/integration/prerender/pages/blog/index.js diff --git a/packages/next/export/index.ts b/packages/next/export/index.ts index 2a0ae8b139..17d112c6ae 100644 --- a/packages/next/export/index.ts +++ b/packages/next/export/index.ts @@ -3,7 +3,7 @@ import { copyFile as copyFileOrig, existsSync, readFileSync } from 'fs' import Worker from 'jest-worker' import mkdirpModule from 'mkdirp' import { cpus } from 'os' -import { dirname, join, resolve } from 'path' +import { dirname, join, resolve, sep } from 'path' import { promisify } from 'util' import { AmpPageStatus, formatAmpMessages } from '../build/output/index' @@ -321,7 +321,12 @@ export default async function( Object.keys(prerenderManifest.routes).map(async route => { route = route === '/' ? '/index' : route const orig = join(distPagesDir, route) - const htmlDest = join(outDir, `${route}.html`) + const htmlDest = join( + outDir, + `${route}${ + subFolders && route !== '/index' ? `${sep}index` : '' + }.html` + ) const jsonDest = join(sprDataDir, `${route}.json`) await mkdirp(dirname(htmlDest)) diff --git a/test/integration/prerender/pages/blog/index.js b/test/integration/prerender/pages/blog/index.js new file mode 100644 index 0000000000..3b6490ee1b --- /dev/null +++ b/test/integration/prerender/pages/blog/index.js @@ -0,0 +1,25 @@ +import React from 'react' +import Link from 'next/link' + +// eslint-disable-next-line camelcase +export async function unstable_getStaticProps () { + return { + props: { + slugs: ['post-1', 'post-2'], + time: (await import('perf_hooks')).performance.now() + }, + revalidate: 10 + } +} + +export default ({ slugs, time }) => { + return ( + <> +

Posts: {JSON.stringify(slugs)}

+ time: {time} + + to home + + + ) +} diff --git a/test/integration/prerender/test/index.test.js b/test/integration/prerender/test/index.test.js index f1c1a740a3..8ef7a353c2 100644 --- a/test/integration/prerender/test/index.test.js +++ b/test/integration/prerender/test/index.test.js @@ -12,6 +12,7 @@ import { waitFor, nextBuild, nextStart, + stopApp, nextExport, startStaticServer, initNextServerScript @@ -85,6 +86,11 @@ const expectedManifestRoutes = () => ({ initialRevalidateSeconds: 0, srcRoute: null }, + '/blog': { + dataRoute: `/_next/data/${buildId}/blog.json`, + initialRevalidateSeconds: 10, + srcRoute: null + }, '/default-revalidate': { dataRoute: `/_next/data/${buildId}/default-revalidate.json`, initialRevalidateSeconds: 1, @@ -449,9 +455,7 @@ describe('SPR Prerender', () => { describe('production mode', () => { beforeAll(async () => { - try { - await fs.unlink(nextConfig) - } catch (_) {} + await fs.remove(nextConfig) await nextBuild(appDir) stderr = '' appPort = await findPort() @@ -471,15 +475,22 @@ describe('SPR Prerender', () => { describe('export mode', () => { beforeAll(async () => { exportDir = join(appDir, 'out') + await fs.writeFile( + nextConfig, + `module.exports = { exportTrailingSlash: true }` + ) await nextBuild(appDir) await nextExport(appDir, { outdir: exportDir }) app = await startStaticServer(exportDir) appPort = app.address().port buildId = await fs.readFile(join(appDir, '.next/BUILD_ID'), 'utf8') }) - afterAll(() => killApp(app)) + afterAll(async () => { + await stopApp(app) + await fs.remove(nextConfig) + }) - it('should copy prerender files correctly', async () => { + it('should copy prerender files and honor exportTrailingSlash', async () => { const routes = [ '/another', '/something', @@ -488,7 +499,7 @@ describe('SPR Prerender', () => { ] for (const route of routes) { - await fs.access(join(exportDir, `${route}.html`)) + await fs.access(join(exportDir, `${route}/index.html`)) await fs.access(join(exportDir, '_next/data', buildId, `${route}.json`)) } }) -- GitLab