Wire dart2js through flutter tool, add compilation test (#27668)
diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart
new file mode 100644
index 0000000..4dab748
--- /dev/null
+++ b/packages/flutter_tools/lib/src/web/compile.dart
@@ -0,0 +1,70 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:meta/meta.dart';
+
+import '../artifacts.dart';
+import '../base/common.dart';
+import '../base/context.dart';
+import '../base/file_system.dart';
+import '../base/io.dart';
+import '../base/process_manager.dart';
+import '../build_info.dart';
+import '../convert.dart';
+import '../globals.dart';
+
+/// The [WebCompiler] instance.
+WebCompiler get webCompiler => context[WebCompiler];
+
+/// A wrapper around dart2js for web compilation.
+class WebCompiler {
+ const WebCompiler();
+
+ /// Compile `target` using dart2js.
+ ///
+ /// `minify` controls whether minifaction of the source is enabled. Defaults to `true`.
+ /// `enabledAssertions` controls whether assertions are enabled. Defaults to `false`.
+ Future<int> compile({@required String target, bool minify = true, bool enabledAssertions = false}) async {
+ final String engineDartPath = artifacts.getArtifactPath(Artifact.engineDartBinary);
+ final String dart2jsPath = artifacts.getArtifactPath(Artifact.dart2jsSnapshot);
+ final String flutterPatchedSdkPath = artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath);
+ final String librariesPath = fs.path.join(flutterPatchedSdkPath, 'libraries.json');
+ final Directory outputDir = fs.directory(getWebBuildDirectory());
+ if (!outputDir.existsSync()) {
+ outputDir.createSync(recursive: true);
+ }
+ final String outputPath = fs.path.join(outputDir.path, 'main.dart.js');
+ if (!processManager.canRun(engineDartPath)) {
+ throwToolExit('Unable to find Dart binary at $engineDartPath');
+ }
+ final List<String> command = <String>[
+ engineDartPath,
+ dart2jsPath,
+ target,
+ '-o',
+ '$outputPath',
+ '--libraries-spec=$librariesPath',
+ '--platform-binaries=$flutterPatchedSdkPath',
+ ];
+ if (minify) {
+ command.add('-m');
+ }
+ if (enabledAssertions) {
+ command.add('--enable-asserts');
+ }
+ printTrace(command.join(' '));
+ final Process result = await processManager.start(command);
+ result
+ .stdout
+ .transform(utf8.decoder)
+ .transform(const LineSplitter())
+ .listen(printStatus);
+ result
+ .stderr
+ .transform(utf8.decoder)
+ .transform(const LineSplitter())
+ .listen(printError);
+ return result.exitCode;
+ }
+}