Skip to content

Commit ef37f11

Browse files
committed
refactor: separate build-time and run-time concerns for adapter
1 parent efe9901 commit ef37f11

File tree

10 files changed

+39
-32
lines changed

10 files changed

+39
-32
lines changed

src/adapter/adapter.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ import { dirname } from 'node:path'
33

44
import type { NextAdapter } from 'next-with-adapters'
55

6-
import { NETLIFY_FRAMEWORKS_API_CONFIG_PATH } from './constants.js'
7-
import { onBuildComplete as onBuildCompleteForHeaders } from './header.js'
6+
import { NETLIFY_FRAMEWORKS_API_CONFIG_PATH } from './build/constants.js'
7+
import { onBuildComplete as onBuildCompleteForHeaders } from './build/header.js'
88
import {
99
modifyConfig as modifyConfigForImageCDN,
1010
onBuildComplete as onBuildCompleteForImageCDN,
11-
} from './image-cdn.js'
12-
import { onBuildComplete as onBuildCompleteForMiddleware } from './middleware.js'
13-
import { onBuildComplete as onBuildCompleteForPagesAndAppHandlers } from './pages-and-app-handlers.js'
14-
import { onBuildComplete as onBuildCompleteForStaticAssets } from './static-assets.js'
15-
import { FrameworksAPIConfig } from './types.js'
11+
} from './build/image-cdn.js'
12+
import { onBuildComplete as onBuildCompleteForMiddleware } from './build/middleware.js'
13+
import { onBuildComplete as onBuildCompleteForPagesAndAppHandlers } from './build/pages-and-app-handlers.js'
14+
import { onBuildComplete as onBuildCompleteForStaticAssets } from './build/static-assets.js'
15+
import { NETLIFY_FRAMEWORKS_API_CONFIG_PATH } from './build/constants.js'
16+
import { FrameworksAPIConfig } from './build/types.js'
1617

