11import { type MetroConfig } from '@react-native/metro-config' ;
2- import { initializeRozenite , type RozeniteConfig } from '@rozenite/middleware' ;
2+ import {
3+ createScopedMiddleware ,
4+ initializeRozenite ,
5+ type MiddlewareHandler ,
6+ type MiddlewareNext ,
7+ type MiddlewareRequest ,
8+ type RozeniteConfig ,
9+ } from '@rozenite/middleware' ;
310import { logger } from '@rozenite/tools' ;
411import path from 'node:path' ;
512import { isBundling } from './is-bundling.js' ;
@@ -19,24 +26,24 @@ export type RozeniteMetroConfig<TMetroConfig = unknown> = Omit<
1926 * This option allows you to modify the Metro config in a way that is safe to do when bundling.
2027 */
2128 enhanceMetroConfig ?: (
22- config : TMetroConfig
29+ config : TMetroConfig ,
2330 ) => Promise < TMetroConfig > | TMetroConfig ;
2431} ;
2532
2633export const withRozenite = < T extends MetroConfig > (
2734 config : T | Promise < T > ,
28- options : RozeniteMetroConfig < T > = { }
29- ) : ( ) => Promise < T > => {
35+ options : RozeniteMetroConfig < T > = { } ,
36+ ) : ( ( ) => Promise < T > ) => {
3037 return async ( ) => {
3138 const resolvedConfig = await config ;
3239 const projectRoot = resolvedConfig . projectRoot ?? process . cwd ( ) ;
3340
3441 if ( options . enabled === undefined ) {
3542 logger . info (
36- 'Rozenite will no longer be enabled by default in the next version.'
43+ 'Rozenite will no longer be enabled by default in the next version.' ,
3744 ) ;
3845 logger . info (
39- 'To continue using Rozenite, please set `enabled` in the options.'
46+ 'To continue using Rozenite, please set `enabled` in the options.' ,
4047 ) ;
4148 logger . info ( 'Remember to make it conditional to avoid bundling issues.' ) ;
4249
@@ -49,12 +56,11 @@ export const withRozenite = <T extends MetroConfig>(
4956 return resolvedConfig ;
5057 }
5158
52- const { devModePackage, middleware : rozeniteMiddleware } = initializeRozenite (
53- {
59+ const { devModePackage, middleware : rozeniteMiddleware } =
60+ initializeRozenite ( {
5461 projectRoot,
5562 ...options ,
56- }
57- ) ;
63+ } ) ;
5864
5965 const rozeniteMetroConfig = {
6066 ...resolvedConfig ,
@@ -73,12 +79,12 @@ export const withRozenite = <T extends MetroConfig>(
7379 // Rozenite package should use the same versions of React and React Native as the app.
7480 // Using dirname as sometimes developers use deep imports for react-native.
7581 react : path . dirname (
76- require . resolve ( 'react' , { paths : [ projectRoot ] } )
82+ require . resolve ( 'react' , { paths : [ projectRoot ] } ) ,
7783 ) ,
7884 'react-native' : path . dirname (
7985 require . resolve ( 'react-native' , {
8086 paths : [ projectRoot ] ,
81- } )
87+ } ) ,
8288 ) ,
8389 }
8490 : resolvedConfig . resolver ?. extraNodeModules ,
@@ -87,7 +93,8 @@ export const withRozenite = <T extends MetroConfig>(
8793 // This is currently the only module that we need to mock, but it may change in the future.
8894 if (
8995 platform === 'web' &&
90- moduleName === 'react-native/Libraries/WebSocket/WebSocketInterceptor'
96+ moduleName ===
97+ 'react-native/Libraries/WebSocket/WebSocketInterceptor'
9198 ) {
9299 return {
93100 type : 'empty' ,
@@ -98,7 +105,7 @@ export const withRozenite = <T extends MetroConfig>(
98105 resolvedConfig . resolver ?. resolveRequest ?.(
99106 context ,
100107 moduleName ,
101- platform
108+ platform ,
102109 ) ?? context . resolveRequest ( context , moduleName , platform )
103110 ) ;
104111 } ,
@@ -107,21 +114,41 @@ export const withRozenite = <T extends MetroConfig>(
107114 ...resolvedConfig . server ,
108115 enhanceMiddleware : ( metroMiddleware , server ) => {
109116 const prevMiddleware =
110- resolvedConfig . server ?. enhanceMiddleware ?.( metroMiddleware , server ) ??
111- metroMiddleware ;
117+ resolvedConfig . server ?. enhanceMiddleware ?.(
118+ metroMiddleware ,
119+ server ,
120+ ) ?? metroMiddleware ;
121+ const delegatedMetroMiddleware = prevMiddleware as MiddlewareHandler ;
122+
123+ const scopedRozeniteMiddleware = createScopedMiddleware (
124+ '/rozenite' ,
125+ rozeniteMiddleware ,
126+ ) ;
112127
113- return rozeniteMiddleware . use ( prevMiddleware ) ;
128+ return (
129+ req : MiddlewareRequest ,
130+ res : Parameters < MiddlewareHandler > [ 1 ] ,
131+ next : MiddlewareNext ,
132+ ) => {
133+ scopedRozeniteMiddleware ( req , res , ( error ) => {
134+ if ( error ) {
135+ next ( error ) ;
136+ return ;
137+ }
138+
139+ delegatedMetroMiddleware ( req , res , next ) ;
140+ } ) ;
141+ } ;
114142 } ,
115143 } ,
116144 } satisfies MetroConfig ;
117145
118146 if ( options . enhanceMetroConfig ) {
119- const enhancedConfig = await options . enhanceMetroConfig (
120- rozeniteMetroConfig
121- ) ;
147+ const enhancedConfig =
148+ await options . enhanceMetroConfig ( rozeniteMetroConfig ) ;
122149 return enhancedConfig ;
123150 }
124151
125152 return rozeniteMetroConfig ;
126- }
153+ } ;
127154} ;
0 commit comments