From a8444ff6e1eca6a212609a48e5b326bcc50ad855 Mon Sep 17 00:00:00 2001 From: Rob Hogan <2590098+robhogan@users.noreply.github.com> Date: Fri, 23 Oct 2026 21:02:58 +0100 Subject: [PATCH] Tolerate configs without the newer server middleware options https://github.com/react/metro/pull/2031 added `server.unstable_onServerCreated`, `unstable_priorityMiddleware` and `unstable_middleware`, which `createConnectMiddleware` assumes are set. A config from an older `metro-config`, or built by hand, crashes `runServer`: ``` TypeError: config.server.unstable_onServerCreated is not a function ``` This treats them as optional. Changelog: Internal Test plan: - New integration test, failing without this change. --- packages/metro/src/index.flow.js | 7 ++++--- .../__tests__/server-extraMiddleware-test.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/metro/src/index.flow.js b/packages/metro/src/index.flow.js index addfcbfc3c..466340f632 100644 --- a/packages/metro/src/index.flow.js +++ b/packages/metro/src/index.flow.js @@ -242,7 +242,8 @@ export const createConnectMiddleware = async function ( options?: RunMetroOptions, ): Promise { const metroServer = await runMetro(config, options); - config.server.unstable_onServerCreated(metroServer); + // Absent from configs built by older metro-config versions. + config.server.unstable_onServerCreated?.(metroServer); let enhancedMiddleware: Middleware = metroServer.processRequest; @@ -276,9 +277,9 @@ export const createConnectMiddleware = async function ( }, metroServer, middleware: composeMiddleware( - config.server.unstable_priorityMiddleware, + config.server.unstable_priorityMiddleware ?? [], enhancedMiddleware, - config.server.unstable_middleware, + config.server.unstable_middleware ?? [], ), async end(): Promise { await metroServer.end(); diff --git a/packages/metro/src/integration_tests/__tests__/server-extraMiddleware-test.js b/packages/metro/src/integration_tests/__tests__/server-extraMiddleware-test.js index dacd450a3c..1bd7df7f2a 100644 --- a/packages/metro/src/integration_tests/__tests__/server-extraMiddleware-test.js +++ b/packages/metro/src/integration_tests/__tests__/server-extraMiddleware-test.js @@ -96,6 +96,20 @@ describe('runServer custom middleware', () => { ]); }); + test('serves with a config that lacks the newer server options', async () => { + const config = await loadConfig(); + // As from an older metro-config. + const { + unstable_middleware: _middleware, + unstable_onServerCreated: _onServerCreated, + unstable_priorityMiddleware: _priorityMiddleware, + ...server + } = config.server; + await startServer({...config, server}); + + expect((await request(BUNDLE_PATH)).status).toBe(200); + }); + test('mounts deprecated unstable_extraMiddleware before unstable_priorityMiddleware', async () => { const calls = []; await startServer(await loadConfig(), {