Skip to content

Commit 50d6bcd

Browse files
authored
refactor(dart_frog_cli): move runtime compatibility check to dev server runner (#1138)
1 parent 0a16bbe commit 50d6bcd

File tree

4 files changed

+50
-46
lines changed

4 files changed

+50
-46
lines changed

packages/dart_frog_cli/lib/src/commands/dev/dev.dart

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import 'package:dart_frog_cli/src/command.dart';
55
import 'package:dart_frog_cli/src/commands/commands.dart';
66
import 'package:dart_frog_cli/src/commands/dev/templates/dart_frog_dev_server_bundle.dart';
77
import 'package:dart_frog_cli/src/dev_server_runner/dev_server_runner.dart';
8-
import 'package:dart_frog_cli/src/runtime_compatibility.dart'
9-
as runtime_compatibility;
108
import 'package:mason/mason.dart';
119

1210
/// {@template dev_command}
@@ -18,11 +16,7 @@ class DevCommand extends DartFrogCommand {
1816
super.logger,
1917
GeneratorBuilder? generator,
2018
DevServerRunnerBuilder? devServerRunnerBuilder,
21-
runtime_compatibility.RuntimeCompatibilityCallback?
22-
ensureRuntimeCompatibility,
23-
}) : _ensureRuntimeCompatibility = ensureRuntimeCompatibility ??
24-
runtime_compatibility.ensureRuntimeCompatibility,
25-
_generator = generator ?? MasonGenerator.fromBundle,
19+
}) : _generator = generator ?? MasonGenerator.fromBundle,
2620
_devServerRunnerBuilder =
2721
devServerRunnerBuilder ?? DevServerRunner.new {
2822
argParser
@@ -50,9 +44,6 @@ class DevCommand extends DartFrogCommand {
5044

5145
final GeneratorBuilder _generator;
5246
final DevServerRunnerBuilder _devServerRunnerBuilder;
53-
final runtime_compatibility.RuntimeCompatibilityCallback
54-
_ensureRuntimeCompatibility;
55-
5647
@override
5748
final String description = 'Run a local development server.';
5849

@@ -109,8 +100,6 @@ class DevCommand extends DartFrogCommand {
109100

110101
@override
111102
Future<int> run() async {
112-
_ensureRuntimeCompatibility(cwd);
113-
114103
final port = io.Platform.environment['PORT'] ?? results['port'] as String;
115104

116105
final dartVmServicePort = (results['dart-vm-service-port'] as String?) ??

packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:convert';
33
import 'dart:io' as io;
44

55
import 'package:dart_frog_cli/src/dev_server_runner/restorable_directory_generator_target.dart';
6+
import 'package:dart_frog_cli/src/runtime_compatibility.dart';
67
import 'package:mason/mason.dart';
78
import 'package:meta/meta.dart';
89
import 'package:path/path.dart' as path;
@@ -78,13 +79,17 @@ class DevServerRunner {
7879
@visibleForTesting io.ProcessSignal? sigint,
7980
@visibleForTesting ProcessStart? startProcess,
8081
@visibleForTesting ProcessRun? runProcess,
82+
@visibleForTesting
83+
RuntimeCompatibilityCallback? runtimeCompatibilityCallback,
8184
}) : _directoryWatcher = directoryWatcher ?? DirectoryWatcher.new,
8285
_isWindows = isWindows ?? io.Platform.isWindows,
8386
_sigint = sigint ?? io.ProcessSignal.sigint,
8487
_startProcess = startProcess ?? io.Process.start,
8588
_runProcess = runProcess ?? io.Process.run,
8689
_generatorTarget =
8790
generatorTarget ?? RestorableDirectoryGeneratorTarget.new,
91+
_ensureRuntimeCompatibility =
92+
runtimeCompatibilityCallback ?? ensureRuntimeCompatibility,
8893
assert(port.isNotEmpty, 'port cannot be empty'),
8994
assert(
9095
dartVmServicePort.isNotEmpty,
@@ -121,6 +126,7 @@ class DevServerRunner {
121126
final RestorableDirectoryGeneratorTargetBuilder _generatorTarget;
122127
final bool _isWindows;
123128
final io.ProcessSignal _sigint;
129+
final RuntimeCompatibilityCallback _ensureRuntimeCompatibility;
124130

125131
late final _generatedDirectory = io.Directory(
126132
path.join(workingDirectory.path, '.dart_frog'),
@@ -241,6 +247,8 @@ class DevServerRunner {
241247
);
242248
}
243249

250+
_ensureRuntimeCompatibility(workingDirectory);
251+
244252
Future<void> serve() async {
245253
var isHotReloadingEnabled = false;
246254
final enableVmServiceFlag = '--enable-vm-service=$dartVmServicePort';

packages/dart_frog_cli/test/src/commands/dev/dev_test.dart

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'dart:io';
44
import 'package:args/args.dart';
55
import 'package:dart_frog_cli/src/commands/commands.dart';
66
import 'package:dart_frog_cli/src/dev_server_runner/dev_server_runner.dart';
7-
import 'package:dart_frog_cli/src/runtime_compatibility.dart';
87
import 'package:mason/mason.dart';
98
import 'package:mocktail/mocktail.dart';
109
import 'package:test/test.dart';
@@ -45,34 +44,6 @@ void main() {
4544
expect(command, isNotNull);
4645
});
4746

48-
test('throws if ensureRuntimeCompatibility fails', () {
49-
final command = DevCommand(
50-
generator: (_) async => generator,
51-
ensureRuntimeCompatibility: (_) {
52-
throw const DartFrogCompatibilityException('oops');
53-
},
54-
devServerRunnerBuilder: ({
55-
required logger,
56-
required port,
57-
required address,
58-
required devServerBundleGenerator,
59-
required dartVmServicePort,
60-
required workingDirectory,
61-
void Function()? onHotReloadEnabled,
62-
}) {
63-
return runner;
64-
},
65-
logger: logger,
66-
)
67-
..testArgResults = argResults
68-
..testStdin = stdin;
69-
70-
expect(
71-
command.run(),
72-
throwsA(isA<DartFrogCompatibilityException>()),
73-
);
74-
});
75-
7647
test('run the dev server with the given parameters', () async {
7748
when(() => runner.start()).thenAnswer((_) => Future.value());
7849
when(() => runner.exitCode).thenAnswer(
@@ -94,7 +65,6 @@ void main() {
9465

9566
final command = DevCommand(
9667
generator: (_) async => generator,
97-
ensureRuntimeCompatibility: (_) {},
9868
devServerRunnerBuilder: ({
9969
required logger,
10070
required port,
@@ -133,7 +103,6 @@ void main() {
133103
test('results with dev server exit code', () async {
134104
final command = DevCommand(
135105
generator: (_) async => generator,
136-
ensureRuntimeCompatibility: (_) {},
137106
devServerRunnerBuilder: ({
138107
required logger,
139108
required port,
@@ -164,7 +133,6 @@ void main() {
164133
test('fails if dev server runner fails on start', () async {
165134
final command = DevCommand(
166135
generator: (_) async => generator,
167-
ensureRuntimeCompatibility: (_) {},
168136
devServerRunnerBuilder: ({
169137
required logger,
170138
required port,
@@ -203,7 +171,6 @@ void main() {
203171

204172
final command = DevCommand(
205173
generator: (_) async => generator,
206-
ensureRuntimeCompatibility: (_) {},
207174
devServerRunnerBuilder: ({
208175
required logger,
209176
required port,
@@ -275,7 +242,6 @@ void main() {
275242

276243
command = DevCommand(
277244
generator: (_) async => generator,
278-
ensureRuntimeCompatibility: (_) {},
279245
devServerRunnerBuilder: ({
280246
required logger,
281247
required port,

packages/dart_frog_cli/test/src/dev_server_runner/dev_server_runner_test.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io' hide exitCode;
44

55
import 'package:dart_frog_cli/src/dev_server_runner/dev_server_runner.dart';
66
import 'package:dart_frog_cli/src/dev_server_runner/restorable_directory_generator_target.dart';
7+
import 'package:dart_frog_cli/src/runtime_compatibility.dart';
78
import 'package:mason/mason.dart';
89
import 'package:mocktail/mocktail.dart';
910
import 'package:path/path.dart' as path;
@@ -83,6 +84,7 @@ void main() {
8384
startProcess: (_, __, {runInShell = false}) async => process,
8485
sigint: sigint,
8586
runProcess: (_, __) async => processResult,
87+
runtimeCompatibilityCallback: (_) {},
8688
);
8789

8890
when(() => process.stdout).thenAnswer((_) => const Stream.empty());
@@ -156,6 +158,37 @@ void main() {
156158
}).called(1);
157159
});
158160

161+
test('throws if ensureRuntimeCompatibility fails', () async {
162+
devServerRunner = DevServerRunner(
163+
logger: logger,
164+
port: port,
165+
address: null,
166+
devServerBundleGenerator: generator,
167+
dartVmServicePort: dartVmServicePort,
168+
workingDirectory: Directory.current,
169+
directoryWatcher: (_) => directoryWatcher,
170+
generatorTarget: (_, {createFile, logger}) => generatorTarget,
171+
isWindows: isWindows,
172+
startProcess: (_, __, {runInShell = false}) async => process,
173+
sigint: sigint,
174+
runProcess: (_, __) async => processResult,
175+
runtimeCompatibilityCallback: (_) {
176+
throw const DartFrogCompatibilityException('oops');
177+
},
178+
);
179+
180+
await expectLater(
181+
devServerRunner.start(),
182+
throwsA(
183+
isA<DartFrogCompatibilityException>().having(
184+
(e) => e.message,
185+
'message',
186+
'oops',
187+
),
188+
),
189+
);
190+
});
191+
159192
test('throws when server process is already running', () async {
160193
await expectLater(devServerRunner.start(), completes);
161194

@@ -211,6 +244,7 @@ void main() {
211244
},
212245
sigint: sigint,
213246
runProcess: (_, __) async => processResult,
247+
runtimeCompatibilityCallback: (_) => true,
214248
);
215249

216250
await expectLater(devServerRunner.start(), completes);
@@ -261,6 +295,7 @@ void main() {
261295
},
262296
sigint: sigint,
263297
runProcess: (_, __) async => processResult,
298+
runtimeCompatibilityCallback: (_) => true,
264299
);
265300

266301
await expectLater(devServerRunner.start(), completes);
@@ -318,6 +353,7 @@ void main() {
318353
processRunCalls.add([executable, ...arguments]);
319354
return processResult;
320355
},
356+
runtimeCompatibilityCallback: (_) => true,
321357
);
322358
await expectLater(devServerRunner.start(), completes);
323359

@@ -480,6 +516,7 @@ void main() {
480516
},
481517
sigint: sigint,
482518
runProcess: (_, __) async => processResult,
519+
runtimeCompatibilityCallback: (_) => true,
483520
);
484521
await expectLater(devServerRunner.start(), completes);
485522

@@ -802,6 +839,7 @@ runs codegen with debounce when changes are made to the public or routes directo
802839
processRunCalls.add([executable, ...arguments]);
803840
return processResult;
804841
},
842+
runtimeCompatibilityCallback: (_) => true,
805843
);
806844

807845
await expectLater(devServerRunner.start(), completes);
@@ -903,6 +941,7 @@ runs codegen with debounce when changes are made to the public or routes directo
903941
processRunCalls.add([executable, ...arguments]);
904942
return processResult;
905943
},
944+
runtimeCompatibilityCallback: (_) => true,
906945
);
907946

908947
await expectLater(devServerRunner.start(), completes);
@@ -940,6 +979,7 @@ lib/my_model.g.dart:53:20: Warning: Operand of null-aware operation '!' has type
940979
directoryWatcher: (_) => directoryWatcher,
941980
startProcess: (_, __, {runInShell = false}) async => process,
942981
sigint: sigint,
982+
runtimeCompatibilityCallback: (_) => true,
943983
);
944984

945985
await expectLater(devServerRunner.start(), completes);
@@ -986,6 +1026,7 @@ Could not start the VM service: localhost:8181 is already in use.''';
9861026
processRunCalls.add([executable, ...arguments]);
9871027
return processResult;
9881028
},
1029+
runtimeCompatibilityCallback: (_) => true,
9891030
);
9901031

9911032
await expectLater(devServerRunner.start(), completes);

0 commit comments

Comments
 (0)