Skip to content

Commit 1ed6249

Browse files
authored
fix(dart_frog_gen)!: cascading middleware (#383)
1 parent 633941f commit 1ed6249

File tree

3 files changed

+259
-174
lines changed

3 files changed

+259
-174
lines changed

packages/dart_frog_gen/lib/src/build_route_configuration.dart

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ List<RouteDirectory> _getRouteDirectories({
6464
required void Function(MiddlewareFile route) onMiddleware,
6565
required void Function(String endpoint, RouteFile file) onEndpoint,
6666
required void Function(RouteFile route) onRogueRoute,
67+
List<MiddlewareFile> middleware = const [],
6768
}) {
6869
final directories = <RouteDirectory>[];
6970
final entities = directory.listSync().sorted();
@@ -73,47 +74,54 @@ List<RouteDirectory> _getRouteDirectories({
7374
? directorySegment
7475
: '/$directorySegment';
7576
// Only add nested middleware -- global middleware is added separately.
76-
MiddlewareFile? middleware;
77+
MiddlewareFile? localMiddleware;
7778
if (directory.path != path.join(Directory.current.path, 'routes')) {
7879
final middlewareFile = File(path.join(directory.path, '_middleware.dart'));
7980
if (middlewareFile.existsSync()) {
8081
final middlewarePath = path
8182
.relative(middlewareFile.path, from: routesDirectory.path)
8283
.replaceAll(r'\', '/');
83-
middleware = MiddlewareFile(
84+
localMiddleware = MiddlewareFile(
8485
name: middlewarePath.toAlias(),
8586
path: path.join('..', 'routes', middlewarePath).replaceAll(r'\', '/'),
8687
);
87-
onMiddleware(middleware);
88+
onMiddleware(localMiddleware);
8889
}
8990
}
9091

92+
final updatedMiddleware = [
93+
...middleware,
94+
if (localMiddleware != null) localMiddleware,
95+
];
96+
9197
final files = _getRouteFiles(
9298
directory: directory,
9399
routesDirectory: routesDirectory,
94100
onRoute: onRoute,
95101
onRogueRoute: onRogueRoute,
96102
);
97103

98-
final baseRoute = directoryPath.toRoute();
99-
for (final file in files) {
100-
var endpoint = (baseRoute + file.route.toRoute()).replaceAll('//', '/');
101-
if (endpoint.endsWith('/')) {
102-
endpoint = endpoint.substring(0, endpoint.length - 1);
104+
if (files.isNotEmpty) {
105+
final baseRoute = directoryPath.toRoute();
106+
for (final file in files) {
107+
var endpoint = (baseRoute + file.route.toRoute()).replaceAll('//', '/');
108+
if (endpoint.endsWith('/')) {
109+
endpoint = endpoint.substring(0, endpoint.length - 1);
110+
}
111+
if (endpoint.isEmpty) endpoint = '/';
112+
onEndpoint(endpoint, file);
103113
}
104-
if (endpoint.isEmpty) endpoint = '/';
105-
onEndpoint(endpoint, file);
106-
}
107114

108-
directories.add(
109-
RouteDirectory(
110-
name: directoryPath.toAlias(),
111-
route: baseRoute,
112-
middleware: middleware,
113-
files: files,
114-
params: directoryPath.toParams(),
115-
),
116-
);
115+
directories.add(
116+
RouteDirectory(
117+
name: directoryPath.toAlias(),
118+
route: baseRoute,
119+
middleware: updatedMiddleware,
120+
files: files,
121+
params: directoryPath.toParams(),
122+
),
123+
);
124+
}
117125

118126
entities.whereType<Directory>().forEach((directory) {
119127
directories.addAll(
@@ -124,6 +132,7 @@ List<RouteDirectory> _getRouteDirectories({
124132
onMiddleware: onMiddleware,
125133
onEndpoint: onEndpoint,
126134
onRogueRoute: onRogueRoute,
135+
middleware: updatedMiddleware,
127136
),
128137
);
129138
});
@@ -319,8 +328,8 @@ class RouteDirectory {
319328
/// The dynamic route params associated with the directory.
320329
final List<String> params;
321330

322-
/// Optional middleware for the provided router.
323-
final MiddlewareFile? middleware;
331+
/// List of middleware for the provided router.
332+
final List<MiddlewareFile> middleware;
324333

325334
/// A list of nested route files within the directory.
326335
final List<RouteFile> files;
@@ -329,7 +338,7 @@ class RouteDirectory {
329338
RouteDirectory copyWith({
330339
String? name,
331340
String? route,
332-
MiddlewareFile? middleware,
341+
List<MiddlewareFile>? middleware,
333342
List<RouteFile>? files,
334343
List<String>? params,
335344
}) {
@@ -347,7 +356,7 @@ class RouteDirectory {
347356
return <String, dynamic>{
348357
'name': name,
349358
'route': route,
350-
'middleware': middleware?.toJson() ?? false,
359+
'middleware': middleware.map((m) => m.toJson()).toList(),
351360
'files': files.map((f) => f.toJson()).toList(),
352361
'directory_params': params,
353362
};

0 commit comments

Comments
 (0)