Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[edge] serialize custom config to middleware-manifest #40881

Merged
merged 11 commits into from Sep 27, 2022
7 changes: 6 additions & 1 deletion packages/next/build/analysis/get-page-static-info.ts
Expand Up @@ -18,6 +18,7 @@ import { RSC_MODULE_TYPES } from '../../shared/lib/constants'
export interface MiddlewareConfig {
matchers: MiddlewareMatcher[]
unstable_allowDynamicGlobs: string[]
regions: string[] | string
}

export interface MiddlewareMatcher {
Expand Down Expand Up @@ -184,6 +185,10 @@ function getMiddlewareConfig(
result.matchers = getMiddlewareMatchers(config.matcher, nextConfig)
}

if (typeof config.regions === 'string' || Array.isArray(config.regions)) {
result.regions = config.regions
}
ijjk marked this conversation as resolved.
Show resolved Hide resolved

if (config.unstable_allowDynamic) {
result.unstable_allowDynamicGlobs = Array.isArray(
config.unstable_allowDynamic
Expand Down Expand Up @@ -256,7 +261,7 @@ export async function getPageStaticInfo(params: {

const fileContent = (await tryToReadFile(pageFilePath, !isDev)) || ''
if (
/runtime|getStaticProps|getServerSideProps|matcher|unstable_allowDynamic/.test(
/runtime|getStaticProps|getServerSideProps|export const config/.test(
fileContent
)
) {
Expand Down
15 changes: 15 additions & 0 deletions packages/next/build/webpack/plugins/middleware-plugin.ts
Expand Up @@ -36,6 +36,7 @@ export interface EdgeFunctionDefinition {
matchers: MiddlewareMatcher[]
wasm?: AssetBinding[]
assets?: AssetBinding[]
regions?: string[] | string
}

export interface MiddlewareManifest {
Expand All @@ -52,6 +53,7 @@ interface EntryMetadata {
env: Set<string>
wasmBindings: Map<string, string>
assetBindings: Map<string, string>
regions?: string[] | string
}

const NAME = 'MiddlewarePlugin'
Expand Down Expand Up @@ -178,6 +180,7 @@ function getCreateAssets(params: {
name,
filePath,
})),
...(metadata.regions && { regions: metadata.regions }),
}

if (metadata.edgeApiFunction || metadata.edgeSSR) {
Expand Down Expand Up @@ -737,6 +740,18 @@ function getExtractMetadata(params: {
}
}

if (edgeFunctionConfig?.config?.regions) {
telemetry.record({
eventName: 'NEXT_EDGE_REGIONS_USED',
payload: {
...edgeFunctionConfig,
file: edgeFunctionConfig.file.replace(rootDir ?? '', ''),
},
})

entryMetadata.regions = edgeFunctionConfig.config.regions
}

/**
* The entry module has to be either a page or a middleware and hold
* the corresponding metadata.
Expand Down
2 changes: 2 additions & 0 deletions test/e2e/middleware-general/app/middleware.js
Expand Up @@ -2,6 +2,8 @@
import { NextRequest, NextResponse, URLPattern } from 'next/server'
import magicValue from 'shared-package'

export const config = { regions: 'auto' }

const PATTERNS = [
[
new URLPattern({ pathname: '/:locale/:id' }),
Expand Down
@@ -1,6 +1,6 @@
import { NextResponse } from 'next/server'

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

/**
* @param {import('next/server').NextRequest}
Expand Down
12 changes: 12 additions & 0 deletions test/e2e/middleware-general/test/index.test.ts
Expand Up @@ -125,10 +125,22 @@ describe('Middleware Runtime', () => {
matchers: [{ regexp: '^/.*$' }],
wasm: [],
assets: [],
regions: 'auto',
},
})
})

it('should have the custom config in the manifest', async () => {
const manifest = await fs.readJSON(
join(next.testDir, '.next/server/middleware-manifest.json')
)

expect(manifest.functions['/api/edge-search-params']).toHaveProperty(
'regions',
'default'
)
})

it('should have correct files in manifest', async () => {
const manifest = await fs.readJSON(
join(next.testDir, '.next/server/middleware-manifest.json')
Expand Down