Skip to content

Commit 6ca4af7

Browse files
authored
feat(dart_frog_gen): add serveStaticFiles to RouteConfiguration (#102)
1 parent 396e16b commit 6ca4af7

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

packages/dart_frog_gen/lib/src/build_route_configuration.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,13 @@ RouteConfiguration buildRouteConfiguration(Directory directory) {
3232
onRoute: routes.add,
3333
onMiddleware: middleware.add,
3434
);
35-
35+
final publicDirectory = Directory(path.join(directory.path, 'public'));
3636
return RouteConfiguration(
3737
globalMiddleware: globalMiddleware,
3838
middleware: middleware,
3939
directories: directories,
4040
routes: routes,
41+
serveStaticFiles: publicDirectory.existsSync(),
4142
);
4243
}
4344

@@ -47,7 +48,7 @@ List<RouteDirectory> _getRouteDirectories(
4748
void Function(MiddlewareFile route)? onMiddleware,
4849
}) {
4950
final directories = <RouteDirectory>[];
50-
final entities = directory.listSync();
51+
final entities = directory.listSync().sorted();
5152
final directorySegment =
5253
directory.path.split('routes').last.replaceAll(r'\', '/');
5354
final directoryPath = directorySegment.startsWith('/')
@@ -106,6 +107,7 @@ List<RouteFile> _getRouteFilesForDynamicDirectories(
106107
final files = <RouteFile>[];
107108
directory
108109
.listSync()
110+
.sorted()
109111
.whereType<Directory>()
110112
.where((d) => d.isDynamicRoute)
111113
.forEach((dynamicDirectory) {
@@ -136,7 +138,7 @@ List<RouteFile> _getRouteFiles(
136138
final directoryPath = directorySegment.startsWith('/')
137139
? directorySegment
138140
: '/$directorySegment';
139-
final entities = directory.listSync();
141+
final entities = directory.listSync().sorted();
140142
entities.where((e) => e.isRoute).cast<File>().forEach((entity) {
141143
final filePath =
142144
path.join('..', path.relative(entity.path)).replaceAll(r'\', '/');
@@ -177,6 +179,12 @@ extension on String {
177179
}
178180
}
179181

182+
extension on List<FileSystemEntity> {
183+
List<FileSystemEntity> sorted() {
184+
return this..sort((a, b) => b.path.compareTo(a.path));
185+
}
186+
}
187+
180188
extension on Directory {
181189
bool get isDynamicRoute {
182190
return RegExp(r'\[(.*)\]').hasMatch(path.basename(this.path));
@@ -202,8 +210,12 @@ class RouteConfiguration {
202210
required this.middleware,
203211
required this.directories,
204212
required this.routes,
213+
this.serveStaticFiles = false,
205214
});
206215

216+
/// Whether to serve static files. Defaults to false.
217+
final bool serveStaticFiles;
218+
207219
/// Optional global middleware.
208220
final MiddlewareFile? globalMiddleware;
209221

packages/dart_frog_gen/test/src/build_route_configuration_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,21 @@ void main() {
2525
expect(configuration.globalMiddleware, isNull);
2626
});
2727

28+
test('serveStaticFiles is true when public directory exists', () {
29+
final directory = Directory.systemTemp.createTempSync();
30+
Directory(path.join(directory.path, 'routes')).createSync();
31+
Directory(path.join(directory.path, 'public')).createSync();
32+
final configuration = buildRouteConfiguration(directory);
33+
expect(configuration.serveStaticFiles, isTrue);
34+
});
35+
36+
test('serveStaticFiles is false when public directory does not exist', () {
37+
final directory = Directory.systemTemp.createTempSync();
38+
Directory(path.join(directory.path, 'routes')).createSync();
39+
final configuration = buildRouteConfiguration(directory);
40+
expect(configuration.serveStaticFiles, isFalse);
41+
});
42+
2843
test('includes global middleware when it exists', () {
2944
final directory = Directory.systemTemp.createTempSync();
3045
final routes = Directory(path.join(directory.path, 'routes'))

0 commit comments

Comments
 (0)