Skip to content

Commit

Permalink
Merge branch 'main' into renan/dart_frog_new_brick
Browse files Browse the repository at this point in the history
  • Loading branch information
renancaraujo committed May 2, 2023
2 parents 41c7c31 + 9556037 commit b2af796
Show file tree
Hide file tree
Showing 22 changed files with 476 additions and 1,101 deletions.
50 changes: 43 additions & 7 deletions bricks/dart_frog_dev_server/hooks/pre_gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ import 'dart:async';
import 'dart:io' as io;

import 'package:dart_frog_gen/dart_frog_gen.dart';
import 'package:mason/mason.dart' show HookContext;
import 'package:mason/mason.dart'
show HookContext, defaultForeground, lightCyan;

import 'src/exit_overrides.dart';
import 'src/report_external_path_dependencies.dart';
import 'src/report_rogue_routes.dart';
import 'src/report_route_conflicts.dart';

typedef RouteConfigurationBuilder = RouteConfiguration Function(
io.Directory directory,
Expand All @@ -19,9 +17,12 @@ Future<void> run(HookContext context) async => preGen(context);

Future<void> preGen(
HookContext context, {
io.Directory? directory,
RouteConfigurationBuilder buildConfiguration = buildRouteConfiguration,
void Function(int exitCode) exit = _defaultExit,
}) async {
final projectDirectory = directory ?? io.Directory.current;

final RouteConfiguration configuration;
try {
configuration = buildConfiguration(io.Directory.current);
Expand All @@ -30,9 +31,44 @@ Future<void> preGen(
return exit(1);
}

reportRouteConflicts(context, configuration);
reportRogueRoutes(context, configuration);
await reportExternalPathDependencies(context, io.Directory.current);
reportRouteConflicts(
configuration,
onViolationStart: () {
context.logger.info('');
},
onRouteConflict: (
originalFilePath,
conflictingFilePath,
conflictingEndpoint,
) {
context.logger.err(
'''Route conflict detected. ${lightCyan.wrap(originalFilePath)} and ${lightCyan.wrap(conflictingFilePath)} both resolve to ${lightCyan.wrap(conflictingEndpoint)}.''',
);
},
);
reportRogueRoutes(
configuration,
onViolationStart: () {
context.logger.info('');
},
onRogueRoute: (filePath, idealPath) {
context.logger.err(
'''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap(filePath)} to ${lightCyan.wrap(idealPath)}.''',
);
},
);
await reportExternalPathDependencies(
projectDirectory,
onViolationStart: () {
context.logger
..info('')
..err('All path dependencies must be within the project.')
..err('External path dependencies detected:');
},
onExternalPathDependency: (dependencyName, dependencyPath) {
context.logger.err(' \u{2022} $dependencyName from $dependencyPath');
},
);

context.vars = {
'port': context.vars['port'] ?? '8080',
Expand Down
2 changes: 1 addition & 1 deletion bricks/dart_frog_dev_server/hooks/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ environment:
sdk: ">=2.19.0 <3.0.0"

dependencies:
dart_frog_gen: ^0.3.2
dart_frog_gen: ^0.3.3
mason: ^0.1.0-dev.39
pubspec_parse: ^1.2.0

Expand Down

This file was deleted.

24 changes: 0 additions & 24 deletions bricks/dart_frog_dev_server/hooks/src/report_rogue_routes.dart

This file was deleted.

25 changes: 0 additions & 25 deletions bricks/dart_frog_dev_server/hooks/src/report_route_conflicts.dart

This file was deleted.

128 changes: 128 additions & 0 deletions bricks/dart_frog_dev_server/hooks/test/pre_gen_test.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import 'dart:io';

import 'package:dart_frog_gen/dart_frog_gen.dart';
import 'package:mason/mason.dart';
import 'package:mocktail/mocktail.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

import '../pre_gen.dart';
Expand Down Expand Up @@ -57,6 +60,131 @@ void main() {
verify(() => logger.err(exception.toString())).called(1);
});

test('complains about route conflicts', () async {
const configuration = RouteConfiguration(
middleware: [],
directories: [],
routes: [],
rogueRoutes: [],
endpoints: {
'/': [
RouteFile(
name: 'index',
path: 'index.dart',
route: '/',
params: [],
),
],
'/hello': [
RouteFile(
name: 'hello',
path: 'hello.dart',
route: '/hello',
params: [],
),
RouteFile(
name: 'hello_index',
path: 'hello/index.dart',
route: '/',
params: [],
)
]
},
);

final exitCalls = <int>[];
await preGen(
context,
buildConfiguration: (_) => configuration,
exit: exitCalls.add,
);

verify(
() => logger.err(
'''Route conflict detected. ${lightCyan.wrap('routes/hello.dart')} and ${lightCyan.wrap('routes/hello/index.dart')} both resolve to ${lightCyan.wrap('/hello')}.''',
),
);
expect(exitCalls, isEmpty);
});

test('complains about rogue routes', () async {
const configuration = RouteConfiguration(
middleware: [],
directories: [],
routes: [],
rogueRoutes: [
RouteFile(
name: 'hello',
path: 'hello.dart',
route: '/hello',
params: [],
),
],
endpoints: {},
);

final exitCalls = <int>[];
await preGen(
context,
buildConfiguration: (_) => configuration,
exit: exitCalls.add,
);

verify(
() => logger.err(
'''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap('routes/hello.dart')} to ${lightCyan.wrap('routes/hello/index.dart')}.''',
),
);
expect(exitCalls, isEmpty);
});

test('complains about r external dependencies', () async {
const configuration = RouteConfiguration(
middleware: [],
directories: [],
routes: [],
rogueRoutes: [],
endpoints: {},
);

final directory = Directory.systemTemp.createTempSync();
File(path.join(directory.path, 'pubspec.yaml')).writeAsStringSync(
'''
name: example
version: 0.1.0
environment:
sdk: ^2.17.0
dependencies:
mason: any
foo:
path: ../../foo
dev_dependencies:
test: any
''',
);

final exitCalls = <int>[];
await preGen(
context,
buildConfiguration: (_) => configuration,
exit: exitCalls.add,
directory: directory,
);

verify(
() => logger.err('All path dependencies must be within the project.'),
).called(1);
verify(
() => logger.err('External path dependencies detected:'),
).called(1);
verify(
() => logger.err(' \u{2022} foo from ../../foo'),
).called(1);
expect(exitCalls, isEmpty);

directory.delete(recursive: true).ignore();
});

test('retains custom port if specified', () async {
const customPort = '8081';
context.vars['port'] = customPort;
Expand Down
Loading

0 comments on commit b2af796

Please sign in to comment.