From d03539b6350b76c1f1cd053b45c251d8d84bda13 Mon Sep 17 00:00:00 2001 From: feugy Date: Tue, 6 Dec 2022 14:37:00 +0100 Subject: [PATCH] feat: enables 'edge' as a possible runtime for API routes --- .../react-18/switchable-runtime.md | 2 +- docs/api-reference/edge-runtime.md | 2 +- docs/api-routes/edge-api-routes.md | 10 ++++---- errors/edge-dynamic-code-evaluation.md | 2 +- errors/middleware-upgrade-guide.md | 2 +- examples/with-webassembly/pages/api/edge.js | 2 +- .../build/analysis/extract-const-value.ts | 2 +- .../build/analysis/get-page-static-info.ts | 25 +++++++++---------- packages/next/build/entries.ts | 6 ++--- packages/next/build/index.ts | 9 +++---- packages/next/build/utils.ts | 6 ++--- packages/next/build/webpack-config.ts | 5 ++-- .../loaders/next-edge-ssr-loader/render.ts | 2 +- .../webpack/plugins/flight-types-plugin.ts | 6 ++++- packages/next/lib/constants.ts | 3 ++- packages/next/server/base-server.ts | 5 ++-- packages/next/server/config-schema.ts | 3 ++- packages/next/server/config-shared.ts | 11 +++++++- packages/next/server/next-typescript.ts | 1 + packages/next/types/index.d.ts | 2 +- .../pages/api/dump-headers-edge.js | 2 +- test/e2e/app-dir/app/pages/api/hello.js | 2 +- .../app/pages/api/edge.js | 2 +- .../app/pages/api/index.js | 2 +- .../edge-async-local-storage/index.test.ts | 4 +-- .../e2e/edge-can-use-wasm-files/index.test.ts | 2 +- .../app/pages/api/edge.js | 2 +- .../app/pages/[id].js | 2 +- .../app/pages/index.js | 2 +- .../app/pages/api/edge-search-params.js | 2 +- .../app/pages/api/dump-headers-edge.js | 2 +- test/e2e/og-api/app/pages/api/og.js | 2 +- .../app/pages/api/test-cookie-edge.js | 2 +- .../streaming-ssr/pages/api/user/[id].js | 2 +- test/e2e/switchable-runtime/index.test.ts | 21 ++++++---------- test/e2e/switchable-runtime/pages/api/edge.js | 2 +- .../e2e/switchable-runtime/pages/api/hello.js | 2 +- .../pages/api/syntax-error-in-dev.js | 2 +- .../pages/api/route.js | 2 +- .../test/index.test.js | 14 +++++------ .../pages/api/route.js | 2 +- .../pages/api/route.js | 2 +- .../test/index.test.js | 18 ++++++------- .../pages/api/route.js | 2 +- .../pages/api/test.js | 3 ++- .../pages/api/route.js | 2 +- .../image-generation/app/pages/api/image.jsx | 2 +- test/integration/telemetry/pages/api/og.jsx | 2 +- .../index.test.ts | 2 +- 49 files changed, 112 insertions(+), 102 deletions(-) diff --git a/docs/advanced-features/react-18/switchable-runtime.md b/docs/advanced-features/react-18/switchable-runtime.md index cdd5268e825ddd..c23b30697a2d6b 100644 --- a/docs/advanced-features/react-18/switchable-runtime.md +++ b/docs/advanced-features/react-18/switchable-runtime.md @@ -63,7 +63,7 @@ For example, for API routes that rely on native Node.js APIs, they need to run w ```typescript export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default (req) => new Response('Hello world!') diff --git a/docs/api-reference/edge-runtime.md b/docs/api-reference/edge-runtime.md index 3471b5c0416728..0a2704132b84e4 100644 --- a/docs/api-reference/edge-runtime.md +++ b/docs/api-reference/edge-runtime.md @@ -144,7 +144,7 @@ You can relax the check to allow specific files with your Middleware or Edge API ```javascript export const config = { - runtime: 'experimental-edge', // for Edge API Routes only + runtime: 'edge', // for Edge API Routes only unstable_allowDynamic: [ '/lib/utilities.js', // allows a single file '/node_modules/function-bind/**', // use a glob to allow anything in the function-bind 3rd party module diff --git a/docs/api-routes/edge-api-routes.md b/docs/api-routes/edge-api-routes.md index ae9378b6f50606..872a6cead9f7d2 100644 --- a/docs/api-routes/edge-api-routes.md +++ b/docs/api-routes/edge-api-routes.md @@ -14,7 +14,7 @@ Any file inside the folder `pages/api` is mapped to `/api/*` and will be treated ```typescript export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default (req) => new Response('Hello world!') @@ -26,7 +26,7 @@ export default (req) => new Response('Hello world!') import type { NextRequest } from 'next/server' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default async function handler(req: NextRequest) { @@ -50,7 +50,7 @@ export default async function handler(req: NextRequest) { import type { NextRequest } from 'next/server' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default async function handler(req: NextRequest) { @@ -75,7 +75,7 @@ export default async function handler(req: NextRequest) { import type { NextRequest } from 'next/server' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default async function handler(req: NextRequest) { @@ -91,7 +91,7 @@ export default async function handler(req: NextRequest) { import { type NextRequest } from 'next/server' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default async function handler(req: NextRequest) { diff --git a/errors/edge-dynamic-code-evaluation.md b/errors/edge-dynamic-code-evaluation.md index 26a2de05ef172a..5003e10e445334 100644 --- a/errors/edge-dynamic-code-evaluation.md +++ b/errors/edge-dynamic-code-evaluation.md @@ -33,7 +33,7 @@ You can relax the check to allow specific files with your Middleware or Edge API ```typescript export const config = { - runtime: 'experimental-edge', // for Edge API Routes only + runtime: 'edge', // for Edge API Routes only unstable_allowDynamic: [ '/lib/utilities.js', // allows a single file '/node_modules/function-bind/**', // use a glob to allow anything in the function-bind 3rd party module diff --git a/errors/middleware-upgrade-guide.md b/errors/middleware-upgrade-guide.md index 6d10bf8472ee32..ca1508b0bb8a4d 100644 --- a/errors/middleware-upgrade-guide.md +++ b/errors/middleware-upgrade-guide.md @@ -175,7 +175,7 @@ If you were previously using Middleware to forward headers to an external API, y import { type NextRequest } from 'next/server' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default async function handler(req: NextRequest) { diff --git a/examples/with-webassembly/pages/api/edge.js b/examples/with-webassembly/pages/api/edge.js index f724fd32280f5e..425a9e87019a97 100644 --- a/examples/with-webassembly/pages/api/edge.js +++ b/examples/with-webassembly/pages/api/edge.js @@ -8,4 +8,4 @@ export default async function edgeExample() { return new Response(`got: ${number}`) } -export const config = { runtime: 'experimental-edge' } +export const config = { runtime: 'edge' } diff --git a/packages/next/build/analysis/extract-const-value.ts b/packages/next/build/analysis/extract-const-value.ts index 209f3e813ae1e2..0ae1d5fc7993ac 100644 --- a/packages/next/build/analysis/extract-const-value.ts +++ b/packages/next/build/analysis/extract-const-value.ts @@ -204,7 +204,7 @@ function extractValue(node: Node, path?: string[]): any { /** * Extracts the value of an exported const variable named `exportedName` - * (e.g. "export const config = { runtime: 'experimental-edge' }") from swc's AST. + * (e.g. "export const config = { runtime: 'edge' }") from swc's AST. * The value must be one of (or throws UnsupportedValueError): * - string * - boolean diff --git a/packages/next/build/analysis/get-page-static-info.ts b/packages/next/build/analysis/get-page-static-info.ts index 98a58a74077c0c..b4e7fce0f520b0 100644 --- a/packages/next/build/analysis/get-page-static-info.ts +++ b/packages/next/build/analysis/get-page-static-info.ts @@ -1,4 +1,4 @@ -import { isServerRuntime } from '../../server/config-shared' +import { isEdgeRuntime, isServerRuntime } from '../../server/config-shared' import type { NextConfig } from '../../server/config-shared' import type { Middleware, RouteHas } from '../../lib/load-custom-routes' import { @@ -229,13 +229,13 @@ function getMiddlewareConfig( return result } -let warnedAboutExperimentalEdgeApiFunctions = false -function warnAboutExperimentalEdgeApiFunctions() { - if (warnedAboutExperimentalEdgeApiFunctions) { +let warnedAboutExperimentalEdge = false +function warnAboutExperimentalEdge() { + if (warnedAboutExperimentalEdge) { return } Log.warn(`You are using an experimental edge runtime, the API might change.`) - warnedAboutExperimentalEdgeApiFunctions = true + warnedAboutExperimentalEdge = true } const warnedUnsupportedValueMap = new Map() @@ -326,15 +326,14 @@ export async function getPageStaticInfo(params: { const requiresServerRuntime = ssr || ssg || pageType === 'app' - resolvedRuntime = - SERVER_RUNTIME.edge === resolvedRuntime - ? SERVER_RUNTIME.edge - : requiresServerRuntime - ? resolvedRuntime || nextConfig.experimental?.runtime - : undefined + resolvedRuntime = isEdgeRuntime(resolvedRuntime) + ? resolvedRuntime + : requiresServerRuntime + ? resolvedRuntime || nextConfig.experimental?.runtime + : undefined - if (resolvedRuntime === SERVER_RUNTIME.edge) { - warnAboutExperimentalEdgeApiFunctions() + if (resolvedRuntime === SERVER_RUNTIME.experimentalEdge) { + warnAboutExperimentalEdge() } const middlewareConfig = getMiddlewareConfig( diff --git a/packages/next/build/entries.ts b/packages/next/build/entries.ts index ae00a6095ff4fe..8aafa19477a08e 100644 --- a/packages/next/build/entries.ts +++ b/packages/next/build/entries.ts @@ -16,7 +16,6 @@ import { PAGES_DIR_ALIAS, ROOT_DIR_ALIAS, APP_DIR_ALIAS, - SERVER_RUNTIME, WEBPACK_LAYERS, } from '../lib/constants' import { APP_CLIENT_INTERNALS, RSC_MODULE_TYPES } from '../shared/lib/constants' @@ -31,6 +30,7 @@ import { EDGE_RUNTIME_WEBPACK, } from '../shared/lib/constants' import { __ApiPreviewProps } from '../server/api-utils' +import { isEdgeRuntime } from '../server/config-shared' import { warn } from './output/log' import { isMiddlewareFile, @@ -258,7 +258,7 @@ export async function runDependingOnPageType(params: { return } if (params.page.match(API_ROUTE)) { - if (params.pageRuntime === SERVER_RUNTIME.edge) { + if (isEdgeRuntime(params.pageRuntime)) { await params.onEdgeServer() return } @@ -279,7 +279,7 @@ export async function runDependingOnPageType(params: { await Promise.all([params.onClient(), params.onServer()]) return } - if (params.pageRuntime === SERVER_RUNTIME.edge) { + if (isEdgeRuntime(params.pageRuntime)) { await Promise.all([params.onClient(), params.onEdgeServer()]) return } diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts index 6887cd2865b170..9770038a5c93b9 100644 --- a/packages/next/build/index.ts +++ b/packages/next/build/index.ts @@ -18,7 +18,6 @@ import { PUBLIC_DIR_MIDDLEWARE_CONFLICT, MIDDLEWARE_FILENAME, PAGES_DIR_ALIAS, - SERVER_RUNTIME, } from '../lib/constants' import { fileExists } from '../lib/file-exists' import { findPagesDir } from '../lib/find-pages-dir' @@ -107,7 +106,7 @@ import getBaseWebpackConfig from './webpack-config' import { PagesManifest } from './webpack/plugins/pages-manifest-plugin' import { writeBuildId } from './write-build-id' import { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path' -import { NextConfigComplete } from '../server/config-shared' +import { isEdgeRuntime, NextConfigComplete } from '../server/config-shared' import isError, { NextError } from '../lib/is-error' import { TelemetryPlugin } from './webpack/plugins/telemetry-plugin' import { MiddlewareManifest } from './webpack/plugins/middleware-plugin' @@ -1427,7 +1426,7 @@ export default async function build( try { let edgeInfo: any - if (pageRuntime === SERVER_RUNTIME.edge) { + if (isEdgeRuntime(pageRuntime)) { if (pageType === 'app') { edgeRuntimeAppCount++ } else { @@ -1466,7 +1465,7 @@ export default async function build( if (pageType === 'app' && originalAppPath) { appNormalizedPaths.set(originalAppPath, page) // TODO-APP: handle prerendering with edge - if (pageRuntime === 'experimental-edge') { + if (isEdgeRuntime(pageRuntime)) { isStatic = false isSsg = false } else { @@ -1504,7 +1503,7 @@ export default async function build( ) } } else { - if (pageRuntime === SERVER_RUNTIME.edge) { + if (isEdgeRuntime(pageRuntime)) { if (workerResult.hasStaticProps) { console.warn( `"getStaticProps" is not yet supported fully with "experimental-edge", detected on ${page}` diff --git a/packages/next/build/utils.ts b/packages/next/build/utils.ts index eb9670a638c640..8630e98d3aac54 100644 --- a/packages/next/build/utils.ts +++ b/packages/next/build/utils.ts @@ -20,7 +20,6 @@ import { SERVER_PROPS_GET_INIT_PROPS_CONFLICT, SERVER_PROPS_SSG_CONFLICT, MIDDLEWARE_FILENAME, - SERVER_RUNTIME, } from '../lib/constants' import { MODERN_BROWSERSLIST_TARGET } from '../shared/lib/constants' import prettyBytes from '../lib/pretty-bytes' @@ -28,6 +27,7 @@ import { getRouteRegex } from '../shared/lib/router/utils/route-regex' import { getRouteMatcher } from '../shared/lib/router/utils/route-matcher' import { isDynamicRoute } from '../shared/lib/router/utils/is-dynamic' import escapePathDelimiters from '../shared/lib/router/utils/escape-path-delimiters' +import { isEdgeRuntime } from '../server/config-shared' import { findPageFile } from '../server/lib/find-page-file' import { GetStaticPaths, PageConfig, ServerRuntime } from 'next/types' import { BuildManifest } from '../server/get-page-files' @@ -423,7 +423,7 @@ export async function printTreeView( ? '○' : pageInfo?.isSsg ? '●' - : pageInfo?.runtime === SERVER_RUNTIME.edge + : isEdgeRuntime(pageInfo?.runtime) ? 'ℇ' : 'λ' @@ -1267,7 +1267,7 @@ export async function isPageStatic({ let prerenderFallback: boolean | 'blocking' | undefined let appConfig: AppConfig = {} - if (pageRuntime === SERVER_RUNTIME.edge) { + if (isEdgeRuntime(pageRuntime)) { const runtime = await getRuntimeContext({ paths: edgeInfo.files.map((file: string) => path.join(distDir, file)), env: edgeInfo.env, diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index fac7fe4b5a787c..48c1c43706a905 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -10,7 +10,6 @@ import { PAGES_DIR_ALIAS, ROOT_DIR_ALIAS, APP_DIR_ALIAS, - SERVER_RUNTIME, WEBPACK_LAYERS, RSC_MOD_REF_PROXY_ALIAS, } from '../lib/constants' @@ -31,7 +30,7 @@ import { CompilerNameValues, } from '../shared/lib/constants' import { execOnce } from '../shared/lib/utils' -import { NextConfigComplete } from '../server/config-shared' +import { isEdgeRuntime, NextConfigComplete } from '../server/config-shared' import { finalizeEntrypoint } from './entries' import * as Log from './output/log' import { buildConfiguration } from './webpack/config' @@ -620,7 +619,7 @@ export default async function getBaseWebpackConfig( const disableOptimizedLoading = true if (isClient) { - if (config.experimental.runtime === SERVER_RUNTIME.edge) { + if (isEdgeRuntime(config.experimental.runtime)) { Log.warn( 'You are using the experimental Edge Runtime with `experimental.runtime`.' ) diff --git a/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts b/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts index 6eb8ffa3f09b6a..ff616c2f06af5b 100644 --- a/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts +++ b/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts @@ -72,7 +72,7 @@ export function getRender({ pagesType, extendRenderOpts: { buildId, - runtime: SERVER_RUNTIME.edge, + runtime: SERVER_RUNTIME.experimentalEdge, supportsDynamicHTML: true, disableOptimizedLoading: true, serverComponentManifest, diff --git a/packages/next/build/webpack/plugins/flight-types-plugin.ts b/packages/next/build/webpack/plugins/flight-types-plugin.ts index 9d92207b222ae5..f091fe443a0ee2 100644 --- a/packages/next/build/webpack/plugins/flight-types-plugin.ts +++ b/packages/next/build/webpack/plugins/flight-types-plugin.ts @@ -51,7 +51,11 @@ interface IEntry { dynamicParams?: boolean fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache' preferredRegion?: 'auto' | 'home' | 'edge' - ${options.type === 'page' ? "runtime?: 'nodejs' | 'experimental-edge'" : ''} + ${ + options.type === 'page' + ? "runtime?: 'nodejs' | 'experimental-edge' | 'edge'" + : '' + } } // ============= diff --git a/packages/next/lib/constants.ts b/packages/next/lib/constants.ts index ef1d10b1033945..58ca3f47b5331e 100644 --- a/packages/next/lib/constants.ts +++ b/packages/next/lib/constants.ts @@ -65,7 +65,8 @@ export const ESLINT_PROMPT_VALUES = [ ] export const SERVER_RUNTIME: Record = { - edge: 'experimental-edge', + edge: 'edge', + experimentalEdge: 'experimental-edge', nodejs: 'nodejs', } diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 3cf525acb8e554..8ccf27dd48d5e2 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -8,6 +8,7 @@ import type { RouteMatch } from '../shared/lib/router/utils/route-matcher' import type { MiddlewareRouteMatch } from '../shared/lib/router/utils/middleware-route-matcher' import type { Params } from '../shared/lib/router/utils/route-matcher' import type { NextConfig, NextConfigComplete } from './config-shared' +import { isEdgeRuntime } from './config-shared' import type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta' import type { ParsedUrlQuery } from 'querystring' import type { RenderOpts, RenderOptsPartial } from './render' @@ -1080,7 +1081,7 @@ export default abstract class Server { } // strip header so we generate HTML still if ( - opts.runtime !== 'experimental-edge' || + !isEdgeRuntime(opts.runtime) || (this.serverOptions as any).webServerConfig ) { for (const param of FLIGHT_PARAMETERS) { @@ -1293,7 +1294,7 @@ export default abstract class Server { }) if ( this.nextConfig.experimental.fetchCache && - (opts.runtime !== 'experimental-edge' || + (!isEdgeRuntime(opts.runtime) || (this.serverOptions as any).webServerConfig) ) { delete req.headers[FETCH_CACHE_HEADER] diff --git a/packages/next/server/config-schema.ts b/packages/next/server/config-schema.ts index ba1128cf18b3a6..d4e981a4856fd7 100644 --- a/packages/next/server/config-schema.ts +++ b/packages/next/server/config-schema.ts @@ -1,6 +1,7 @@ import { NextConfig } from './config' import type { JSONSchemaType } from 'ajv' import { VALID_LOADERS } from '../shared/lib/image-config' +import { SERVER_RUNTIME } from '../lib/constants' const configSchema = { type: 'object', @@ -353,7 +354,7 @@ const configSchema = { }, runtime: { // automatic typing doesn't like enum - enum: ['experimental-edge', 'nodejs'] as any, + enum: Object.values(SERVER_RUNTIME) as any, type: 'string', }, serverComponentsExternalPackages: { diff --git a/packages/next/server/config-shared.ts b/packages/next/server/config-shared.ts index 0a56331d28ceb4..c49f1ff7aab386 100644 --- a/packages/next/server/config-shared.ts +++ b/packages/next/server/config-shared.ts @@ -9,6 +9,7 @@ import { import { ServerRuntime } from 'next/types' import { SubresourceIntegrityAlgorithm } from '../build/webpack/plugins/subresource-integrity-plugin' import { WEB_VITALS } from '../shared/lib/utils' +import { SERVER_RUNTIME } from '../lib/constants' export type NextConfigComplete = Required & { images: Required @@ -623,9 +624,17 @@ export async function normalizeConfig(phase: string, config: any) { return await config } +export function isEdgeRuntime(value?: string): value is ServerRuntime { + return ( + value === SERVER_RUNTIME.experimentalEdge || value === SERVER_RUNTIME.edge + ) +} + export function isServerRuntime(value?: string): value is ServerRuntime { return ( - value === undefined || value === 'nodejs' || value === 'experimental-edge' + value === undefined || + value === SERVER_RUNTIME.nodejs || + isEdgeRuntime(value) ) } diff --git a/packages/next/server/next-typescript.ts b/packages/next/server/next-typescript.ts index 011a07867730e6..1496c72fc0a021 100644 --- a/packages/next/server/next-typescript.ts +++ b/packages/next/server/next-typescript.ts @@ -132,6 +132,7 @@ const API_DOCS: Record< 'The `runtime` option controls the preferred runtime to render this route.', options: { '"nodejs"': 'Prefer the Node.js runtime.', + '"edge"': 'Prefer the Edge runtime.', '"experimental-edge"': 'Prefer the experimental Edge runtime.', }, link: 'https://beta.nextjs.org/docs/api-reference/segment-config#runtime', diff --git a/packages/next/types/index.d.ts b/packages/next/types/index.d.ts index f1186464bb04d9..6d1f9d4411a45b 100644 --- a/packages/next/types/index.d.ts +++ b/packages/next/types/index.d.ts @@ -23,7 +23,7 @@ import { // @ts-ignore This path is generated at build time and conflicts otherwise import next from '../dist/server/next' -export type ServerRuntime = 'nodejs' | 'experimental-edge' | undefined +export type ServerRuntime = 'nodejs' | 'experimental-edge' | 'edge' | undefined // @ts-ignore This path is generated at build time and conflicts otherwise export { NextConfig } from '../dist/server/config' diff --git a/test/e2e/app-dir/app-middleware/pages/api/dump-headers-edge.js b/test/e2e/app-dir/app-middleware/pages/api/dump-headers-edge.js index 0ece8ea2c75187..05396dccbb6a96 100644 --- a/test/e2e/app-dir/app-middleware/pages/api/dump-headers-edge.js +++ b/test/e2e/app-dir/app-middleware/pages/api/dump-headers-edge.js @@ -1,5 +1,5 @@ export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default (req) => { diff --git a/test/e2e/app-dir/app/pages/api/hello.js b/test/e2e/app-dir/app/pages/api/hello.js index 47779ec1fa09fc..81adbb05f10245 100644 --- a/test/e2e/app-dir/app/pages/api/hello.js +++ b/test/e2e/app-dir/app/pages/api/hello.js @@ -3,5 +3,5 @@ export default function api(req) { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/edge.js b/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/edge.js index 26bcb1402fe01d..306d20a7e28250 100644 --- a/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/edge.js +++ b/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/edge.js @@ -7,5 +7,5 @@ export default async (req) => { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/index.js b/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/index.js index 26bcb1402fe01d..306d20a7e28250 100644 --- a/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/index.js +++ b/test/e2e/edge-api-endpoints-can-receive-body/app/pages/api/index.js @@ -7,5 +7,5 @@ export default async (req) => { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/e2e/edge-async-local-storage/index.test.ts b/test/e2e/edge-async-local-storage/index.test.ts index 39c2798f182246..cb38bfa3c72e15 100644 --- a/test/e2e/edge-async-local-storage/index.test.ts +++ b/test/e2e/edge-async-local-storage/index.test.ts @@ -10,7 +10,7 @@ describe('edge api can use async local storage', () => { { title: 'a single instance', code: ` - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } const storage = new AsyncLocalStorage() export default async function handler(request) { @@ -36,7 +36,7 @@ describe('edge api can use async local storage', () => { { title: 'multiple instances', code: ` - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } const topStorage = new AsyncLocalStorage() export default async function handler(request) { diff --git a/test/e2e/edge-can-use-wasm-files/index.test.ts b/test/e2e/edge-can-use-wasm-files/index.test.ts index 48050bc0c584b5..42f8232552c232 100644 --- a/test/e2e/edge-can-use-wasm-files/index.test.ts +++ b/test/e2e/edge-can-use-wasm-files/index.test.ts @@ -49,7 +49,7 @@ describe('edge api endpoints can use wasm files', () => { const value = await increment(input); return new Response(null, { headers: { data: JSON.stringify({ input, value }) } }); } - export const config = { runtime: 'experimental-edge' }; + export const config = { runtime: 'edge' }; `, 'src/add.wasm': new FileRef(path.join(__dirname, './add.wasm')), 'src/add.js': ` diff --git a/test/e2e/edge-compiler-can-import-blob-assets/app/pages/api/edge.js b/test/e2e/edge-compiler-can-import-blob-assets/app/pages/api/edge.js index 49da52df583bda..7d3dc54e193a0d 100644 --- a/test/e2e/edge-compiler-can-import-blob-assets/app/pages/api/edge.js +++ b/test/e2e/edge-compiler-can-import-blob-assets/app/pages/api/edge.js @@ -1,4 +1,4 @@ -export const config = { runtime: 'experimental-edge' } +export const config = { runtime: 'edge' } /** * @param {import('next/server').NextRequest} req diff --git a/test/e2e/edge-render-getserversideprops/app/pages/[id].js b/test/e2e/edge-render-getserversideprops/app/pages/[id].js index 5d17ce2cb291cd..71fc6cefe831fd 100644 --- a/test/e2e/edge-render-getserversideprops/app/pages/[id].js +++ b/test/e2e/edge-render-getserversideprops/app/pages/[id].js @@ -1,5 +1,5 @@ export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default function Page(props) { diff --git a/test/e2e/edge-render-getserversideprops/app/pages/index.js b/test/e2e/edge-render-getserversideprops/app/pages/index.js index c2380c49ccd0ff..2f77a5b59b306e 100644 --- a/test/e2e/edge-render-getserversideprops/app/pages/index.js +++ b/test/e2e/edge-render-getserversideprops/app/pages/index.js @@ -1,5 +1,5 @@ export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default function Page(props) { diff --git a/test/e2e/middleware-general/app/pages/api/edge-search-params.js b/test/e2e/middleware-general/app/pages/api/edge-search-params.js index 01a968ee9d8062..9b8cf7cd547ef2 100644 --- a/test/e2e/middleware-general/app/pages/api/edge-search-params.js +++ b/test/e2e/middleware-general/app/pages/api/edge-search-params.js @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' -export const config = { runtime: 'experimental-edge', regions: 'default' } +export const config = { runtime: 'edge', regions: 'default' } /** * @param {import('next/server').NextRequest} diff --git a/test/e2e/middleware-request-header-overrides/app/pages/api/dump-headers-edge.js b/test/e2e/middleware-request-header-overrides/app/pages/api/dump-headers-edge.js index 0ece8ea2c75187..05396dccbb6a96 100644 --- a/test/e2e/middleware-request-header-overrides/app/pages/api/dump-headers-edge.js +++ b/test/e2e/middleware-request-header-overrides/app/pages/api/dump-headers-edge.js @@ -1,5 +1,5 @@ export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default (req) => { diff --git a/test/e2e/og-api/app/pages/api/og.js b/test/e2e/og-api/app/pages/api/og.js index 1afb24a1129209..7d744957fc307d 100644 --- a/test/e2e/og-api/app/pages/api/og.js +++ b/test/e2e/og-api/app/pages/api/og.js @@ -2,7 +2,7 @@ import { ImageResponse } from '@vercel/og' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default function () { diff --git a/test/e2e/skip-trailing-slash-redirect/app/pages/api/test-cookie-edge.js b/test/e2e/skip-trailing-slash-redirect/app/pages/api/test-cookie-edge.js index 6018a223708fd1..212da9b3231a1e 100644 --- a/test/e2e/skip-trailing-slash-redirect/app/pages/api/test-cookie-edge.js +++ b/test/e2e/skip-trailing-slash-redirect/app/pages/api/test-cookie-edge.js @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default function handler(req) { diff --git a/test/e2e/streaming-ssr/streaming-ssr/pages/api/user/[id].js b/test/e2e/streaming-ssr/streaming-ssr/pages/api/user/[id].js index c5649d2074e499..67d2491a96f9fc 100644 --- a/test/e2e/streaming-ssr/streaming-ssr/pages/api/user/[id].js +++ b/test/e2e/streaming-ssr/streaming-ssr/pages/api/user/[id].js @@ -3,5 +3,5 @@ export default async function handler() { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/e2e/switchable-runtime/index.test.ts b/test/e2e/switchable-runtime/index.test.ts index 07b3a0f58d5f3a..90569496b63930 100644 --- a/test/e2e/switchable-runtime/index.test.ts +++ b/test/e2e/switchable-runtime/index.test.ts @@ -45,15 +45,10 @@ describe('Switchable runtime', () => { beforeAll(async () => { next = await createNext({ - files: { - app: new FileRef(join(__dirname, './app')), - pages: new FileRef(join(__dirname, './pages')), - utils: new FileRef(join(__dirname, './utils')), - 'next.config.js': new FileRef(join(__dirname, './next.config.js')), - }, + files: new FileRef(__dirname), dependencies: { - react: 'experimental', - 'react-dom': 'experimental', + react: 'latest', + 'react-dom': 'latest', }, }) context = { @@ -229,7 +224,7 @@ describe('Switchable runtime', () => { 'pages/api/switch-in-dev.js', ` export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default () => new Response('edge response') @@ -259,7 +254,7 @@ describe('Switchable runtime', () => { 'pages/api/switch-in-dev.js', ` export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default () => new Response('edge response again') @@ -340,7 +335,7 @@ describe('Switchable runtime', () => { 'pages/api/switch-in-dev-same-content.js', ` export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default () => new Response('edge response') @@ -373,7 +368,7 @@ describe('Switchable runtime', () => { 'pages/api/syntax-error-in-dev.js', ` export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } export default => new Response('edge response') @@ -391,7 +386,7 @@ describe('Switchable runtime', () => { export default () => new Response('edge response again') export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } ` diff --git a/test/e2e/switchable-runtime/pages/api/edge.js b/test/e2e/switchable-runtime/pages/api/edge.js index d375a24aaab748..806920e75dfeb1 100644 --- a/test/e2e/switchable-runtime/pages/api/edge.js +++ b/test/e2e/switchable-runtime/pages/api/edge.js @@ -3,5 +3,5 @@ export default (req) => { } export const config = { - runtime: `experimental-edge`, + runtime: `edge`, } diff --git a/test/e2e/switchable-runtime/pages/api/hello.js b/test/e2e/switchable-runtime/pages/api/hello.js index 7f27052a3fbc20..c8e368a7530a0f 100644 --- a/test/e2e/switchable-runtime/pages/api/hello.js +++ b/test/e2e/switchable-runtime/pages/api/hello.js @@ -3,5 +3,5 @@ export default (req) => { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } 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 index 3b7243a1205ef1..9e13e2a85e3951 100644 --- a/test/e2e/switchable-runtime/pages/api/syntax-error-in-dev.js +++ b/test/e2e/switchable-runtime/pages/api/syntax-error-in-dev.js @@ -1,5 +1,5 @@ export default () => new Response('edge response') export const config = { - runtime: `experimental-edge`, + runtime: `edge`, } diff --git a/test/integration/edge-runtime-configurable-guards/pages/api/route.js b/test/integration/edge-runtime-configurable-guards/pages/api/route.js index 9d808b1a2bb680..8bb7f51f3b5009 100644 --- a/test/integration/edge-runtime-configurable-guards/pages/api/route.js +++ b/test/integration/edge-runtime-configurable-guards/pages/api/route.js @@ -4,5 +4,5 @@ export default () => { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/integration/edge-runtime-configurable-guards/test/index.test.js b/test/integration/edge-runtime-configurable-guards/test/index.test.js index c55c813b4a8f0f..ae0144346d42ef 100644 --- a/test/integration/edge-runtime-configurable-guards/test/index.test.js +++ b/test/integration/edge-runtime-configurable-guards/test/index.test.js @@ -72,7 +72,7 @@ describe('Edge runtime configurable guards', () => { return Response.json({ result: true }) } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', unstable_allowDynamic: '/lib/**' } `) @@ -125,7 +125,7 @@ describe('Edge runtime configurable guards', () => { return Response.json({ result: true }) } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', unstable_allowDynamic: '**' } `) @@ -159,7 +159,7 @@ describe('Edge runtime configurable guards', () => { return Response.json({ result: true }) } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', unstable_allowDynamic: '/lib/**' } `) @@ -221,7 +221,7 @@ describe('Edge runtime configurable guards', () => { return Response.json({ result: true }) } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', unstable_allowDynamic: '**' } `) @@ -257,7 +257,7 @@ describe('Edge runtime configurable guards', () => { return Response.json({ result: true }) } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', unstable_allowDynamic: '/lib/**' } `) @@ -328,7 +328,7 @@ describe('Edge runtime configurable guards', () => { return Response.json({ result: true }) } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', unstable_allowDynamic: '/pages/**' } `) @@ -397,7 +397,7 @@ describe('Edge runtime configurable guards', () => { export default async function handler(request) { return Response.json({ result: (() => {}) instanceof Function }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, diff --git a/test/integration/edge-runtime-dynamic-code/pages/api/route.js b/test/integration/edge-runtime-dynamic-code/pages/api/route.js index 1d73702aec6030..f0d136912e5798 100644 --- a/test/integration/edge-runtime-dynamic-code/pages/api/route.js +++ b/test/integration/edge-runtime-dynamic-code/pages/api/route.js @@ -23,4 +23,4 @@ export default async function handler(request) { ) } -export const config = { runtime: 'experimental-edge' } +export const config = { runtime: 'edge' } diff --git a/test/integration/edge-runtime-module-errors/pages/api/route.js b/test/integration/edge-runtime-module-errors/pages/api/route.js index d93a0ca4a9badf..62ba98a1ceb49e 100644 --- a/test/integration/edge-runtime-module-errors/pages/api/route.js +++ b/test/integration/edge-runtime-module-errors/pages/api/route.js @@ -2,4 +2,4 @@ export default async function handler(request) { return Response.json({ ok: true }) } -export const config = { runtime: 'experimental-edge' } +export const config = { runtime: 'edge' } diff --git a/test/integration/edge-runtime-module-errors/test/index.test.js b/test/integration/edge-runtime-module-errors/test/index.test.js index 2906fe6ce0a3de..242e9dc934fa7a 100644 --- a/test/integration/edge-runtime-module-errors/test/index.test.js +++ b/test/integration/edge-runtime-module-errors/test/index.test.js @@ -68,7 +68,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: basename() }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -129,7 +129,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: writeFile() }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -188,7 +188,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: await throwAsync() }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -267,7 +267,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: true }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -325,7 +325,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: true }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -384,7 +384,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: true }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -445,7 +445,7 @@ describe('Edge runtime code with imports', () => { return Response.json({ ok: true }) } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -503,7 +503,7 @@ describe('Edge runtime code with imports', () => { return response } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, @@ -564,7 +564,7 @@ describe('Edge runtime code with imports', () => { return response } - export const config = { runtime: 'experimental-edge' } + export const config = { runtime: 'edge' } `) }, }, diff --git a/test/integration/edge-runtime-response-error/pages/api/route.js b/test/integration/edge-runtime-response-error/pages/api/route.js index a1ff06c9a8fc60..6ecf1ee385d91f 100644 --- a/test/integration/edge-runtime-response-error/pages/api/route.js +++ b/test/integration/edge-runtime-response-error/pages/api/route.js @@ -2,4 +2,4 @@ export default async function handler(request) { return 'Boom' } -export const config = { runtime: 'experimental-edge' } +export const config = { runtime: 'edge' } diff --git a/test/integration/edge-runtime-streaming-error/pages/api/test.js b/test/integration/edge-runtime-streaming-error/pages/api/test.js index b5d485fcd223ad..027f27fe080c93 100644 --- a/test/integration/edge-runtime-streaming-error/pages/api/test.js +++ b/test/integration/edge-runtime-streaming-error/pages/api/test.js @@ -1,6 +1,7 @@ export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } + export default function () { return new Response( new ReadableStream({ diff --git a/test/integration/edge-runtime-with-node.js-apis/pages/api/route.js b/test/integration/edge-runtime-with-node.js-apis/pages/api/route.js index 8c38026256157c..910521218d8f69 100644 --- a/test/integration/edge-runtime-with-node.js-apis/pages/api/route.js +++ b/test/integration/edge-runtime-with-node.js-apis/pages/api/route.js @@ -5,4 +5,4 @@ export default async function handler(request) { return Response.json({ ok: true }) } -export const config = { runtime: 'experimental-edge' } +export const config = { runtime: 'edge' } diff --git a/test/integration/image-generation/app/pages/api/image.jsx b/test/integration/image-generation/app/pages/api/image.jsx index 518c3d654e00dc..a15b0cc50f16da 100644 --- a/test/integration/image-generation/app/pages/api/image.jsx +++ b/test/integration/image-generation/app/pages/api/image.jsx @@ -5,5 +5,5 @@ export default async () => { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/integration/telemetry/pages/api/og.jsx b/test/integration/telemetry/pages/api/og.jsx index 518c3d654e00dc..a15b0cc50f16da 100644 --- a/test/integration/telemetry/pages/api/og.jsx +++ b/test/integration/telemetry/pages/api/og.jsx @@ -5,5 +5,5 @@ export default async () => { } export const config = { - runtime: 'experimental-edge', + runtime: 'edge', } diff --git a/test/production/generate-middleware-source-maps/index.test.ts b/test/production/generate-middleware-source-maps/index.test.ts index 9e8ac97a80a692..b869e80e17bd3e 100644 --- a/test/production/generate-middleware-source-maps/index.test.ts +++ b/test/production/generate-middleware-source-maps/index.test.ts @@ -13,7 +13,7 @@ describe('Middleware source maps', () => { export default function () { return
Hello, world!
} `, 'pages/api/edge.js': ` - export const config = { runtime: 'experimental-edge' }; + export const config = { runtime: 'edge' }; export default function (req) { return new Response("Hello from " + req.url); }