1// This file runs in Node.js environments.
2// no relative imports
3import { getRoutes } from './getRoutes';
4import { getServerManifest } from './getServerManifest';
5import { RequireContext } from './types';
6
7export type RouteInfo<TRegex = string> = {
8  page: string;
9  namedRegex: TRegex;
10  routeKeys: { [named: string]: string };
11};
12
13export type ExpoRoutesManifestV1<TRegex = string> = {
14  apiRoutes: RouteInfo<TRegex>[];
15  htmlRoutes: RouteInfo<TRegex>[];
16  notFoundRoutes: RouteInfo<TRegex>[];
17};
18
19function createMockContextModule(map: string[] = []) {
20  const contextModule = (key) => ({ default() {} });
21
22  Object.defineProperty(contextModule, 'keys', {
23    value: () => map,
24  });
25
26  return contextModule as RequireContext;
27}
28
29export function createRoutesManifest(paths: string[]): ExpoRoutesManifestV1 | null {
30  // TODO: Drop this part for Node.js
31  const routeTree = getRoutes(createMockContextModule(paths), {
32    preserveApiRoutes: true,
33    ignoreRequireErrors: true,
34  });
35
36  if (!routeTree) {
37    return null;
38  }
39  return getServerManifest(routeTree);
40}
41