buildRouteConfiguration function
Build a RouteConfiguration based on the provided root project directory
.
Implementation
RouteConfiguration buildRouteConfiguration(Directory directory) {
final routesDirectory = Directory(path.join(directory.path, 'routes'));
if (!routesDirectory.existsSync()) {
throw Exception('Could not find directory ${routesDirectory.path}');
}
final globalMiddlewareFile = File(
path.join(routesDirectory.path, '_middleware.dart'),
);
final globalMiddleware = globalMiddlewareFile.existsSync()
? MiddlewareFile(
name: 'middleware',
path: path
.join('..', path.relative(globalMiddlewareFile.path))
.replaceAll(r'\', '/'),
)
: null;
final endpoints = <String, List<RouteFile>>{};
final middleware = <MiddlewareFile>[
if (globalMiddleware != null) globalMiddleware,
];
final routes = <RouteFile>[];
final rogueRoutes = <RouteFile>[];
final directories = _getRouteDirectories(
directory: routesDirectory,
routesDirectory: routesDirectory,
onRoute: routes.add,
onMiddleware: middleware.add,
onEndpoint: (endpoint, file) {
if (!endpoints.containsKey(endpoint)) {
endpoints[endpoint] = [file];
} else {
endpoints[endpoint]!.add(file);
}
},
onRogueRoute: rogueRoutes.add,
);
final publicDirectory = Directory(path.join(directory.path, 'public'));
final mainDartFile = File(path.join(directory.path, 'main.dart'));
final customInitRegex = RegExp(
r'^Future(?:Or)?<void>\s*init\(InternetAddress .*?,\s*int .*?\)\s*(?:async)?\s*{',
multiLine: true,
);
final mainDartFileExists = mainDartFile.existsSync();
final hasCustomInit = mainDartFileExists &&
customInitRegex.hasMatch(mainDartFile.readAsStringSync());
return RouteConfiguration(
globalMiddleware: globalMiddleware,
middleware: middleware,
directories: directories,
routes: routes,
rogueRoutes: rogueRoutes,
endpoints: endpoints,
serveStaticFiles: publicDirectory.existsSync(),
invokeCustomEntrypoint: mainDartFileExists,
invokeCustomInit: hasCustomInit,
);
}