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