forked from felangel/mason
/
pre_gen.dart
98 lines (86 loc) · 2.87 KB
/
pre_gen.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import 'dart:async';
import 'dart:io' as io;
import 'package:dart_frog_gen/dart_frog_gen.dart';
import 'package:mason/mason.dart'
show HookContext, defaultForeground, lightCyan;
import 'src/create_bundle.dart';
import 'src/exit_overrides.dart';
import 'src/get_path_dependencies.dart';
typedef RouteConfigurationBuilder = RouteConfiguration Function(
io.Directory directory,
);
void _defaultExit(int code) => ExitOverrides.current?.exit ?? io.exit;
Future<void> run(HookContext context) => 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;
await createBundle(context, projectDirectory, exit);
final RouteConfiguration configuration;
try {
configuration = buildConfiguration(projectDirectory);
} catch (error) {
context.logger.err('$error');
return exit(1);
}
reportRouteConflicts(
configuration,
onRouteConflict: (
originalFilePath,
conflictingFilePath,
conflictingEndpoint,
) {
context.logger.err(
'''Route conflict detected. ${lightCyan.wrap(originalFilePath)} and ${lightCyan.wrap(conflictingFilePath)} both resolve to ${lightCyan.wrap(conflictingEndpoint)}.''',
);
},
onViolationEnd: () {
exit(1);
},
);
reportRogueRoutes(
configuration,
onRogueRoute: (filePath, idealPath) {
context.logger.err(
'''Rogue route detected.${defaultForeground.wrap(' ')}Rename ${lightCyan.wrap(filePath)} to ${lightCyan.wrap(idealPath)}.''',
);
},
onViolationEnd: () {
exit(1);
},
);
await reportExternalPathDependencies(
projectDirectory,
onViolationStart: () {
context.logger
..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');
},
onViolationEnd: () {
exit(1);
},
);
context.vars = {
'directories': configuration.directories
.map((c) => c.toJson())
.toList()
.reversed
.toList(),
'routes': configuration.routes.map((r) => r.toJson()).toList(),
'middleware': configuration.middleware.map((m) => m.toJson()).toList(),
'globalMiddleware': configuration.globalMiddleware != null
? configuration.globalMiddleware!.toJson()
: false,
'serveStaticFiles': configuration.serveStaticFiles,
'invokeCustomEntrypoint': configuration.invokeCustomEntrypoint,
'invokeCustomInit': configuration.invokeCustomInit,
'pathDependencies': await getPathDependencies(projectDirectory),
'dartVersion': context.vars['dartVersion'],
};
}