@@ -11,6 +11,12 @@ type WrapResult = {
1111 skipped : string [ ] ;
1212} ;
1313
14+ type FileTransformState = {
15+ code : string ;
16+ needsImport : boolean ;
17+ skippedMiddlewares : string [ ] ;
18+ } ;
19+
1420/**
1521 * Core function that wraps middleware arrays matching the given regex.
1622 */
@@ -64,6 +70,23 @@ export function wrapServerFnMiddleware(code: string, id: string, debug: boolean)
6470 return wrapMiddlewareArrays ( code , id , debug , / ( \. m i d d l e w a r e \s * \( ) \s * \[ ( [ ^ \] ] * ) \] \s * \) / g) ;
6571}
6672
73+ /**
74+ * Applies a wrap function to the current state and returns the updated state.
75+ */
76+ function applyWrap (
77+ state : FileTransformState ,
78+ wrapFn : ( code : string , id : string , debug : boolean ) => WrapResult ,
79+ id : string ,
80+ debug : boolean ,
81+ ) : FileTransformState {
82+ const result = wrapFn ( state . code , id , debug ) ;
83+ return {
84+ code : result . code ,
85+ needsImport : state . needsImport || result . didWrap ,
86+ skippedMiddlewares : [ ...state . skippedMiddlewares , ...result . skipped ] ,
87+ } ;
88+ }
89+
6790/**
6891 * A Vite plugin that automatically instruments TanStack Start middlewares:
6992 * - `requestMiddleware` and `functionMiddleware` arrays in `createStart()`
@@ -100,56 +123,38 @@ export function makeAutoInstrumentMiddlewarePlugin(options: AutoInstrumentMiddle
100123 return null ;
101124 }
102125
103- let transformed = code ;
104- let needsImport = false ;
105- const skippedMiddlewares : string [ ] = [ ] ;
106-
107- switch ( true ) {
108- // global middleware
109- case isStartFile : {
110- const result = wrapGlobalMiddleware ( transformed , id , debug ) ;
111- transformed = result . code ;
112- needsImport = needsImport || result . didWrap ;
113- skippedMiddlewares . push ( ...result . skipped ) ;
114- break ;
115- }
116- // non-global middleware
117- case isRouteFile || isServerFnFile : {
118- if ( isRouteFile ) {
119- const result = wrapRouteMiddleware ( transformed , id , debug ) ;
120- transformed = result . code ;
121- needsImport = needsImport || result . didWrap ;
122- skippedMiddlewares . push ( ...result . skipped ) ;
123- }
124- if ( isServerFnFile ) {
125- const result = wrapServerFnMiddleware ( transformed , id , debug ) ;
126- transformed = result . code ;
127- needsImport = needsImport || result . didWrap ;
128- skippedMiddlewares . push ( ...result . skipped ) ;
129- }
130- break ;
131- }
132- default :
133- break ;
126+ let fileTransformState : FileTransformState = {
127+ code,
128+ needsImport : false ,
129+ skippedMiddlewares : [ ] ,
130+ } ;
131+
132+ // Wrap middlewares
133+ if ( isStartFile ) {
134+ fileTransformState = applyWrap ( fileTransformState , wrapGlobalMiddleware , id , debug ) ;
135+ }
136+ if ( isRouteFile ) {
137+ fileTransformState = applyWrap ( fileTransformState , wrapRouteMiddleware , id , debug ) ;
138+ }
139+ if ( isServerFnFile ) {
140+ fileTransformState = applyWrap ( fileTransformState , wrapServerFnMiddleware , id , debug ) ;
134141 }
135142
136143 // Warn about middlewares that couldn't be auto-wrapped
137- if ( skippedMiddlewares . length > 0 ) {
144+ if ( fileTransformState . skippedMiddlewares . length > 0 ) {
138145 // eslint-disable-next-line no-console
139146 console . warn (
140- `[Sentry] Could not auto-instrument ${ skippedMiddlewares . join ( ' and ' ) } in ${ id } . ` +
147+ `[Sentry] Could not auto-instrument ${ fileTransformState . skippedMiddlewares . join ( ' and ' ) } in ${ id } . ` +
141148 'To instrument these middlewares, use wrapMiddlewaresWithSentry() manually. ' ,
142149 ) ;
143150 }
144151
145152 // We didn't wrap any middlewares, so we don't need to import the wrapMiddlewaresWithSentry function
146- if ( ! needsImport ) {
153+ if ( ! fileTransformState . needsImport ) {
147154 return null ;
148155 }
149156
150- transformed = addSentryImport ( transformed ) ;
151-
152- return { code : transformed , map : null } ;
157+ return { code : addSentryImport ( fileTransformState . code ) , map : null } ;
153158 } ,
154159 } ;
155160}
0 commit comments