Capítulo 435 de 456
An adapter is a module exporting an object implementing the NextAdapter interface (imported from the next package), with two lifecycle hooks: modifyConfig and onBuildComplete.
NextAdapter.name: string identifying the adapter.modifyConfig(config, ctx): optional, runs for any CLI command loading next.config.js; receives { phase, nextVersion, projectDir }; returns the (possibly async) modified config.onBuildComplete(ctx): optional, runs after build completes; receives { routing, outputs, projectDir, repoRoot, distDir, config, nextVersion, buildId }.AdapterOutputs: shape of outputs passed to onBuildComplete — pages, middleware, appPages, pagesApi, appRoutes, prerenders, staticFiles arrays.Route type: source?, sourceRegex, destination?, headers?, has?, missing?, status?, priority?./** @type {import('next').NextAdapter} */
const adapter = {
name: 'my-custom-adapter',
async modifyConfig(config, { phase }) {
if (phase === 'phase-production-build') {
return { ...config }
}
return config
},
async onBuildComplete({ routing, outputs, buildId }) {
console.log('Build completed with', outputs.pages.length, 'pages')
console.log('Build ID:', buildId)
console.log('Dynamic routes:', routing.dynamicRoutes.length)
for (const page of outputs.pages) {
console.log('Page:', page.pathname, 'at', page.filePath)
}
},
}
module.exports = adapter
modifyConfig roda em qualquer comando CLI que carrega o config (não só build), então cheque phase antes de aplicar mudanças específicas de build.onBuildComplete é onde o grosso do trabalho de deploy acontece: processar outputs por tipo, ler routing, etc.import type { NextAdapter } from 'next'.modifyConfig/onBuildComplete com mais precisão.outputs.*.routing.*.