From a5de7386588acd44791cb6ef8854c865709905f2 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Wed, 24 May 2023 13:30:00 +0100 Subject: [PATCH] add named export for Edge --- .../edge-functions/edge-handler-template.js | 34 ++++++++++++++----- .../node/src/edge-functions/edge-handler.mts | 9 ++--- .../serverless-handler.mts | 4 +-- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/packages/node/src/edge-functions/edge-handler-template.js b/packages/node/src/edge-functions/edge-handler-template.js index 33348e0ecf1..2b385869bc2 100644 --- a/packages/node/src/edge-functions/edge-handler-template.js +++ b/packages/node/src/edge-functions/edge-handler-template.js @@ -10,14 +10,14 @@ function getUrl(url, headers) { return urlObj.toString(); } -async function respond(userEdgeHandler, event, options, dependencies) { +async function respond(handler, event, options, dependencies) { const { Request, Response } = dependencies; const { isMiddleware } = options; event.request.headers.set( 'host', event.request.headers.get('x-forwarded-host') ); - let response = await userEdgeHandler( + let response = await handler( new Request( getUrl(event.request.url, event.request.headers), event.request @@ -62,15 +62,31 @@ async function parseRequestEvent(event) { // This will be invoked by logic using this template // eslint-disable-next-line @typescript-eslint/no-unused-vars -function registerFetchListener(userEdgeHandler, options, dependencies) { +function registerFetchListener(module, options, dependencies) { addEventListener('fetch', async event => { + let handler; + if (typeof module.default === 'function') { + handler = module.default; + } else { + if ( + ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'DELETE', 'PATCH'].some( + method => typeof module[method] === 'function' + ) + ) { + const method = event.request.method ?? 'GET'; + handler = + typeof module[method] === 'function' + ? module[method] + : () => new dependencies.Response(null, { status: 405 }); + } else { + throw new Error( + 'No default export was found. Add a default export to handle requests. Learn more: https://vercel.link/creating-edge-middleware' + ); + } + } + try { - const response = await respond( - userEdgeHandler, - event, - options, - dependencies - ); + const response = await respond(handler, event, options, dependencies); return event.respondWith(response); } catch (error) { event.respondWith(toResponseError(error, dependencies.Response)); diff --git a/packages/node/src/edge-functions/edge-handler.mts b/packages/node/src/edge-functions/edge-handler.mts index 2bcf431fead..afe873040c2 100644 --- a/packages/node/src/edge-functions/edge-handler.mts +++ b/packages/node/src/edge-functions/edge-handler.mts @@ -89,12 +89,7 @@ async function compileUserCode( // user code ${compiledFile.text}; - const userEdgeHandler = module.exports.default; - if (!userEdgeHandler) { - throw new Error( - 'No default export was found. Add a default export to handle requests. Learn more: https://vercel.link/creating-edge-middleware' - ); - } + const handler = module.exports; // request metadata const isMiddleware = ${isMiddleware}; @@ -104,7 +99,7 @@ async function compileUserCode( ${edgeHandlerTemplate}; const dependencies = { Request, Response }; const options = { isMiddleware, entrypointLabel }; - registerFetchListener(userEdgeHandler, options, dependencies); + registerFetchListener(handler, options, dependencies); `; return { diff --git a/packages/node/src/serverless-functions/serverless-handler.mts b/packages/node/src/serverless-functions/serverless-handler.mts index 3f545cefe6e..e31f384f5e7 100644 --- a/packages/node/src/serverless-functions/serverless-handler.mts +++ b/packages/node/src/serverless-functions/serverless-handler.mts @@ -21,7 +21,7 @@ type ServerlessFunctionSignature = ( res: ServerResponse | VercelResponse ) => void; -const [nodeMajor] = process.versions.node.split('.').map(v => Number(v)); +const [NODE_MAJOR] = process.versions.node.split('.').map(v => Number(v)); /* https://nextjs.org/docs/app/building-your-application/routing/router-handlers#supported-http-methods */ const HTTP_METHODS = [ @@ -57,7 +57,7 @@ async function compileUserCode( } if (HTTP_METHODS.some(method => typeof listener[method] === 'function')) { - if (nodeMajor < 18) throw new Error('Node.js v18 or above is needed') + if (NODE_MAJOR < 18) throw new Error('Node.js v18 or above is needed'); const { getWebExportsHandler } = await import('./helpers-web.js'); return getWebExportsHandler(listener, HTTP_METHODS); }