1*2e1e108bSEvan Baconimport { ServerRequest, ServerResponse } from './server.types';
2*2e1e108bSEvan Bacon
3*2e1e108bSEvan Baconconst debug = require('debug')(
4*2e1e108bSEvan Bacon  'expo:start:server:middleware:metro-context-modules'
5*2e1e108bSEvan Bacon) as typeof console.log;
6*2e1e108bSEvan Bacon
7*2e1e108bSEvan Bacon/**
8*2e1e108bSEvan Bacon * Source maps for `require.context` modules aren't supported in the Metro dev server
9*2e1e108bSEvan Bacon * we should intercept the request and return a noop response to prevent Chrome/Metro
10*2e1e108bSEvan Bacon * from erroring out.
11*2e1e108bSEvan Bacon */
12*2e1e108bSEvan Baconexport class ContextModuleSourceMapsMiddleware {
13*2e1e108bSEvan Bacon  getHandler() {
14*2e1e108bSEvan Bacon    return (req: ServerRequest, res: ServerResponse, next: any) => {
15*2e1e108bSEvan Bacon      if (!req?.url || (req.method !== 'GET' && req.method !== 'HEAD')) {
16*2e1e108bSEvan Bacon        return next();
17*2e1e108bSEvan Bacon      }
18*2e1e108bSEvan Bacon
19*2e1e108bSEvan Bacon      if (req.url.match(/%3Fctx=[\d\w\W]+\.map\?/)) {
20*2e1e108bSEvan Bacon        debug('Skipping sourcemap request for context module %s', req.url);
21*2e1e108bSEvan Bacon        // Return a noop response for the sourcemap
22*2e1e108bSEvan Bacon        res.writeHead(200, {
23*2e1e108bSEvan Bacon          'Content-Type': 'application/json',
24*2e1e108bSEvan Bacon        });
25*2e1e108bSEvan Bacon        res.end('{}');
26*2e1e108bSEvan Bacon        return;
27*2e1e108bSEvan Bacon      }
28*2e1e108bSEvan Bacon
29*2e1e108bSEvan Bacon      next();
30*2e1e108bSEvan Bacon    };
31*2e1e108bSEvan Bacon  }
32*2e1e108bSEvan Bacon}
33