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