From a79a3b5550a5c6426c5e672497cbb92f9da290f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Born=C3=B6?= Date: Wed, 7 Sep 2022 09:45:50 +0200 Subject: [PATCH] Clean up --- packages/next/build/webpack-config.ts | 13 +- .../development/edge-api-routes/index.test.ts | 140 ------------- test/e2e/switchable-runtime/index.test.ts | 184 ++++++++++++++++++ .../pages/api/switch-in-dev-same-content.js | 3 + .../pages/api/switch-in-dev.js | 3 + .../pages/api/syntax-error-in-dev.js | 5 + .../switchable-runtime/pages/switch-in-dev.js | 7 + 7 files changed, 204 insertions(+), 151 deletions(-) delete mode 100644 test/development/edge-api-routes/index.test.ts create mode 100644 test/e2e/switchable-runtime/pages/api/switch-in-dev-same-content.js create mode 100644 test/e2e/switchable-runtime/pages/api/switch-in-dev.js create mode 100644 test/e2e/switchable-runtime/pages/api/syntax-error-in-dev.js create mode 100644 test/e2e/switchable-runtime/pages/switch-in-dev.js diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index 3b9696e9f96d..02f1012f7497 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -28,7 +28,6 @@ import { MODERN_BROWSERSLIST_TARGET, COMPILER_NAMES, CompilerNameValues, - EDGE_RUNTIME_WEBPACK, } from '../shared/lib/constants' import { execOnce } from '../shared/lib/utils' import { NextConfigComplete } from '../server/config-shared' @@ -1408,16 +1407,8 @@ export default async function getBaseWebpackConfig( // On the server we don't use hashes filename: isNodeServer || isEdgeServer - ? isEdgeServer - ? '[name].js' - : dev - ? ({ runtime, chunk }) => - chunk?.name?.startsWith('pages/') - ? runtime === EDGE_RUNTIME_WEBPACK - ? // Append the runtime to the filename in dev to prevent both compilers outputting to the same file when switching between runtimes - '[name]-e.js' - : '[name]-s.js' - : '[name].js' + ? dev || isEdgeServer + ? `[name].js` : `../[name].js` : `static/chunks/${isDevFallback ? 'fallback/' : ''}[name]${ dev ? '' : appDir ? '-[chunkhash]' : '-[contenthash]' diff --git a/test/development/edge-api-routes/index.test.ts b/test/development/edge-api-routes/index.test.ts deleted file mode 100644 index 3c1c413771a7..000000000000 --- a/test/development/edge-api-routes/index.test.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { createNext } from 'e2e-utils' -import { NextInstance } from 'test/lib/next-modes/base' -import { check, renderViaHTTP } from 'next-test-utils' - -describe('edge-api-routes', () => { - let next: NextInstance - - beforeAll(async () => { - next = await createNext({ - files: { - 'pages/index.js': ` - export default function Page() { - return

hello world

- } - `, - }, - dependencies: {}, - }) - }) - afterAll(() => next.destroy()) - - test('Switch between runtimes - edge first', async () => { - // Edge - await next.patchFile( - 'pages/api/hello.js', - ` - export const config = { - runtime: 'experimental-edge', - } - - export default () => new Response('edge response') - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello'), 'edge response') - - // Server - await next.patchFile( - 'pages/api/hello.js', - ` - export default function (req, res) { - res.send('server response') - } - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello'), 'server response') - - // Edge - await next.patchFile( - 'pages/api/hello.js', - ` - export const config = { - runtime: 'experimental-edge', - } - - export default () => new Response('edge response') - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello'), 'edge response') - }) - - test('Switch between runtimes - server first', async () => { - // Server - await next.patchFile( - 'pages/api/hello2.js', - ` - export default function (req, res) { - res.send('server response') - } - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello2'), 'server response') - - // Edge - await next.patchFile( - 'pages/api/hello2.js', - ` - export const config = { - runtime: 'experimental-edge', - } - - export default () => new Response('edge response') - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello2'), 'edge response') - - // Server - await next.patchFile( - 'pages/api/hello2.js', - ` - export default function (req, res) { - res.send('server response') - } - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello2'), 'server response') - }) - - test('Recover from syntax error', async () => { - await next.patchFile( - 'pages/api/hello3.js', - ` - export const config = { - runtime: 'experimental-edge', - } - - export default () => new Response('edge response') - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello3'), 'edge response') - - // Syntax error - await next.patchFile( - 'pages/api/hello3.js', - ` - export const config = { - runtime: 'experimental-edge', - } - - export default => new Response('edge response') - ` - ) - await check( - () => renderViaHTTP(next.url, '/api/hello3'), - /Unexpected token/ - ) - - // Fix syntax error - await next.patchFile( - 'pages/api/hello3.js', - ` - export const config = { - runtime: 'experimental-edge', - } - - export default () => new Response('edge response 2') - ` - ) - await check(() => renderViaHTTP(next.url, '/api/hello3'), 'edge response 2') - }) -}) diff --git a/test/e2e/switchable-runtime/index.test.ts b/test/e2e/switchable-runtime/index.test.ts index f21f94dba24b..958e2780a8d8 100644 --- a/test/e2e/switchable-runtime/index.test.ts +++ b/test/e2e/switchable-runtime/index.test.ts @@ -202,6 +202,190 @@ describe('Switchable runtime', () => { }) } }) + + it('should be possible to switch between runtimes in API routes', async () => { + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev'), + 'server response' + ) + + // Edge + await next.patchFile( + 'pages/api/switch-in-dev.js', + ` + export const config = { + runtime: 'experimental-edge', + } + + export default () => new Response('edge response') + ` + ) + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev'), + 'edge response' + ) + + // Server + await next.patchFile( + 'pages/api/switch-in-dev.js', + ` + export default function (req, res) { + res.send('server response again') + } + ` + ) + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev'), + 'server response again' + ) + + // Edge + await next.patchFile( + 'pages/api/switch-in-dev.js', + ` + export const config = { + runtime: 'experimental-edge', + } + + export default () => new Response('edge response again') + ` + ) + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev'), + 'edge response again' + ) + }) + + it('should be possible to switch between runtimes in pages', async () => { + await check( + () => renderViaHTTP(next.url, '/switch-in-dev'), + /Hello from edge page/ + ) + + // Server + await next.patchFile( + 'pages/switch-in-dev.js', + ` + export default function Page() { + return

