1*fd055557SKudo Chienimport { readFile } from 'fs/promises';
2*fd055557SKudo Chienimport path from 'path';
3*fd055557SKudo Chienimport resolveFrom from 'resolve-from';
4*fd055557SKudo Chien
5*fd055557SKudo Chienimport { ExpoMiddleware } from './ExpoMiddleware';
6*fd055557SKudo Chienimport { ServerRequest, ServerResponse } from './server.types';
7*fd055557SKudo Chien
8*fd055557SKudo Chienexport const ReactDevToolsEndpoint = '/_expo/react-devtools';
9*fd055557SKudo Chien
10*fd055557SKudo Chienexport class ReactDevToolsPageMiddleware extends ExpoMiddleware {
11*fd055557SKudo Chien  constructor(projectRoot: string) {
12*fd055557SKudo Chien    super(projectRoot, [ReactDevToolsEndpoint]);
13*fd055557SKudo Chien  }
14*fd055557SKudo Chien
15*fd055557SKudo Chien  async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {
16*fd055557SKudo Chien    const templatePath =
17*fd055557SKudo Chien      // Production: This will resolve when installed in the project.
18*fd055557SKudo Chien      resolveFrom.silent(this.projectRoot, 'expo/static/react-devtools-page/index.html') ??
19*fd055557SKudo Chien      // Development: This will resolve when testing locally.
20*fd055557SKudo Chien      path.resolve(__dirname, '../../../../../static/react-devtools-page/index.html');
21*fd055557SKudo Chien    const content = (await readFile(templatePath)).toString('utf-8');
22*fd055557SKudo Chien
23*fd055557SKudo Chien    res.setHeader('Content-Type', 'text/html');
24*fd055557SKudo Chien    res.end(content);
25*fd055557SKudo Chien  }
26*fd055557SKudo Chien}
27