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