Hello from server page

+ } + ` + ) + await check( + () => renderViaHTTP(next.url, '/switch-in-dev'), + /Hello from server page/ + ) + + // Edge + await next.patchFile( + 'pages/switch-in-dev.js', + ` + export default function Page() { + return

Hello from edge page again

+ } + + export const config = { + runtime: 'experimental-edge', + } + ` + ) + await check( + () => renderViaHTTP(next.url, '/switch-in-dev'), + /Hello from edge page again/ + ) + + // Server + await next.patchFile( + 'pages/switch-in-dev.js', + ` + export default function Page() { + return

Hello from server page again

+ } + ` + ) + await check( + () => renderViaHTTP(next.url, '/switch-in-dev'), + /Hello from server page again/ + ) + }) + + // Doesn't work, see https://github.com/vercel/next.js/pull/39327 + it.skip('should be possible to switch between runtimes with same content', async () => { + const fileContent = await next.readFile( + 'pages/api/switch-in-dev-same-content.js' + ) + console.log({ fileContent }) + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev-same-content'), + 'server response' + ) + + // Edge + await next.patchFile( + 'pages/api/switch-in-dev-same-content.js', + ` + export const config = { + runtime: 'experimental-edge', + } + + export default () => new Response('edge response') + ` + ) + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev-same-content'), + 'edge response' + ) + + // Server - same content as first compilation of the server runtime version + await next.patchFile( + 'pages/api/switch-in-dev-same-content.js', + fileContent + ) + await check( + () => renderViaHTTP(next.url, '/api/switch-in-dev-same-content'), + 'server response' + ) + }) + + it('should recover from syntax error when using edge runtime', async () => { + await check( + () => renderViaHTTP(next.url, '/api/syntax-error-in-dev'), + 'edge response' + ) + + // Syntax error + await next.patchFile( + 'pages/api/syntax-error-in-dev.js', + ` + export const config = { + runtime: 'experimental-edge', + } + + export default => new Response('edge response') + ` + ) + await check( + () => renderViaHTTP(next.url, '/api/syntax-error-in-dev'), + /Unexpected token/ + ) + + // Fix syntax error + await next.patchFile( + 'pages/api/syntax-error-in-dev.js', + ` + export default () => new Response('edge response again') + + export const config = { + runtime: 'experimental-edge', + } + + ` + ) + await check( + () => renderViaHTTP(next.url, '/api/syntax-error-in-dev'), + 'edge response again' + ) + }) }) } else { describe('Switchable runtime (prod)', () => { diff --git a/test/e2e/switchable-runtime/pages/api/switch-in-dev-same-content.js b/test/e2e/switchable-runtime/pages/api/switch-in-dev-same-content.js new file mode 100644 index 000000000000..a587c8cb1a71 --- /dev/null +++ b/test/e2e/switchable-runtime/pages/api/switch-in-dev-same-content.js @@ -0,0 +1,3 @@ +export default (req, res) => { + res.send('server response') +} diff --git a/test/e2e/switchable-runtime/pages/api/switch-in-dev.js b/test/e2e/switchable-runtime/pages/api/switch-in-dev.js new file mode 100644 index 000000000000..a587c8cb1a71 --- /dev/null +++ b/test/e2e/switchable-runtime/pages/api/switch-in-dev.js @@ -0,0 +1,3 @@ +export default (req, res) => { + res.send('server response') +} diff --git a/test/e2e/switchable-runtime/pages/api/syntax-error-in-dev.js b/test/e2e/switchable-runtime/pages/api/syntax-error-in-dev.js new file mode 100644 index 000000000000..3b7243a1205e --- /dev/null +++ b/test/e2e/switchable-runtime/pages/api/syntax-error-in-dev.js @@ -0,0 +1,5 @@ +export default () => new Response('edge response') + +export const config = { + runtime: `experimental-edge`, +} diff --git a/test/e2e/switchable-runtime/pages/switch-in-dev.js b/test/e2e/switchable-runtime/pages/switch-in-dev.js new file mode 100644 index 000000000000..b67d4cabd53c --- /dev/null +++ b/test/e2e/switchable-runtime/pages/switch-in-dev.js @@ -0,0 +1,7 @@ +export default function Page() { + return

Hello from edge page

+} + +export const config = { + runtime: 'experimental-edge', +}