diff --git a/src/build/functions/edge.ts b/src/build/functions/edge.ts index f3f534c35b..77c79bf2e3 100644 --- a/src/build/functions/edge.ts +++ b/src/build/functions/edge.ts @@ -162,9 +162,11 @@ const buildHandlerDefinition = ( })) } -export const createEdgeHandlers = async (ctx: PluginContext) => { +export const clearStaleEdgeHandlers = async (ctx: PluginContext) => { await rm(ctx.edgeFunctionsDir, { recursive: true, force: true }) +} +export const createEdgeHandlers = async (ctx: PluginContext) => { const nextManifest = await ctx.getMiddlewareManifest() const nextDefinitions = [ ...Object.values(nextManifest.middleware), diff --git a/src/build/functions/server.ts b/src/build/functions/server.ts index e34997ee06..dbdba6553f 100644 --- a/src/build/functions/server.ts +++ b/src/build/functions/server.ts @@ -127,12 +127,15 @@ const writeHandlerFile = async (ctx: PluginContext) => { await writeFile(join(ctx.serverHandlerRootDir, `${SERVER_HANDLER_NAME}.mjs`), handler) } +export const clearStaleServerHandlers = async (ctx: PluginContext) => { + await rm(ctx.serverFunctionsDir, { recursive: true, force: true }) +} + /** * Create a Netlify function to run the Next.js server */ export const createServerHandler = async (ctx: PluginContext) => { await tracer.withActiveSpan('createServerHandler', async () => { - await rm(ctx.serverFunctionsDir, { recursive: true, force: true }) await mkdir(join(ctx.serverHandlerDir, '.netlify'), { recursive: true }) await copyNextServerCode(ctx) diff --git a/src/index.ts b/src/index.ts index 5e62ab6b47..58cb08fa35 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,8 +13,8 @@ import { publishStaticDir, unpublishStaticDir, } from './build/content/static.js' -import { createEdgeHandlers } from './build/functions/edge.js' -import { createServerHandler } from './build/functions/server.js' +import { clearStaleEdgeHandlers, createEdgeHandlers } from './build/functions/edge.js' +import { clearStaleServerHandlers, createServerHandler } from './build/functions/server.js' import { setImageConfig } from './build/image-cdn.js' import { PluginContext } from './build/plugin-context.js' import { @@ -38,8 +38,15 @@ export const onPreBuild = async (options: NetlifyPluginOptions) => { await tracer.withActiveSpan('onPreBuild', async () => { // Enable Next.js standalone mode at build time process.env.NEXT_PRIVATE_STANDALONE = 'true' - if (!options.constants.IS_LOCAL) { - await restoreBuildCache(new PluginContext(options)) + const ctx = new PluginContext(options) + if (options.constants.IS_LOCAL) { + // Only clear directory if we are running locally as then we might have stale functions from previous + // local builds. Directory clearing interferes with other integrations by deleting functions produced by them + // so ideally this is completely avoided. + await clearStaleServerHandlers(ctx) + await clearStaleEdgeHandlers(ctx) + } else { + await restoreBuildCache(ctx) } }) }