From 1ffa21c24d1c0cd4466bc638f52d60906f3a3260 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 18 Aug 2022 15:49:36 +0100 Subject: [PATCH 1/3] fix: ensure newly-created midldeware works --- packages/runtime/src/templates/edge/next-dev.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/runtime/src/templates/edge/next-dev.js b/packages/runtime/src/templates/edge/next-dev.js index bfd2192ff5..8122284cb3 100644 --- a/packages/runtime/src/templates/edge/next-dev.js +++ b/packages/runtime/src/templates/edge/next-dev.js @@ -19,6 +19,7 @@ const exists = async (relativePath) => { throw error } } +let idx = 0 const handler = async (req, context) => { // Uncomment when CLI update lands @@ -34,8 +35,9 @@ const handler = async (req, context) => { // because that would also throw if there's an error in the middleware, // which we would want to surface not ignore. if (await exists('../../middleware.js')) { - // These will be user code - const nextMiddleware = await import('../../middleware.js') + // We need to cache-bust the import because otherwise it will claim it + // doesn't exist if the user creates it after the server starts + const nextMiddleware = await import(`../../middleware.js#${idx++}`) middleware = nextMiddleware.middleware } else { // No middleware, so we silently return From 9d916fa7939ac59a7dc15db4af961538978c95da Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 18 Aug 2022 18:44:33 +0100 Subject: [PATCH 2/3] fix: set output format for middleware --- packages/runtime/src/helpers/dev.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime/src/helpers/dev.ts b/packages/runtime/src/helpers/dev.ts index cf7fe56c1a..f680f2d611 100644 --- a/packages/runtime/src/helpers/dev.ts +++ b/packages/runtime/src/helpers/dev.ts @@ -31,6 +31,7 @@ export const onPreDev: OnPreBuild = async ({ constants, netlifyConfig }) => { `--bundle`, `--outdir=${resolve('.netlify')}`, `--format=esm`, + `--target=esnext`, '--watch', // Watch for both, because it can have either ts or js resolve(base, 'middleware.ts'), From c4d7f0264d705afd4757e5957fb9cad702a68e06 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 18 Aug 2022 19:25:11 +0100 Subject: [PATCH 3/3] fix: compile js and ts separately --- packages/runtime/src/helpers/dev.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/runtime/src/helpers/dev.ts b/packages/runtime/src/helpers/dev.ts index f680f2d611..fea2b24aa5 100644 --- a/packages/runtime/src/helpers/dev.ts +++ b/packages/runtime/src/helpers/dev.ts @@ -27,18 +27,14 @@ export const onPreDev: OnPreBuild = async ({ constants, netlifyConfig }) => { console.log('Watching for changes in Next.js middleware...') } // Eventually we might want to do this via esbuild's API, but for now the CLI works fine - const childProcess = execa(`esbuild`, [ - `--bundle`, - `--outdir=${resolve('.netlify')}`, - `--format=esm`, - `--target=esnext`, - '--watch', - // Watch for both, because it can have either ts or js - resolve(base, 'middleware.ts'), - resolve(base, 'middleware.js'), - ]) - - childProcess.stdout.pipe(process.stdout) - childProcess.stderr.pipe(process.stderr) + + const common = [`--bundle`, `--outdir=${resolve('.netlify')}`, `--format=esm`, `--target=esnext`, '--watch'] + + // TypeScript + execa(`esbuild`, [...common, resolve(base, 'middleware.ts')], { all: true }).all.pipe(process.stdout) + + // JavaScript + execa(`esbuild`, [...common, resolve(base, 'middleware.js')], { all: true }).all.pipe(process.stdout) + // Don't return the promise because we don't want to wait for the child process to finish }