1718
const adapter: NextAdapter = {
1819
name: 'Netlify',

src/adapter/constants.ts renamed to src/adapter/build/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { join } from 'node:path'
33
import { fileURLToPath } from 'node:url'
44

55
const MODULE_DIR = fileURLToPath(new URL('.', import.meta.url))
6-
export const PLUGIN_DIR = join(MODULE_DIR, '../..')
6+
export const PLUGIN_DIR = join(MODULE_DIR, '../../..')
77

88
const packageJSON = JSON.parse(readFileSync(join(PLUGIN_DIR, 'package.json'), 'utf-8'))
99

src/adapter/header.ts renamed to src/adapter/build/header.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import type { FrameworksAPIConfig, OnBuildCompleteContext } from './types.js'
22

33
export function onBuildComplete(
4-
ctx: OnBuildCompleteContext,
4+
nextAdapterContext: OnBuildCompleteContext,
55
frameworksAPIConfigArg: FrameworksAPIConfig,
66
) {
77
const frameworksAPIConfig: FrameworksAPIConfig = frameworksAPIConfigArg ?? {}
88

99
frameworksAPIConfig.headers ??= []
1010

1111
frameworksAPIConfig.headers.push({
12-
for: `${ctx.config.basePath}/_next/static/*`,
12+
for: `${nextAdapterContext.config.basePath}/_next/static/*`,
1313
values: {
1414
'Cache-Control': 'public, max-age=31536000, immutable',
1515
},

src/adapter/image-cdn.ts renamed to src/adapter/build/image-cdn.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import { makeRe } from 'picomatch'
55

66
import type { FrameworksAPIConfig, NextConfigComplete, OnBuildCompleteContext } from './types.js'
77

8-
const NETLIFY_IMAGE_LOADER_FILE = fileURLToPath(import.meta.resolve(`./next-image-loader.cjs`))
8+
const NETLIFY_IMAGE_LOADER_FILE = fileURLToPath(
9+
import.meta.resolve(`./image-cdn-next-image-loader.cjs`),
10+
)
911

1012
export function modifyConfig(config: NextConfigComplete) {
1113
if (config.images.loader === 'default') {
@@ -21,7 +23,7 @@ function generateRegexFromPattern(pattern: string): string {
2123
}
2224

2325
export function onBuildComplete(
24-
ctx: OnBuildCompleteContext,
26+
nextAdapterContext: OnBuildCompleteContext,
2527
frameworksAPIConfigArg: FrameworksAPIConfig,
2628
) {
2729
const frameworksAPIConfig: FrameworksAPIConfig = frameworksAPIConfigArg ?? {}
@@ -38,7 +40,7 @@ export function onBuildComplete(
3840
status: 200,
3941
})
4042

41-
const { images } = ctx.config
43+
const { images } = nextAdapterContext.config
4244
if (images.loader === 'custom' && images.loaderFile === NETLIFY_IMAGE_LOADER_FILE) {
4345
const { remotePatterns, domains } = images
4446
// if Netlify image loader is used, configure allowed remote image sources

src/adapter/middleware.ts renamed to src/adapter/build/middleware.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ const MIDDLEWARE_FUNCTION_DIR = join(
2020
)
2121

2222
export async function onBuildComplete(
23-
ctx: OnBuildCompleteContext,
23+
nextAdapterContext: OnBuildCompleteContext,
2424
frameworksAPIConfigArg: FrameworksAPIConfig,
2525
) {
2626
const frameworksAPIConfig: FrameworksAPIConfig = frameworksAPIConfigArg ?? {}
2727

28-
const { middleware } = ctx.outputs
28+
const { middleware } = nextAdapterContext.outputs
2929
if (!middleware) {
3030
return frameworksAPIConfig
3131
}
@@ -34,10 +34,10 @@ export async function onBuildComplete(
3434
await copyHandlerDependenciesForEdgeMiddleware(middleware)
3535
} else if (middleware.runtime === 'nodejs') {
3636
// return frameworksAPIConfig
37-
await copyHandlerDependenciesForNodeMiddleware(middleware, ctx.repoRoot)
37+
await copyHandlerDependenciesForNodeMiddleware(middleware, nextAdapterContext.repoRoot)
3838
}
3939

40-
await writeHandlerFile(middleware, ctx.config)
40+
await writeHandlerFile(middleware, nextAdapterContext.config)
4141

4242
return frameworksAPIConfig
4343
}

src/adapter/pages-and-app-handlers.ts renamed to src/adapter/build/pages-and-app-handlers.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const PAGES_AND_APP_FUNCTION_DIR = join(
2121
)
2222

2323
export async function onBuildComplete(
24-
ctx: OnBuildCompleteContext,
24+
nextAdapterContext: OnBuildCompleteContext,
2525
frameworksAPIConfigArg: FrameworksAPIConfig,
2626
) {
2727
const frameworksAPIConfig: FrameworksAPIConfig = frameworksAPIConfigArg ?? {}
@@ -30,10 +30,10 @@ export async function onBuildComplete(
3030
const pathnameToEntry: Record<string, string> = {}
3131

3232
for (const outputs of [
33-
ctx.outputs.pages,
34-
ctx.outputs.pagesApi,
35-
ctx.outputs.appPages,
36-
ctx.outputs.appRoutes,
33+
nextAdapterContext.outputs.pages,
34+
nextAdapterContext.outputs.pagesApi,
35+
nextAdapterContext.outputs.appPages,
36+
nextAdapterContext.outputs.appRoutes,
3737
]) {
3838
if (outputs) {
3939
for (const output of outputs) {
@@ -46,17 +46,21 @@ export async function onBuildComplete(
4646
}
4747

4848
requiredFiles.add(output.filePath)
49-
pathnameToEntry[output.pathname] = relative(ctx.repoRoot, output.filePath)
49+
pathnameToEntry[output.pathname] = relative(nextAdapterContext.repoRoot, output.filePath)
5050
}
5151
}
5252
}
5353

5454
await mkdir(PAGES_AND_APP_FUNCTION_DIR, { recursive: true })
5555

5656
for (const filePath of requiredFiles) {
57-
await cp(filePath, join(PAGES_AND_APP_FUNCTION_DIR, relative(ctx.repoRoot, filePath)), {
58-
recursive: true,
59-
})
57+
await cp(
58+
filePath,
59+
join(PAGES_AND_APP_FUNCTION_DIR, relative(nextAdapterContext.repoRoot, filePath)),
60+
{
61+
recursive: true,
62+
},
63+
)
6064
}
6165

6266
// copy needed runtime files
@@ -67,7 +71,7 @@ export async function onBuildComplete(
6771
const entrypoint = /* javascript */ `
6872
import { AsyncLocalStorage } from 'node:async_hooks'
6973
import { createRequire } from 'node:module'
70-
import { runNextHandler } from './${RUNTIME_DIR}/dist/adapter/adapter-handler.js'
74+
import { runNextHandler } from './${RUNTIME_DIR}/dist/adapter/run/pages-and-app-handler.js'
7175
7276
globalThis.AsyncLocalStorage = AsyncLocalStorage
7377

src/adapter/static-assets.ts renamed to src/adapter/build/static-assets.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ import { NEXT_RUNTIME_STATIC_ASSETS } from './constants.js'
66
import type { FrameworksAPIConfig, OnBuildCompleteContext } from './types.js'
77

88
export async function onBuildComplete(
9-
ctx: OnBuildCompleteContext,
9+
nextAdapterContext: OnBuildCompleteContext,
1010
frameworksAPIConfigArg: FrameworksAPIConfig,
1111
) {
1212
const frameworksAPIConfig: FrameworksAPIConfig = frameworksAPIConfigArg ?? {}
1313

14-
for (const staticFile of ctx.outputs.staticFiles) {
14+
for (const staticFile of nextAdapterContext.outputs.staticFiles) {
1515
try {
1616
let distPathname = staticFile.pathname
1717
if (extname(distPathname) === '' && extname(staticFile.filePath) === '.html') {
1818
// if it's fully static page, we need to also create empty _next/data JSON file
1919
// on Vercel this is done in routing layer, but we can't express that routing right now on Netlify
20-
const buildID = await readFile(join(ctx.distDir, 'BUILD_ID'), 'utf-8')
20+
const buildID = await readFile(join(nextAdapterContext.distDir, 'BUILD_ID'), 'utf-8')
2121
const dataFilePath = join(
2222
NEXT_RUNTIME_STATIC_ASSETS,
2323
'_next',
@@ -31,9 +31,9 @@ export async function onBuildComplete(
3131

3232
// FEEDBACK: should this be applied in Next.js before passing to context to adapters?
3333
if (distPathname !== '/') {
34-
if (ctx.config.trailingSlash && !distPathname.endsWith('/')) {
34+
if (nextAdapterContext.config.trailingSlash && !distPathname.endsWith('/')) {
3535
distPathname += '/'
36-
} else if (!ctx.config.trailingSlash && distPathname.endsWith('/')) {
36+
} else if (!nextAdapterContext.config.trailingSlash && distPathname.endsWith('/')) {
3737
distPathname = distPathname.slice(0, -1)
3838
}
3939
}
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)