Skip to content

Commit 55b1038

Browse files
committed
Migrate to null safety
1 parent 18a6988 commit 55b1038

16 files changed

+63
-70
lines changed

analysis_options.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
include: package:pedantic/analysis_options.yaml
1+
include: package:lints/recommended.yaml

lib/src/command_runner.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
14+
import 'dart:async';
1515
import 'package:args/args.dart';
1616
import 'package:args/command_runner.dart';
1717
import 'package:logging/logging.dart';
@@ -33,11 +33,11 @@ class WebdevProxy extends CommandRunner<int> {
3333
@override
3434
Future<int> run(Iterable<String> args) async {
3535
// The help command returns null, so return success code in that case.
36-
return await super.run(args) ?? 0;
36+
return (await super.run(args)) ?? 0;
3737
}
3838

3939
@override
40-
Future<int> runCommand(ArgResults topLevelResults) async {
40+
Future<int?> runCommand(ArgResults topLevelResults) async {
4141
final verbose = topLevelResults[verboseFlag] == true;
4242
Logger.root.level = verbose ? Level.ALL : Level.INFO;
4343
Logger.root.onRecord.listen(stdIOLogListener(verbose: verbose));

lib/src/logging.dart

+6-7
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ const _logSuffix = '\n';
2828

2929
final Logger log = Logger('Proxy');
3030

31-
StringBuffer colorLog(LogRecord record, {bool verbose}) {
32-
verbose ??= false;
31+
StringBuffer colorLog(LogRecord record, {bool verbose = false}) {
3332

3433
AnsiCode color;
3534
if (record.level < Level.WARNING) {
@@ -44,13 +43,13 @@ StringBuffer colorLog(LogRecord record, {bool verbose}) {
4443
final lines = <Object>[
4544
'$eraseLine$level ${_loggerName(record, verbose)}${record.message}'
4645
];
47-
48-
if (record.error != null) {
49-
lines.add(record.error);
46+
var error = record.error;
47+
if (error != null) {
48+
lines.add(error);
5049
}
5150

5251
if (record.stackTrace != null && verbose) {
53-
final trace = Trace.from(record.stackTrace).terse;
52+
final trace = Trace.from(record.stackTrace!).terse;
5453
lines.add(trace);
5554
}
5655

@@ -130,7 +129,7 @@ T logTimedSync<T>(
130129
return result;
131130
}
132131

133-
Function(LogRecord) stdIOLogListener({bool verbose}) =>
132+
Function(LogRecord) stdIOLogListener({bool verbose = false}) =>
134133
(record) => io.stdout.write(colorLog(record, verbose: verbose));
135134

136135
String _loggerName(LogRecord record, bool verbose) {

lib/src/serve_command.dart

+11-12
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import 'dart:io';
1818
import 'package:args/command_runner.dart';
1919
import 'package:io/ansi.dart';
2020
import 'package:io/io.dart';
21-
import 'package:pedantic/pedantic.dart';
2221

2322
import 'package:webdev_proxy/src/command_runner.dart';
2423
import 'package:webdev_proxy/src/command_utils.dart';
@@ -52,15 +51,15 @@ class ServeCommand extends Command<int> {
5251
'[-- [webdev serve arguments]]';
5352

5453
@override
55-
String get usageFooter => _webdevCompatibilityHelp;
54+
String? get usageFooter => _webdevCompatibilityHelp;
5655

5756
@override
5857
String get name => 'serve';
5958

6059
bool get _canUseWebdev => !_missingWebdev && _hasCompatibleWebdev;
6160

6261
bool get _hasCompatibleWebdev =>
63-
webdevCompatibility.allows(getGlobalWebdevVersion());
62+
webdevCompatibility.allows(getGlobalWebdevVersion()!);
6463

6564
bool get _missingWebdev => getGlobalWebdevVersion() == null;
6665

@@ -78,7 +77,7 @@ class ServeCommand extends Command<int> {
7877
}
7978
}
8079

81-
String get _webdevCompatibilityHelp {
80+
String? get _webdevCompatibilityHelp {
8281
if (_missingWebdev) {
8382
return red.wrap(
8483
'This command requires that `webdev` be activated globally.\n'
@@ -109,19 +108,19 @@ class ServeCommand extends Command<int> {
109108
//
110109
// To enforce this, we validate that [argResults.rest] is exactly equal to
111110
// all the arguments after the `--`.
112-
assertNoPositionalArgsBeforeSeparator(name, argResults, usageException);
111+
assertNoPositionalArgsBeforeSeparator(name, argResults!, usageException);
113112

114113
final exitCodeCompleter = Completer<int>();
115114
var interruptReceived = false;
116115
final proxies = <WebdevProxyServer>[];
117116
var proxiesFailed = false;
118-
StreamSubscription sigintSub;
119-
WebdevServer webdevServer;
117+
StreamSubscription? sigintSub;
118+
WebdevServer? webdevServer;
120119

121120
void shutDown(int code) async {
122121
await Future.wait([
123-
sigintSub?.cancel(),
124-
webdevServer?.close(),
122+
if (sigintSub != null) sigintSub.cancel(),
123+
if (webdevServer != null) webdevServer.close(),
125124
...proxies.map((proxy) => proxy.close()),
126125
]);
127126
if (!exitCodeCompleter.isCompleted) {
@@ -137,13 +136,13 @@ class ServeCommand extends Command<int> {
137136
});
138137

139138
// Parse the hostname to serve each dir on (defaults to 0.0.0.0)
140-
final hostnameResults = parseHostname(argResults.rest);
139+
final hostnameResults = parseHostname(argResults!.rest);
141140
final hostname = hostnameResults.hostname;
142141
final remainingArgs = hostnameResults.remainingArgs;
143142

144143
// Parse the directory:port mappings that will be used by the proxy servers.
145144
// Each proxy will be mapped to a `webdev serve` instance on another port.
146-
final portsToServeByDir = parseDirectoryArgs(argResults.rest);
145+
final portsToServeByDir = parseDirectoryArgs(argResults!.rest);
147146

148147
// Find open ports for each of the directories to be served by webdev.
149148
final portsToProxyByDir = {
@@ -174,7 +173,7 @@ class ServeCommand extends Command<int> {
174173
hostname: hostname,
175174
portToProxy: portsToProxyByDir[dir],
176175
portToServe: portsToServeByDir[dir],
177-
rewrite404s: argResults[rewrite404sFlag] == true,
176+
rewrite404s: argResults![rewrite404sFlag] == true,
178177
));
179178
} catch (e, stackTrace) {
180179
proxiesFailed = true;

lib/src/sse_proxy_handler.dart

+7-7
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ String _sseHeaders(String origin) => 'HTTP/1.1 200 OK\r\n'
3434
/// simply forwards data back and forth between clients and the actual server.
3535
class SseProxyHandler {
3636
final _httpClient = http.Client();
37-
shelf.Handler _incomingMessageProxyHandler;
38-
final String _proxyName;
37+
shelf.Handler? _incomingMessageProxyHandler;
38+
final String? _proxyName;
3939
final Uri _proxyUri;
4040
final Uri _serverUri;
4141

4242
/// Creates an SSE proxy handler that will handle EventSource requests to
4343
/// [proxyUri] by proxying them to [serverUri].
44-
SseProxyHandler(Uri proxyUri, Uri serverUri, {String proxyName})
44+
SseProxyHandler(Uri proxyUri, Uri serverUri, {String? proxyName})
4545
: _proxyUri = proxyUri,
4646
_serverUri = serverUri,
4747
_proxyName = proxyName;
@@ -61,10 +61,10 @@ class SseProxyHandler {
6161

6262
req.hijack((channel) {
6363
final sink = utf8.encoder.startChunkedConversion(channel.sink)
64-
..add(_sseHeaders(req.headers['origin']));
64+
..add(_sseHeaders(req.headers['origin']!));
6565

6666
StreamSubscription serverSseSub;
67-
StreamSubscription reqChannelSub;
67+
StreamSubscription? reqChannelSub;
6868

6969
serverSseSub =
7070
utf8.decoder.bind(serverResponse.stream).listen(sink.add, onDone: () {
@@ -75,7 +75,7 @@ class SseProxyHandler {
7575
reqChannelSub = channel.stream.listen((_) {
7676
// SSE is unidirectional.
7777
}, onDone: () {
78-
serverSseSub?.cancel();
78+
serverSseSub.cancel();
7979
sink.close();
8080
});
8181
});
@@ -105,6 +105,6 @@ class SseProxyHandler {
105105
client: _httpClient,
106106
proxyName: _proxyName,
107107
);
108-
return _incomingMessageProxyHandler(req);
108+
return _incomingMessageProxyHandler!(req);
109109
}
110110
}

lib/src/webdev_proc_utils.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@ import 'package:pub_semver/pub_semver.dart';
2424
final webdevCompatibility = VersionConstraint.parse('>=1.0.1 <3.0.0');
2525

2626
@visibleForTesting
27-
ProcessResult cachedWebdevVersionResult;
27+
ProcessResult? cachedWebdevVersionResult;
2828

2929
/// Returns the version of the `webdev` package that is currently globally
3030
/// activated, or `null` if it is not activated.
31-
Version getGlobalWebdevVersion() {
31+
Version? getGlobalWebdevVersion() {
3232
cachedWebdevVersionResult ??= Process.runSync(
3333
'dart',
3434
['pub', 'global', 'run', 'webdev', '--version'],
3535
stdoutEncoding: utf8,
3636
);
37-
if (cachedWebdevVersionResult.exitCode != 0) {
37+
if (cachedWebdevVersionResult!.exitCode != 0) {
3838
return null;
3939
}
40-
return Version.parse(cachedWebdevVersionResult.stdout.toString().trim());
40+
return Version.parse(cachedWebdevVersionResult!.stdout.toString().trim());
4141
}
4242

4343
/// Prints the output from `webdev help serve` with a header that explains how

lib/src/webdev_proxy_server.dart

+7-12
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import 'dart:io';
1616

1717
import 'package:http_multi_server/http_multi_server.dart';
1818
import 'package:io/ansi.dart';
19-
import 'package:meta/meta.dart';
2019
import 'package:shelf/shelf.dart' as shelf;
2120
import 'package:shelf/shelf_io.dart' as shelf_io;
2221
import 'package:shelf_proxy/shelf_proxy.dart' as shelf_proxy;
@@ -37,7 +36,7 @@ class WebdevProxyServer {
3736

3837
/// Permanently stops this proxy server from listening for new connections and
3938
/// closes all active connections immediately.
40-
Future<Null> close() async {
39+
Future<void> close() async {
4140
await _server.close(force: true);
4241
}
4342

@@ -51,14 +50,12 @@ class WebdevProxyServer {
5150
/// request that fetches the root index path (`/`) unless [rewrite404s] is
5251
/// false.
5352
static Future<WebdevProxyServer> start({
54-
@required String dir,
55-
@required String hostname,
56-
@required int portToProxy,
57-
int portToServe,
58-
bool rewrite404s,
53+
required String dir,
54+
required String hostname,
55+
required int? portToProxy,
56+
int portToServe = 0,
57+
bool rewrite404s = true,
5958
}) async {
60-
portToServe ??= 0;
61-
rewrite404s ??= true;
6259

6360
final serverHostname = hostname == 'any' ? 'localhost' : hostname;
6461
final serverUri = Uri.parse('http://$serverHostname:$portToProxy');
@@ -77,9 +74,7 @@ class WebdevProxyServer {
7774
final server = await HttpMultiServer.bind(hostname, portToServe);
7875
shelf_io.serveRequests(server, cascade.handler);
7976
final proxyHostname = hostname == 'any' ? '::' : hostname;
80-
log.info(green.wrap('Serving `$dir` proxy on '
81-
'http://$proxyHostname:$portToServe') +
82-
'\n');
77+
log.info(green.wrap('Serving `$dir` proxy on http://$proxyHostname:$portToServe\n'));
8378
log.fine('... forwards to http://$serverHostname:$portToProxy');
8479
return WebdevProxyServer._(server);
8580
}

lib/src/webdev_server.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class WebdevServer {
3030

3131
/// Permanently stops this proxy server from listening for new connections and
3232
/// closes all active connections immediately.
33-
Future<Null> close() async {
33+
Future<void> close() async {
3434
_process.kill();
3535
await _process.exitCode;
3636
}

pubspec.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ description: >
88
routing by rewriting 404s to the root index.
99
1010
environment:
11-
sdk: ">=2.11.0 <3.0.0"
11+
sdk: '>=2.18.0 <3.0.0'
1212

1313
dependencies:
1414
args: ^2.3.1
@@ -18,7 +18,7 @@ dependencies:
1818
io: ^1.0.3
1919
logging: ^1.1.0
2020
meta: ^1.8.0
21-
pedantic: ^1.11.1
21+
lints: ^2.0.1
2222
pub_semver: ^2.1.2
2323
shelf: ^1.2.0
2424
shelf_proxy: ^1.0.0
@@ -27,7 +27,7 @@ dependencies:
2727
dev_dependencies:
2828
# These two build deps are required by webdev.
2929
build_runner: ^2.1.2
30-
build_web_compilers: ^3.0.0
30+
build_web_compilers: '>=3.0.0 <5.0.0'
3131

3232
shelf_static: ^1.1.0
3333
sse: ^4.1.0

test/command_utils_test.dart

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import 'package:webdev_proxy/src/command_utils.dart';
2121
void main() {
2222
group('assertNoPositionalArgsBeforeSeparator', () {
2323
final argParser = ArgParser()..addCommand('command');
24-
String capturedUsageException;
24+
String? capturedUsageException;
2525
void usageException(String msg) => capturedUsageException = msg;
2626

2727
tearDown(() {
@@ -32,22 +32,22 @@ void main() {
3232
test('if rest args are empty', () {
3333
final argResults = argParser.parse(['command']);
3434
assertNoPositionalArgsBeforeSeparator(
35-
'serve', argResults.command, usageException);
35+
'serve', argResults.command!, usageException);
3636
expect(capturedUsageException, isNull);
3737
});
3838

3939
test('if expected flag is parsed', () {
4040
argParser.addFlag('flag');
4141
final argResults = argParser.parse(['command', '--flag']);
4242
assertNoPositionalArgsBeforeSeparator(
43-
'serve', argResults.command, usageException);
43+
'serve', argResults.command!, usageException);
4444
expect(capturedUsageException, isNull);
4545
});
4646

4747
test('if args are only passed after -- separator', () {
4848
final argResults = argParser.parse(['command', '--', 'after']);
4949
assertNoPositionalArgsBeforeSeparator(
50-
'serve', argResults.command, usageException);
50+
'serve', argResults.command!, usageException);
5151
expect(capturedUsageException, isNull);
5252
});
5353
});
@@ -56,15 +56,15 @@ void main() {
5656
test('-- separator is missing before webdev args', () {
5757
final argResults = argParser.parse(['command', 'foo']);
5858
assertNoPositionalArgsBeforeSeparator(
59-
'serve', argResults.command, usageException);
59+
'serve', argResults.command!, usageException);
6060
expect(capturedUsageException, isNotNull);
6161
});
6262

6363
test('positional args exist before -- separator', () {
6464
final argResults =
6565
argParser.parse(['command', 'before', '--', 'after']);
6666
assertNoPositionalArgsBeforeSeparator(
67-
'serve', argResults.command, usageException);
67+
'serve', argResults.command!, usageException);
6868
expect(capturedUsageException, isNotNull);
6969
});
7070
});

test/port_utils_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void main() {
2323
group('findUnusedPort()', () {
2424
test('should return an open port', () async {
2525
final port = await findUnusedPort();
26-
ServerSocket socket;
26+
late ServerSocket socket;
2727
try {
2828
socket = await ServerSocket.bind('localhost', port);
2929
} catch (e) {

test/proxy_server_test.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ import 'package:webdev_proxy/src/webdev_proxy_server.dart';
2828
import 'chromedriver_utils.dart';
2929

3030
void main() {
31-
WebdevProxyServer proxy;
32-
HttpServer server;
33-
SseHandler serverSse;
31+
late WebdevProxyServer proxy;
32+
late HttpServer server;
33+
late SseHandler serverSse;
3434

3535
setUpAll(() async {
3636
await startChromeDriver();

test/sse_proxy_handler_test.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import 'package:webdev_proxy/src/sse_proxy_handler.dart';
1515
import 'chromedriver_utils.dart';
1616

1717
void main() {
18-
HttpServer proxy;
19-
HttpServer server;
20-
SseHandler serverSse;
21-
WebDriver webdriver;
18+
late HttpServer proxy;
19+
late HttpServer server;
20+
late SseHandler serverSse;
21+
late WebDriver webdriver;
2222

2323
setUpAll(() async {
2424
await startChromeDriver();

0 commit comments

Comments
 (0)